mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
(core) Fix bug preventing changes to ref list table
Summary: Fixes bug that prevented the table of a reference list from being changed in the column transform UI. Test Plan: Browser test. Reviewers: jarek Reviewed By: jarek Differential Revision: https://phab.getgrist.com/D3666
This commit is contained in:
parent
bfd7243fe2
commit
7682b3c320
@ -196,7 +196,7 @@ export async function prepTransformColInfo(docModel: DocModel, origCol: ColumnRe
|
|||||||
let suggestedColRef: number;
|
let suggestedColRef: number;
|
||||||
let suggestedTableId: string;
|
let suggestedTableId: string;
|
||||||
const origColTypeInfo = gristTypes.extractInfoFromColType(origCol.type.peek());
|
const origColTypeInfo = gristTypes.extractInfoFromColType(origCol.type.peek());
|
||||||
if (!optTableId && origColTypeInfo.type === "Ref" || origColTypeInfo.type === "RefList") {
|
if (!optTableId && (origColTypeInfo.type === "Ref" || origColTypeInfo.type === "RefList")) {
|
||||||
// When converting between Ref and Reflist, initially suggest the same table and visible column.
|
// When converting between Ref and Reflist, initially suggest the same table and visible column.
|
||||||
// When converting, if the table is the same, it's a special case.
|
// When converting, if the table is the same, it's a special case.
|
||||||
// The visible column will not affect conversion.
|
// The visible column will not affect conversion.
|
||||||
|
119
test/nbrowser/RefTransforms.ts
Normal file
119
test/nbrowser/RefTransforms.ts
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
import {assert, driver, Key} from 'mocha-webdriver';
|
||||||
|
import * as gu from 'test/nbrowser/gristUtils';
|
||||||
|
import {setupTestSuite} from 'test/nbrowser/testUtils';
|
||||||
|
|
||||||
|
describe('RefTransforms', function() {
|
||||||
|
this.timeout(20000);
|
||||||
|
const cleanup = setupTestSuite();
|
||||||
|
|
||||||
|
afterEach(() => gu.checkForErrors());
|
||||||
|
|
||||||
|
it('should work when transformed column serves as a display column for another reference', async function() {
|
||||||
|
// Make a special doc for testing this.
|
||||||
|
const session = await gu.session().teamSite.user('user1').login();
|
||||||
|
const docId = (await session.tempNewDoc(cleanup, 'RefTransforms1', {load: false}));
|
||||||
|
const api = session.createHomeApi();
|
||||||
|
await api.applyUserActions(docId, [
|
||||||
|
// Table1 contains foo,bar, to be transformed (using UI) into a Reference or ReferenceList
|
||||||
|
// pointing to Table2.
|
||||||
|
['AddTable', 'Table1', [{id: 'A', type: 'Text'}]],
|
||||||
|
['BulkAddRecord', 'Table1', [null, null], {
|
||||||
|
A: ['foo', 'bar']
|
||||||
|
}],
|
||||||
|
// Table2 contains bar,foo (for Table1 to point to when it gets converted), and also a
|
||||||
|
// Reference back to Table1. This will be set to SHOW Table1.A. When Table1.A itself
|
||||||
|
// becomes a ReferenceList, we've had a bug manifesting as "unmarshallable object".
|
||||||
|
['AddTable', 'Table2', [{id: 'A', type: 'Text'}, {id: 'B', type: 'Ref:Table1'}]],
|
||||||
|
['BulkAddRecord', 'Table2', [null, null], {
|
||||||
|
A: ['bar', 'foo'],
|
||||||
|
B: [1, 2],
|
||||||
|
}],
|
||||||
|
]);
|
||||||
|
|
||||||
|
await session.loadDoc(`/doc/${docId}`);
|
||||||
|
await gu.addNewSection(/Table/, /Table2/);
|
||||||
|
|
||||||
|
// Change Table2.B column (of type Ref:Table1) to use Table1.A as "SHOW COLUMN".
|
||||||
|
await gu.getCell({section: 'Table2', rowNum: 1, col: 'B'}).click();
|
||||||
|
await gu.toggleSidePanel('right', 'open');
|
||||||
|
await driver.find('.test-right-tab-field').click();
|
||||||
|
await driver.find('.test-fbuilder-ref-col-select').click();
|
||||||
|
await driver.findContent('.test-select-row', /A/).click();
|
||||||
|
await gu.waitForServer();
|
||||||
|
|
||||||
|
// Change type of Table1 to be Ref:Table2.
|
||||||
|
await gu.getCell({section: 'Table1', rowNum: 1, col: 'A'}).click();
|
||||||
|
await gu.setType(/Reference$/);
|
||||||
|
await driver.findContent('.type_transform_prompt button', /Apply/).click();
|
||||||
|
await gu.waitForServer();
|
||||||
|
|
||||||
|
await gu.checkForErrors();
|
||||||
|
assert.equal(await driver.find('.test-fbuilder-type-select').getText(), "Reference");
|
||||||
|
assert.deepEqual(await gu.getVisibleGridCells({section: 'Table1', rowNums: [1, 2], col: 'A'}),
|
||||||
|
['foo', 'bar']);
|
||||||
|
|
||||||
|
// Revert.
|
||||||
|
await gu.undo();
|
||||||
|
assert.equal(await driver.find('.test-fbuilder-type-select').getText(), "Text");
|
||||||
|
assert.deepEqual(await gu.getVisibleGridCells({section: 'Table1', rowNums: [1, 2], col: 'A'}),
|
||||||
|
['foo', 'bar']);
|
||||||
|
|
||||||
|
// Now change type of Table1 to be RefList:Table2.
|
||||||
|
await gu.getCell({section: 'Table1', rowNum: 1, col: 'A'}).click();
|
||||||
|
await gu.setType(/Reference List/);
|
||||||
|
await driver.find('.test-fbuilder-ref-table-select').click();
|
||||||
|
await driver.findContent('.test-select-row', /Table2/).click();
|
||||||
|
await gu.waitForServer();
|
||||||
|
await driver.find('.test-fbuilder-ref-col-select').click();
|
||||||
|
await driver.findContent('.test-select-row', /A/).click();
|
||||||
|
await gu.waitForServer();
|
||||||
|
await driver.findContent('.type_transform_prompt button', /Apply/).click();
|
||||||
|
await gu.waitForServer();
|
||||||
|
|
||||||
|
await gu.checkForErrors();
|
||||||
|
assert.equal(await driver.find('.test-fbuilder-type-select').getText(), "Reference List");
|
||||||
|
assert.deepEqual(await gu.getVisibleGridCells({section: 'Table1', rowNums: [1, 2], col: 'A'}),
|
||||||
|
['foo', 'bar']);
|
||||||
|
|
||||||
|
// Revert.
|
||||||
|
await gu.undo();
|
||||||
|
assert.equal(await driver.find('.test-fbuilder-type-select').getText(), "Text");
|
||||||
|
assert.deepEqual(await gu.getVisibleGridCells({section: 'Table1', rowNums: [1, 2], col: 'A'}),
|
||||||
|
['foo', 'bar']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should allow changing the table of a ref list', async function() {
|
||||||
|
// An old bug made it impossible to change the value of "DATA FROM TABLE" for a reference list.
|
||||||
|
await gu.getCell({section: 'Table1', rowNum: 1, col: 'B'}).click();
|
||||||
|
await gu.setType(/Reference List/);
|
||||||
|
await driver.find('.test-fbuilder-ref-col-select').click();
|
||||||
|
await driver.findContent('.test-select-row', /A/).click();
|
||||||
|
await gu.waitForServer();
|
||||||
|
|
||||||
|
// Add some references to values in the same table.
|
||||||
|
await gu.sendKeys(Key.ENTER, 'foo', Key.ENTER, 'bar', Key.ENTER, Key.ENTER);
|
||||||
|
await gu.waitForServer();
|
||||||
|
|
||||||
|
// Now change the table to Table2. (This previously failed and left the table unchanged.)
|
||||||
|
await driver.find('.test-fbuilder-ref-table-select').click();
|
||||||
|
await driver.findContent('.test-select-row', /Table2/).click();
|
||||||
|
await gu.waitForServer();
|
||||||
|
assert.equal(await driver.find('.test-fbuilder-ref-table-select').getText(), 'Table2');
|
||||||
|
await driver.find('.test-fbuilder-ref-col-select').click();
|
||||||
|
await driver.findContent('.test-select-row', /A/).click();
|
||||||
|
await gu.waitForServer();
|
||||||
|
|
||||||
|
// Finish transforming and make sure it completed successfully.
|
||||||
|
await driver.findContent('.type_transform_prompt button', /Apply/).click();
|
||||||
|
await gu.waitForServer();
|
||||||
|
await gu.checkForErrors();
|
||||||
|
assert.deepEqual(await gu.getVisibleGridCells({section: 'Table1', rowNums: [1, 2], col: 'B'}),
|
||||||
|
['foo\nbar', '']);
|
||||||
|
|
||||||
|
// Make sure new references are added to Table2.
|
||||||
|
await gu.sendKeys('baz', Key.ARROW_UP, Key.ENTER, Key.ENTER);
|
||||||
|
await gu.waitForServer();
|
||||||
|
assert.deepEqual(await gu.getVisibleGridCells({section: 'Table2', rowNums: [1, 2, 3], col: 'A'}),
|
||||||
|
['bar', 'foo', 'baz']);
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user