(core) updates from grist-core

pull/868/head
Paul Fitzpatrick 3 months ago
commit 85c51ab73f

@ -98,6 +98,7 @@ jobs:
export TEST_SPLITS=$(echo $TESTS | sed "s/.*:server-\([^:]*\).*/\1/") export TEST_SPLITS=$(echo $TESTS | sed "s/.*:server-\([^:]*\).*/\1/")
MOCHA_WEBDRIVER_HEADLESS=1 yarn run test:server MOCHA_WEBDRIVER_HEADLESS=1 yarn run test:server
env: env:
TESTS: ${{ matrix.tests }}
GRIST_DOCS_MINIO_ACCESS_KEY: administrator GRIST_DOCS_MINIO_ACCESS_KEY: administrator
GRIST_DOCS_MINIO_SECRET_KEY: administrator GRIST_DOCS_MINIO_SECRET_KEY: administrator
TEST_REDIS_URL: "redis://localhost/11" TEST_REDIS_URL: "redis://localhost/11"

@ -14,6 +14,19 @@ The `grist-core`, `grist-electron`, and `grist-static` repositories are all open
https://user-images.githubusercontent.com/118367/151245587-892e50a6-41f5-4b74-9786-fe3566f6b1fb.mp4 https://user-images.githubusercontent.com/118367/151245587-892e50a6-41f5-4b74-9786-fe3566f6b1fb.mp4
## 2024 - We're hiring a Systems Engineer!
We are looking for a friendly, capable engineer to join our small
team. You will have broad responsibility for the ease of installation
and maintenance of Grist as an application and service, by our
clients, by self-hosters, and by ourselves.
Read the [full job posting](https://www.getgrist.com/job-systems-engineer/)
or jump into the puzzle that comes with it by just running this:
```
docker run -it gristlabs/grist-twist
```
## Features ## Features
Grist is a hybrid database/spreadsheet, meaning that: Grist is a hybrid database/spreadsheet, meaning that:

@ -1029,7 +1029,7 @@ export function buildUrlId(parts: UrlIdParts): string {
// may be in a docId (leaving just the hyphen, which is permitted). The limits // may be in a docId (leaving just the hyphen, which is permitted). The limits
// could be loosened, but without much benefit. // could be loosened, but without much benefit.
const codedSnapshotId = encodeURIComponent(parts.snapshotId) const codedSnapshotId = encodeURIComponent(parts.snapshotId)
.replace(/[_.!~*'()]/g, ch => `_${ch.charCodeAt(0).toString(16).toUpperCase()}`) .replace(/[_.!~*'()-]/g, ch => `_${ch.charCodeAt(0).toString(16).toUpperCase()}`)
.replace(/%/g, '_'); .replace(/%/g, '_');
token = `${token}~v=${codedSnapshotId}`; token = `${token}~v=${codedSnapshotId}`;
} }

@ -1119,7 +1119,10 @@
"Lookups return data from related tables.": "Lookups return data from related tables.", "Lookups return data from related tables.": "Lookups return data from related tables.",
"Use reference columns to relate data in different tables.": "Use reference columns to relate data in different tables.", "Use reference columns to relate data in different tables.": "Use reference columns to relate data in different tables.",
"You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.", "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.",
"Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.": "Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant." "Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.": "Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.",
"Build simple forms right in Grist and share in a click with our new widget. {{learnMoreButton}}": "Build simple forms right in Grist and share in a click with our new widget. {{learnMoreButton}}",
"Forms are here!": "Forms are here!",
"Learn more": "Learn more"
}, },
"DescriptionConfig": { "DescriptionConfig": {
"DESCRIPTION": "DESCRIPTION" "DESCRIPTION": "DESCRIPTION"
@ -1342,5 +1345,9 @@
"Select All": "Select All", "Select All": "Select All",
"Unmap fields": "Unmap fields", "Unmap fields": "Unmap fields",
"Unmapped": "Unmapped" "Unmapped": "Unmapped"
},
"FormConfig": {
"Field rules": "Field rules",
"Required field": "Required field"
} }
} }

File diff suppressed because it is too large Load Diff

@ -727,7 +727,10 @@
"Lookups return data from related tables.": "Iskanje vrne podatke iz povezanih tabel.", "Lookups return data from related tables.": "Iskanje vrne podatke iz povezanih tabel.",
"Use reference columns to relate data in different tables.": "Uporabite referenčne stolpce za povezavo podatkov v različnih tabelah.", "Use reference columns to relate data in different tables.": "Uporabite referenčne stolpce za povezavo podatkov v različnih tabelah.",
"You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "Izbirate lahko med pripomočki, ki so vam na voljo v spustnem meniju, ali vdelate svojega tako, da navedete njegov polni URL.", "You can choose from widgets available to you in the dropdown, or embed your own by providing its full URL.": "Izbirate lahko med pripomočki, ki so vam na voljo v spustnem meniju, ali vdelate svojega tako, da navedete njegov polni URL.",
"Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.": "Formule podpirajo številne Excelove funkcije, polno Pythonovo sintakso in vključujejo koristnega AI pomočnika." "Formulas support many Excel functions, full Python syntax, and include a helpful AI Assistant.": "Formule podpirajo številne Excelove funkcije, polno Pythonovo sintakso in vključujejo koristnega AI pomočnika.",
"Forms are here!": "Obrazci so tukaj!",
"Learn more": "Nauči se več",
"Build simple forms right in Grist and share in a click with our new widget. {{learnMoreButton}}": "Ustvari preproste obrazce neposredno v Gristu in jih deli z enim klikom z našim novim pripomočkom. {{learnMoreButton}}"
}, },
"UserManager": { "UserManager": {
"Anyone with link ": "Vsakdo s povezavo ", "Anyone with link ": "Vsakdo s povezavo ",
@ -1342,5 +1345,9 @@
"Schedule your {{freeCoachingCall}} with a member of our team.": "Dogovori se za {{freeCoachingCall}} s članom naše ekipe.", "Schedule your {{freeCoachingCall}} with a member of our team.": "Dogovori se za {{freeCoachingCall}} s članom naše ekipe.",
"Maybe Later": "Mogoče kasneje", "Maybe Later": "Mogoče kasneje",
"On the call, we'll take the time to understand your needs and tailor the call to you. We can show you the Grist basics, or start working with your data right away to build the dashboards you need.": "Med klicem si bomo vzeli čas, da bomo razumeli vaše potrebe in vam klic prilagodili. Lahko vam pokažemo osnove Grista ali pa takoj začnemo delati z vašimi podatki, da zgradimo nadzorne plošče, ki jih potrebujete." "On the call, we'll take the time to understand your needs and tailor the call to you. We can show you the Grist basics, or start working with your data right away to build the dashboards you need.": "Med klicem si bomo vzeli čas, da bomo razumeli vaše potrebe in vam klic prilagodili. Lahko vam pokažemo osnove Grista ali pa takoj začnemo delati z vašimi podatki, da zgradimo nadzorne plošče, ki jih potrebujete."
},
"FormConfig": {
"Required field": "Obvezno polje",
"Field rules": "Pravila polj"
} }
} }

@ -79,6 +79,8 @@ describe('ActionLog', function() {
await gu.undo(2); await gu.undo(2);
await driver.navigate().refresh(); await driver.navigate().refresh();
await gu.waitForDocToLoad(); await gu.waitForDocToLoad();
// Dismiss forms announcement popup, if present.
await gu.dismissBehavioralPrompts();
// refreshing browser will restore position on last cell // refreshing browser will restore position on last cell
// switch active cell to the first cell in the first row // switch active cell to the first cell in the first row
await gu.getCell(0, 1).click(); await gu.getCell(0, 1).click();

@ -246,6 +246,8 @@ describe("Fork", function() {
await userSession.loadDoc(`/doc/${doc.id}/m/fork`); await userSession.loadDoc(`/doc/${doc.id}/m/fork`);
assert.equal(await gu.getEmail(), userSession.email); assert.equal(await gu.getEmail(), userSession.email);
assert.equal(await driver.find('.test-unsaved-tag').isPresent(), false); assert.equal(await driver.find('.test-unsaved-tag').isPresent(), false);
// Dismiss forms announcement popup, if present.
await gu.dismissBehavioralPrompts();
await gu.getCell({rowNum: 1, col: 0}).click(); await gu.getCell({rowNum: 1, col: 0}).click();
await gu.enterCell('123'); await gu.enterCell('123');
await gu.waitForServer(); await gu.waitForServer();

@ -735,6 +735,7 @@ describe('RawData', function () {
await gu.openPage('CountryLanguage'); await gu.openPage('CountryLanguage');
await gu.getCell(0, 1).find('.test-ref-link-icon').click(); await gu.getCell(0, 1).find('.test-ref-link-icon').click();
assert.isFalse(await driver.find('.test-record-card-popup-overlay').isPresent()); assert.isFalse(await driver.find('.test-record-card-popup-overlay').isPresent());
await gu.wipeToasts(); // notification build-up can cover setType button.
await gu.setType('Reference List', {apply: true}); await gu.setType('Reference List', {apply: true});
await gu.getCell(0, 1).find('.test-ref-list-link-icon').click(); await gu.getCell(0, 1).find('.test-ref-list-link-icon').click();
assert.isFalse(await driver.find('.test-record-card-popup-overlay').isPresent()); assert.isFalse(await driver.find('.test-record-card-popup-overlay').isPresent());

@ -4,7 +4,7 @@ import * as gu from 'test/nbrowser/gristUtils';
import {server, setupTestSuite} from "test/nbrowser/testUtils"; import {server, setupTestSuite} from "test/nbrowser/testUtils";
describe('RemoveTransformColumns', function () { describe('RemoveTransformColumns', function () {
this.timeout(4000); this.timeout(10000);
setupTestSuite(); setupTestSuite();
it('should remove transform columns when the doc shuts down', async function () { it('should remove transform columns when the doc shuts down', async function () {

Loading…
Cancel
Save