(core) updates from grist-core

pull/798/head
Paul Fitzpatrick 5 months ago
commit 2f0dbb7d25

@ -1,13 +1,17 @@
# Grist
Grist is a modern relational spreadsheet. It combines the flexibility of a spreadsheet with the robustness of a database to organize your data and make you more productive.
Grist is a modern relational spreadsheet. It combines the flexibility of a spreadsheet with the robustness of a database.
This repository, `grist-core`, is the heart of Grist, and has what you need to run a powerful spreadsheet hosting server. If you wish to view and edit spreadsheets stored locally, another option is to use the [`grist-electron`](https://github.com/gristlabs/grist-electron) desktop app for Linux, Mac, and Windows. And to show Grist spreadsheets on a website without any special back-end support, you can use [`grist-static`](https://github.com/gristlabs/grist-static), a fully in-browser build of Grist.
* `grist-core` (this repo) has what you need to run a powerful spreadsheet hosting server.
* [`grist-electron`](https://github.com/gristlabs/grist-electron) is a Linux/macOS/Windows desktop app for viewing and editing spreadsheets stored locally.
* [`grist-static`](https://github.com/gristlabs/grist-static) is a fully in-browser build of Grist for displaying spreadsheets on a website without back-end support.
The `grist-core` repository is the basis for all these options, and for the hosted spreadsheet services offered by [Grist Labs](https://getgrist.com), an NYC-based company 🇺🇸 that is the main developer of Grist, and by [ANCT Données et Territoires](https://donnees.incubateur.anct.gouv.fr/toolbox/grist), a French government agency 🇫🇷 whose developers have made many contributions to the codebase.
The `grist-core` repo is the heart of Grist, including the hosted services offered by [Grist Labs](https://getgrist.com), an NYC-based company 🇺🇸 and Grist's main developer. The French government agency [ANCT Données et Territoires](https://donnees.incubateur.anct.gouv.fr/toolbox/grist) 🇫🇷 has also made significant contributions to the codebase.
The `grist-core`, `grist-electron`, and `grist-static` repositories are all open source (Apache License, Version 2.0).
> Questions? Feedback? Want to share what you're building with Grist? Join our [official Discord server](https://discord.gg/MYKpYQ3fbP) or visit our [Community forum](https://community.getgrist.com/).
https://user-images.githubusercontent.com/118367/151245587-892e50a6-41f5-4b74-9786-fe3566f6b1fb.mp4
## Features
@ -17,7 +21,7 @@ Grist is a hybrid database/spreadsheet, meaning that:
- Columns work like they do in databases: they are named, and they hold one kind of data.
- Columns can be filled by formula, spreadsheet-style, with automatic updates when referenced cells change.
This difference can confuse people coming directly from Excel or Google Sheets. Give it a chance! If you are coming from Airtable, you'll find the model familiar though (and there's a [Grist vs Airtable](https://www.getgrist.com/blog/grist-v-airtable/) article that might interest you).
This difference can confuse people coming directly from Excel or Google Sheets. Give it a chance! There's also a [Grist for Spreadsheet Users](https://www.getgrist.com/blog/grist-for-spreadsheet-users/) article to help get you oriented. If you're coming from Airtable, you'll find the model familiar (and there's also our [Grist vs Airtable](https://www.getgrist.com/blog/grist-v-airtable/) article for a direct comparison).
Here are some specific feature highlights of Grist:
@ -39,7 +43,7 @@ Here are some specific feature highlights of Grist:
- Dates and times, toggles, and special numerics such as currency all have specialized editors and formatting options.
- [Conditional Formatting](https://support.getgrist.com/conditional-formatting/), letting you control the style of cells with formulas to draw attention to important information.
* Drag-and-drop dashboards.
- [Charts](https://support.getgrist.com/widget-chart/) for visualization.
- [Charts](https://support.getgrist.com/widget-chart/), [card views](https://support.getgrist.com/widget-card/) and a [calendar widget](https://support.getgrist.com/widget-calendar/) for visualization.
- [Summary tables](https://support.getgrist.com/summary-tables/) for summing and counting across groups.
- [Widget linking](https://support.getgrist.com/linking-widgets/) streamlines filtering and editing data.
Grist has a unique approach to visualization, where you can lay out and link distinct widgets to show together,
@ -170,20 +174,13 @@ did the hard work of making a good chunk of the application localizable. Merci b
## Why free and open source software
This repository, [grist-core](https://github.com/gristlabs/grist-core), is maintained by Grist
Labs. Our flagship product available at [getgrist.com](https://www.getgrist.com) is built from the code you see
here, combined with business-specific software designed to scale to many users, handle billing,
etc.
This repository, `grist-core`, is maintained by Grist Labs. Our flagship product available at [getgrist.com](https://www.getgrist.com) is built from the code you see here, combined with business-specific software designed to scale to many users, handle billing, etc.
Grist Labs is an open-core company. We offer Grist hosting as a
service, with free and paid plans. We also develop and sell
features related to Grist using a proprietary license, targeted at the
needs of enterprises with large self-managed installations.
Grist Labs is an open-core company. We offer Grist hosting as a service, with free and paid plans. We also develop and sell features related to Grist using a proprietary license, targeted at the needs of enterprises with large self-managed installations.
We see data portability and autonomy as a key value, and `grist-core` is an essential part of that. We are committed to maintaining and improving the `grist-core` codebase, and to be thoughtful about how proprietary offerings impact data portability and autonomy.
By opening its source code and offering an [OSI](https://opensource.org/)-approved free license,
Grist benefits its users:
By opening its source code and offering an [OSI](https://opensource.org/)-approved free license, Grist benefits its users:
- **Developer community.** The freedom to examine source code, make bug fixes, and develop
new features is a big deal for a general-purpose spreadsheet-like product, where there is a
@ -442,7 +439,4 @@ env GREP_TESTS=summary yarn test:python
## License
This repository, `grist-core`, is released under the [Apache License, Version
2.0](http://www.apache.org/licenses/LICENSE-2.0), which is an
[OSI](https://opensource.org/)-approved free software license.
See LICENSE.txt and NOTICE.txt for more information.
This repository, `grist-core`, is released under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0), which is an [OSI](https://opensource.org/)-approved free software license. See LICENSE.txt and NOTICE.txt for more information.

@ -94,7 +94,7 @@ export class OIDCConfig {
defaultValue: 'email',
});
this._skipEndSessionEndpoint = section.flag('endSessionEndpoint').readBool({
this._skipEndSessionEndpoint = section.flag('skipEndSessionEndpoint').readBool({
envVar: 'GRIST_OIDC_IDP_SKIP_END_SESSION_ENDPOINT',
defaultValue: false,
})!;

@ -427,7 +427,13 @@
"Search columns": "Search columns",
"UUID": "UUID",
"Add column with type": "Add column with type",
"Add formula column": "Add formula column"
"Add formula column": "Add formula column",
"Add column": "Add column",
"Created at": "Created at",
"Created by": "Created by",
"Detect duplicates in...": "Detect duplicates in...",
"Last updated at": "Last updated at",
"Last updated by": "Last updated by"
},
"GristDoc": {
"Added new linked section to view {{viewName}}": "Added new linked section to view {{viewName}}",

@ -0,0 +1,247 @@
{
"ApiKey": {
"Remove API Key": "Eliminați cheia API",
"Click to show": "Faceți clic pentru a afișa",
"This API key can be used to access this account anonymously via the API.": "Această cheie API poate fi utilizată pentru a accesa acest cont în mod anonim prin intermediul API-ului.",
"You're about to delete an API key. This will cause all future requests using this API key to be rejected. Do you still want to delete?": "Sunteți pe cale să ștergeți o cheie API. Acest lucru va face ca toate solicitările viitoare care utilizează această cheie API să fie respinse. Mai vreți să ștergeți?",
"This API key can be used to access your account via the API. Dont share your API key with anyone.": "Această cheie API poate fi utilizată pentru a vă accesa contul prin intermediul API-ului. Nu partajați cheia dvs. API cu nimeni.",
"Create": "Creează",
"Remove": "Elimină",
"By generating an API key, you will be able to make API calls for your own account.": "Prin generarea unei chei API, veți putea efectua apeluri API pentru contul dvs."
},
"ChartView": {
"Each Y series is followed by a series for the length of error bars.": "Fiecare serie Y este urmată de o serie pentru lungimea barelor de eroare.",
"Pick a column": "Alegeți o coloană",
"Toggle chart aggregation": "Comutați agregarea diagramelor",
"Each Y series is followed by two series, for top and bottom error bars.": "Fiecare serie Y este urmată de două serii, pentru barele de eroare de sus și de jos.",
"Create separate series for each value of the selected column.": "Creați serii separate pentru fiecare valoare a coloanei selectate.",
"selected new group data columns": "selectate noi coloane de date de grup"
},
"ColumnFilterMenu": {
"Search values": "Căutați valori",
"All Shown": "Toate sunt afișate",
"Other Matching": "Alte potriviri",
"All Except": "Toate, cu excepția",
"Start": "Început",
"Other Non-Matching": "Alte care nu se potrivesc",
"No matching values": "Nu există valori care se potrivesc",
"End": "Sfârşit",
"Search": "Căutare",
"Max": "Max",
"Others": "Altele",
"Other Values": "Alte valori",
"Min": "Min",
"All": "Toate",
"Future Values": "Valori viitoare",
"Filter by Range": "Filtrați după interval",
"None": "Nici unul"
},
"DocHistory": {
"Compare to Current": "Comparați cu documentul actual",
"Open Snapshot": "Deschideți Snapshot",
"Snapshots are unavailable.": "Instantaneele nu sunt disponibile.",
"Snapshots": "Instantanee",
"Activity": "Activitate",
"Compare to Previous": "Comparați cu precedentul",
"Beta": "Beta"
},
"AccessRules": {
"Permission to access the document in full when needed": "Permisiune de a accesa documentul în întregime atunci când este necesar",
"Add Column Rule": "Adăugați o regulă de coloană",
"Reset": "Resetați",
"Lookup Column": "Coloana de căutare",
"Remove {{- tableId }} rules": "Înlocuiește regulile {{- tableId }}",
"Remove {{- name }} user attribute": "Eliminați atributul de utilizator {{- name }}",
"Permissions": "Permisiuni",
"Enter Condition": "Introduceți o condiție",
"Everyone Else": "Toți ceilalți",
"Saved": "Salvat",
"Remove column {{- colId }} from {{- tableId }} rules": "Eliminați coloana {{- colId }} din regulile {{- tableId }}",
"Allow everyone to view Access Rules.": "Permiteți tuturor să vadă Regulile de acces.",
"Type a message...": "Scrie un mesaj…",
"Lookup Table": "Tabel de căutare",
"View As": "Vizualizare ca",
"Add Table Rules": "Adăugați reguli pentru tabel",
"Invalid": "Nu este valid",
"Condition": "Condiție",
"Delete Table Rules": "Ștergeți regulile tabelului",
"Permission to view Access Rules": "Permisiune de a vizualiza regulile de acces",
"User Attributes": "Atributele utilizatorului",
"Default Rules": "Reguli implicite",
"Attribute name": "Numele atributului",
"When adding table rules, automatically add a rule to grant OWNER full access.": "Când adăugați reguli de tabel, adăugați automat o regulă pentru a acorda PROPRIETARULUI acces complet.",
"Add User Attributes": "Adăugați atribute de utilizator",
"Permission to edit document structure": "Permisiune de a edita structura documentului",
"Attribute to Look Up": "Atribut pentru căutare",
"Seed rules": "Reguli predefinite",
"Everyone": "Toată lumea",
"Allow everyone to copy the entire document, or view it in full in fiddle mode.\nUseful for examples and templates, but not for sensitive data.": "Permiteți tuturor să copieze întregul document sau să-l vizualizeze integral în modul lăutăresc.\nUtil pentru exemple și șabloane, dar nu pentru date sensibile.",
"Add Default Rule": "Adăugați o regulă implicită",
"Allow editors to edit structure (e.g. modify and delete tables, columns, layouts), and to write formulas, which give access to all data regardless of read restrictions.": "Permite editorilor să editeze structura (de exemplu, să modifice și să șteargă tabele, coloane, machete) și să scrie formule, care oferă acces la toate datele, indiferent de restricțiile de citire.",
"This default should be changed if editors' access is to be limited. ": "Această valoare implicită ar trebui schimbată dacă accesul editorilor trebuie să fie limitat. ",
"Save": "Salvați",
"Rules for table ": "Reguli pentru tabel ",
"Checking...": "Control…",
"Special Rules": "Reguli speciale"
},
"AccountPage": {
"Theme": "Temă",
"API": "API",
"Change Password": "Schimbaţi parola",
"Email": "E-mail",
"Password & Security": "Parolă și securitate",
"Account settings": "Setările contului",
"Two-factor authentication": "Autentificare cu doi factori",
"Two-factor authentication is an extra layer of security for your Grist account designed to ensure that you're the only person who can access your account, even if someone knows your password.": "Autentificarea cu doi factori este un nivel suplimentar de securitate pentru contul dvs. Grist, conceput pentru a vă asigura că sunteți singura persoană care vă poate accesa contul, chiar dacă cineva vă cunoaște parola.",
"Language": "Limba",
"Edit": "Editați",
"Names only allow letters, numbers and certain special characters": "Numele permit doar litere, cifre și anumite caractere speciale",
"Login Method": "Metoda de conectare",
"API Key": "Cheia API",
"Name": "Nume",
"Allow signing in to this account with Google": "Permiteți conectarea la acest cont cu Google",
"Save": "Salvați"
},
"CellContextMenu": {
"Copy anchor link": "Copiați linkul de ancorare",
"Delete {{count}} rows_one": "Ștergeți rândul",
"Insert row below": "Inserează rând mai jos",
"Reset {{count}} entire columns_other": "Resetați {{count}} coloane întregi",
"Insert row": "Inserați rând",
"Copy": "Copiază",
"Delete {{count}} columns_one": "Ștergeți coloana",
"Delete {{count}} columns_other": "Ștergeți {{count}} coloane",
"Duplicate rows_one": "Rând duplicat",
"Insert row above": "Inserează rând deasupra",
"Delete {{count}} rows_other": "Ștergeți {{count}} rânduri",
"Clear values": "Șterge valorile",
"Clear cell": "Șterge celula",
"Comment": "Comentariu",
"Duplicate rows_other": "Rânduri duplicate",
"Reset {{count}} columns_one": "Resetează coloana",
"Insert column to the right": "Inserați coloana la dreapta",
"Filter by this value": "Filtrați după această valoare",
"Cut": "Taie",
"Reset {{count}} columns_other": "Resetați {{count}} coloane",
"Reset {{count}} entire columns_one": "Resetați întreaga coloană",
"Insert column to the left": "Inserați coloana la stânga",
"Paste": "Lipește"
},
"AccountWidget": {
"Add Account": "Adaugă cont",
"Switch Accounts": "Schimbă conturile",
"Activation": "Activare",
"Toggle Mobile Mode": "Comutați modul mobil",
"Support Grist": "Sprijină Grist",
"Access Details": "Detalii de acces",
"Upgrade Plan": "Plan de upgrade",
"Sign Out": "Deconectare",
"Profile Settings": "Setările profilului",
"Sign in": "Conectare",
"Pricing": "Prețuri",
"Document Settings": "Setări document",
"Use This Template": "Utilizați acest șablon",
"Manage Team": "Gestionează echipa",
"Billing Account": "Cont de facturare",
"Sign In": "Acces",
"Accounts": "Conturi",
"Sign Up": "Înscriere"
},
"ACUserManager": {
"Invite new member": "Invitați un membru nou",
"We'll email an invite to {{email}}": "Vom trimite prin e-mail o invitație către {{email}}",
"Enter email address": "Introduceți adresa de e-mail"
},
"CustomSectionConfig": {
"Open configuration": "Deschideți configurația",
"Pick a {{columnType}} column": "Alegeți o coloană {{columnType}}",
"Widget needs {{fullAccess}} to this document.": "Widgetul are nevoie de {{fullAccess}} pentru acest document.",
"Enter Custom URL": "Introduceți adresa URL personalizată",
"{{wrongTypeCount}} non-{{columnType}} columns are not shown_one": "Coloana {{wrongTypeCount}} non-{{columnType}} nu este afișată",
"Select Custom Widget": "Selectați Widget personalizat",
"{{wrongTypeCount}} non-{{columnType}} columns are not shown_other": "{{wrongTypeCount}} coloane non-{{columnType}} nu sunt afișate",
"Learn more about custom widgets": "Aflați mai multe despre widget-urile personalizate",
"Add": "Adaugă",
" (optional)": " (opțional)",
"No {{columnType}} columns in table.": "Nu există {{columnType}} coloane în tabel.",
"Read selected table": "Citiți tabelul selectat",
"Full document access": "Acces complet la documente",
"Widget needs to {{read}} the current table.": "Widgetul trebuie să {{read}} tabelul curent.",
"Pick a column": "Alegeți o coloană",
"Clear selection": "Anulează selecția",
"No document access": "Fără acces la documente",
"Widget does not require any permissions.": "Widgetul nu necesită nicio permisiune."
},
"DocMenu": {
"Discover More Templates": "Descoperiți mai multe șabloane",
"Current workspace": "Spațiul de lucru actual",
"Edited {{at}}": "Editat {{at}}",
"By Date Modified": "După data modificării",
"Delete Forever": "Șterge pentru totdeauna",
"Documents stay in Trash for 30 days, after which they get deleted permanently.": "Documentele rămân în Coșul de gunoi timp de 30 de zile, după care sunt șterse definitiv.",
"Access Details": "Detalii de acces",
"Deleted {{at}}": "S-a șters {{at}}",
"All Documents": "Toate documentele",
"Delete {{name}}": "Ștergeți {{name}}",
"Examples and Templates": "Exemple și Șabloane",
"Delete": "Șterge",
"Document will be permanently deleted.": "Documentul va fi șters definitiv.",
"(The organization needs a paid plan)": "(Organizația are nevoie de un plan plătit)",
"By Name": "După nume",
"Examples & Templates": "Exemple & Șabloane",
"Document will be moved to Trash.": "Documentul va fi mutat în Coșul de gunoi."
},
"ActionLog": {
"Column {{colId}} was subsequently removed in action #{{action.actionNum}}": "Coloana {{colId}} a fost eliminată ulterior în acțiunea #{{action.actionNum}}",
"Action Log failed to load": "Jurnalul de acțiuni nu s-a încărcat",
"This row was subsequently removed in action {{action.actionNum}}": "Acest rând a fost eliminat ulterior în acțiunea {{action.actionNum}}",
"Table {{tableId}} was subsequently removed in action #{{actionNum}}": "Tabelul {{tableId}} a fost ulterior eliminat în acțiunea #{{actionNum}}",
"All tables": "Toate tabelele"
},
"DataTables": {
"Edit Record Card": "Editați cardul de înregistrare",
"Rename Table": "Redenumiți tabelul",
"{{action}} Record Card": "{{action}} Card de înregistrare",
"Raw Data Tables": "Tabele cu date brute",
"Duplicate Table": "Tabel duplicat",
"You do not have edit access to this document": "Nu aveți acces de editare la acest document",
"Record Card": "Card de înregistrare",
"Delete {{formattedTableName}} data, and remove it from all pages?": "Ștergeți datele {{formattedTableName}} și le eliminați din toate paginile?",
"Click to copy": "Faceți clic pentru a copia",
"Remove Table": "Eliminați tabelul",
"Record Card Disabled": "Card de înregistrare dezactivat",
"Table ID copied to clipboard": "ID-ul tabelului a fost copiat în clipboard"
},
"ColorSelect": {
"Apply": "Aplică",
"Cancel": "Anulează",
"Default cell style": "Stilul de celulă implicit"
},
"AppHeader": {
"Personal Site": "Site personal",
"Home Page": "Pagina principală",
"Team Site": "Site-ul echipei",
"Legacy": "Versiune veche",
"Grist Templates": "Șabloane Grist"
},
"ViewAsDropdown": {
"View As": "Vizualizare ca",
"Example Users": "Exemplu de utilizatori",
"Users from table": "Utilizatori din acest tabel"
},
"App": {
"Description": "Descriere",
"Memory Error": "Eroare de memorie",
"Key": "Cheie"
},
"CodeEditorPanel": {
"Code View is available only when you have full document access.": "Vizualizarea codului este disponibilă numai atunci când aveți acces complet la documente.",
"Access denied": "Acces interzis"
},
"AddNewButton": {
"Add New": "Adaugă nou"
},
"AppModel": {
"This team site is suspended. Documents can be read, but not modified.": "Acest site al echipei este suspendat. Documentele pot fi citite, dar nu modificate."
}
}

@ -227,7 +227,13 @@
"Adding UUID column": "Dodajanje UUID stolpca",
"Adding duplicates column": "Dodajanje podvojenega stolpca",
"Add formula column": "Dodaj stolpec z formulo",
"Add column with type": "Dodaj stolpec z tipom"
"Add column with type": "Dodaj stolpec z tipom",
"Created by": "Ustvaril",
"Created at": "Ustvarjeno ob",
"Add column": "Dodaj stolpec",
"Last updated by": "Nazadnje posodobil",
"Detect duplicates in...": "Zaznaj dvojnike v ...",
"Last updated at": "Nazadnje posodobljeno ob"
},
"HomeLeftPane": {
"Trash": "Koš",

@ -65,4 +65,5 @@ TEST_ADD_SAMPLES=1 TEST_ACCOUNT_PASSWORD=not-needed \
GRIST_SESSION_COOKIE=grist_test_cookie \
GRIST_TEST_LOGIN=1 \
NODE_PATH=_build:_build/stubs \
LANGUAGE=en_US \
$MOCHA _build/test/deployment/*.js --slow 6000 -g "${GREP_TESTS:-}" "$@"

Loading…
Cancel
Save