mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
196 lines
8.7 KiB
JavaScript
196 lines
8.7 KiB
JavaScript
|
import { assert } from 'mocha-webdriver';
|
||
|
import { $, gu, test } from 'test/nbrowser/gristUtil-nbrowser';
|
||
|
|
||
|
describe('FieldConfigTab.ntest', function() {
|
||
|
const cleanup = test.setupTestSuite(this);
|
||
|
before(async function() {
|
||
|
await gu.supportOldTimeyTestCode();
|
||
|
await gu.useFixtureDoc(cleanup, "Hello.grist", true);
|
||
|
});
|
||
|
|
||
|
afterEach(function() {
|
||
|
return gu.checkForErrors();
|
||
|
});
|
||
|
|
||
|
it("should stay open when switching between columns or views", async function() {
|
||
|
// Add another table to the document.
|
||
|
await gu.actions.addNewTable();
|
||
|
|
||
|
await gu.actions.selectTabView('Table1');
|
||
|
await gu.openSidePane('field');
|
||
|
var fieldLabel = await $(".test-field-label").wait(assert.isDisplayed).elem();
|
||
|
|
||
|
await assert.isDisplayed(fieldLabel);
|
||
|
assert.equal(await fieldLabel.val(), "A");
|
||
|
|
||
|
// Move cursor to a different column.
|
||
|
await $("$GridView_columnLabel:nth-child(2)").click();
|
||
|
assert.equal(await fieldLabel.val(), "B");
|
||
|
|
||
|
// Switch to another view. The first column should be selected.
|
||
|
await gu.actions.selectTabView('Table2');
|
||
|
|
||
|
fieldLabel = $(".test-field-label").elem();
|
||
|
await assert.isDisplayed(fieldLabel);
|
||
|
assert.equal(await fieldLabel.val(), "A");
|
||
|
});
|
||
|
|
||
|
it("should support changing the column label and id together", async function() {
|
||
|
await gu.actions.selectTabView('Table1');
|
||
|
var fieldLabel = await $(".test-field-label").elem();
|
||
|
await gu.clickCellRC(0, 0); // Move back to the first cell.
|
||
|
assert.equal(await fieldLabel.val(), "A");
|
||
|
await $(".test-field-label").sendNewText("foo");
|
||
|
await gu.waitForServer();
|
||
|
|
||
|
// Check that both the label and colId changed in the side pane.
|
||
|
assert.equal(await fieldLabel.val(), "foo");
|
||
|
await $(".test-field-col-id").wait(async function(el) { return assert.equal(await el.val(), "$foo"); });
|
||
|
|
||
|
// Check that the label changed among column headers.
|
||
|
assert.equal(await $("$GridView_columnLabel:nth-child(1)").text(), "foo");
|
||
|
});
|
||
|
|
||
|
it("should support changing the column label and id separately", async function() {
|
||
|
await gu.actions.selectTabView('Table1');
|
||
|
await $("$GridView_columnLabel:nth-child(2)").click();
|
||
|
var fieldLabel = $(".test-field-label");
|
||
|
assert.equal(await fieldLabel.val(), "B");
|
||
|
|
||
|
// Uncheck the "derive id" checkbox.
|
||
|
var deriveIdCheckbox = $(".test-field-derive-id");
|
||
|
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
await deriveIdCheckbox.click();
|
||
|
await gu.waitForServer();
|
||
|
assert.isFalse(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
|
||
|
// Check that only the label changed in the side pane.
|
||
|
await fieldLabel.sendNewText("bar");
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await fieldLabel.val(), "bar");
|
||
|
await $("$GridView_columnLabel:nth-child(2)").wait(async function(el) { return assert.equal(await el.text(), "bar"); });
|
||
|
|
||
|
// Id should be unchanged, but we should be able to change it now.
|
||
|
assert.deepEqual(await gu.getGridValues({ rowNums: [1, 2, 3, 4], cols: [1] }),
|
||
|
['', 'world', '', '']);
|
||
|
assert(await $(".test-field-col-id").val(), "B");
|
||
|
await $(".test-field-col-id").sendNewText("baz");
|
||
|
assert(await $(".test-field-col-id").val(), "baz");
|
||
|
assert.equal(await fieldLabel.val(), "bar");
|
||
|
assert.equal(await $("$GridView_columnLabel:nth-child(1)").text(), "foo");
|
||
|
assert.equal(await $("$GridView_columnLabel:nth-child(2)").text(), "bar");
|
||
|
|
||
|
// Make sure the changing Ids does not effect the data in the column
|
||
|
assert.deepEqual(await gu.getGridValues({ rowNums: [1, 2, 3, 4], cols: [1] }),
|
||
|
['', 'world', '', '']);
|
||
|
await assert.hasClass(gu.getCell(0, 1).find('.field_clip'), 'invalid', false);
|
||
|
});
|
||
|
|
||
|
describe('Duplicate Labels', async function() {
|
||
|
let fieldLabel, deriveIdCheckbox;
|
||
|
|
||
|
beforeEach(() => {
|
||
|
fieldLabel = $(".test-field-label");
|
||
|
deriveIdCheckbox = $(".test-field-derive-id");
|
||
|
});
|
||
|
|
||
|
it('should allow duplicate labels with underived colIds', async function() {
|
||
|
// Change column 4 to have the same label as column 1
|
||
|
await $("$GridView_columnLabel:nth-child(4)").click();
|
||
|
assert.equal(await fieldLabel.val(), "D");
|
||
|
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
await deriveIdCheckbox.click();
|
||
|
await gu.waitForServer();
|
||
|
assert.isFalse(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
await fieldLabel.sendNewText("foo");
|
||
|
// Columns 1 and 4 should both be named foo
|
||
|
await $("$GridView_columnLabel:nth-child(1)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
|
||
|
await $("$GridView_columnLabel:nth-child(4)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
|
||
|
// But colId should be unchanged
|
||
|
assert(await $(".test-field-col-id").val(), "D");
|
||
|
});
|
||
|
|
||
|
it('should allow duplicate labels with derived colIds', async function() {
|
||
|
// Now clicking the derive box should be leave the labels the same
|
||
|
// but the conflicting Id should be sanitized
|
||
|
await deriveIdCheckbox.click();
|
||
|
await gu.waitForServer();
|
||
|
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
await deriveIdCheckbox.click();
|
||
|
await gu.waitForServer();
|
||
|
assert.isFalse(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
await $("$GridView_columnLabel:nth-child(1)").scrollIntoView({inline: "end"}).click();
|
||
|
await $("$GridView_columnLabel:nth-child(1)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
|
||
|
assert(await $(".test-field-col-id").val(), "foo");
|
||
|
await $("$GridView_columnLabel:nth-child(4)").click();
|
||
|
await $("$GridView_columnLabel:nth-child(4)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
|
||
|
assert(await $(".test-field-col-id").val(), "foo2");
|
||
|
});
|
||
|
|
||
|
it('should not change the derived id unnecessarly', async function() {
|
||
|
// Toggling the box should not change the derived Id
|
||
|
await deriveIdCheckbox.click();
|
||
|
await gu.waitForServer();
|
||
|
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
await deriveIdCheckbox.click();
|
||
|
await gu.waitForServer();
|
||
|
assert.isFalse(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
assert(await $(".test-field-col-id").val(), "foo2");
|
||
|
});
|
||
|
|
||
|
it('should not automatically modify the derived checkbox', async function() {
|
||
|
// When derived labels are changed to an existing Id, the derived box should remain checked
|
||
|
// even if the id and label are different
|
||
|
await $("$GridView_columnLabel:nth-child(1)").scrollIntoView({inline: "end"}).click();
|
||
|
await $("$GridView_columnLabel:nth-child(1)").wait(async function(el) { return assert.equal(await el.text(), "foo"); });
|
||
|
assert(await $(".test-field-col-id").val(), "foo");
|
||
|
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
await fieldLabel.sendNewText("foo2");
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await fieldLabel.val(), "foo2");
|
||
|
assert(await $(".test-field-col-id").val(), "foo2_2");
|
||
|
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
});
|
||
|
|
||
|
it('should allow out of sync colIds to still derive from labels', async function() {
|
||
|
// Entering a new label should still sync the Id
|
||
|
await fieldLabel.sendNewText("foobar");
|
||
|
await gu.waitForServer();
|
||
|
assert.isTrue(await deriveIdCheckbox.is('[class*=-selected]'));
|
||
|
await deriveIdCheckbox.click();
|
||
|
assert(await $(".test-field-col-id").val(), "foobar");
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it("should allow editing column data after column rename", async function() {
|
||
|
await gu.actions.selectTabView('Table1');
|
||
|
await $("$GridView_columnLabel:nth-child(3)").click();
|
||
|
assert.equal(await $(".test-field-label").val(), "C");
|
||
|
|
||
|
// Switch type to numeric. This makes it easier to tell whether the value actually gets
|
||
|
// processed by the server.
|
||
|
await gu.setType('Numeric');
|
||
|
await $('.test-type-transform-apply').wait().click();
|
||
|
await gu.waitForServer();
|
||
|
var cell = await gu.getCellRC(0, 2);
|
||
|
await cell.click(); // row index 0, column index 2
|
||
|
await gu.sendKeys('17', $.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await cell.text(), '17');
|
||
|
await assert.hasClass(cell.find('.field_clip'), 'invalid', false);
|
||
|
|
||
|
// Rename the column, make sure we can still type into it, and get results from the server.
|
||
|
await $(".test-field-label").sendNewText("c2");
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await $("$GridView_columnLabel:nth-child(3)").text(), "c2");
|
||
|
await gu.waitForServer();
|
||
|
cell = await gu.getCellRC(0, 2);
|
||
|
await cell.click(); // row index 0, column index 2
|
||
|
await gu.sendKeys('23', $.ENTER);
|
||
|
await gu.waitForServer();
|
||
|
assert.equal(await cell.text(), '23');
|
||
|
await assert.hasClass(cell.find('.field_clip'), 'invalid', false);
|
||
|
});
|
||
|
|
||
|
});
|