2023-08-24 11:04:15 +00:00
|
|
|
import { By, assert, driver } from 'mocha-webdriver';
|
2023-06-27 06:11:08 +00:00
|
|
|
import { $, gu, test } from 'test/nbrowser/gristUtil-nbrowser';
|
|
|
|
|
|
|
|
describe("DetailView.ntest", function () {
|
|
|
|
const cleanup = test.setupTestSuite(this);
|
2023-10-11 21:03:02 +00:00
|
|
|
const clipboard = gu.getLockableClipboard();
|
2023-06-27 06:11:08 +00:00
|
|
|
gu.bigScreen();
|
|
|
|
|
|
|
|
before(async function() {
|
|
|
|
await gu.supportOldTimeyTestCode();
|
|
|
|
await gu.useFixtureDoc(cleanup, "Favorite_Films.grist", true);
|
|
|
|
|
|
|
|
// Open the view tab.
|
|
|
|
await gu.openSidePane('view');
|
|
|
|
|
|
|
|
// Open the 'All' view
|
|
|
|
await gu.actions.selectTabView('All');
|
|
|
|
|
|
|
|
// close the side pane
|
|
|
|
await gu.toggleSidePanel('left', 'close');
|
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(function() {
|
|
|
|
return gu.checkForErrors();
|
|
|
|
});
|
|
|
|
|
2023-08-24 11:04:15 +00:00
|
|
|
describe("DetailView.selection", function () {
|
|
|
|
|
|
|
|
before(async function() {
|
|
|
|
// Open the 'Performances' view
|
|
|
|
await gu.actions.viewSection('Performances detail').selectSection();
|
|
|
|
await $('.test-right-panel button:contains(Change Widget)').click();
|
|
|
|
await $('.test-wselect-type:contains(Card List)').click();
|
|
|
|
await $('.test-wselect-addBtn').click();
|
|
|
|
await gu.waitForServer();
|
|
|
|
await gu.openSelectByForSection('Performances detail');
|
|
|
|
await driver.findContent('.test-select-row', /Performances record$/).click();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should mark detail-view row as selected when its out of focus', async function() {
|
|
|
|
// Focus on Performances record, second row
|
|
|
|
await gu.actions.viewSection('Performances record').selectSection();
|
|
|
|
await gu.getCell({col: 'Film', rowNum: 2}).click();
|
|
|
|
|
|
|
|
//Check if only the second card in detail view is having selection class
|
|
|
|
const elements = await driver.findElements(By.css(".detailview_record_detail"));
|
|
|
|
const secondElement = await elements[1].getAttribute('class');
|
|
|
|
assert.isTrue(secondElement.includes('selected'));
|
|
|
|
|
|
|
|
const firstElement = await elements[0].getAttribute('class');
|
|
|
|
assert.isFalse(firstElement.includes('selected'));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2023-06-27 06:11:08 +00:00
|
|
|
it('should allow switching between card and detail view', async function() {
|
|
|
|
await gu.actions.viewSection('Performances detail').selectSection();
|
|
|
|
|
|
|
|
// Check that the detail cells have the correct values.
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Actor', [1]), ['Tom Hanks']);
|
|
|
|
await $('.grist-single-record__menu .detail-right').click();
|
|
|
|
// rowNum is always 1 for detail cells now.
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Actor', [1]), ['Tim Allen']);
|
|
|
|
|
|
|
|
// Swap to Card List view, check values.
|
|
|
|
await $('.test-right-panel button:contains(Change Widget)').click();
|
|
|
|
await $('.test-wselect-type:contains(Card List)').click();
|
|
|
|
await $('.test-wselect-addBtn').click();
|
|
|
|
await gu.waitForServer();
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Actor', [1, 2]),
|
|
|
|
['Tom Hanks', 'Tim Allen']);
|
|
|
|
|
|
|
|
// Swap back to Card view, re-check values.
|
|
|
|
await $('.test-right-panel button:contains(Change Widget)').click();
|
|
|
|
await $('.test-wselect-type:contains(Card)').click();
|
|
|
|
await $('.test-wselect-addBtn').click();
|
|
|
|
await gu.waitForServer();
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Actor', [1]), ['Tim Allen']);
|
|
|
|
await $('.grist-single-record__menu .detail-left').click();
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Actor', [1]), ['Tom Hanks']);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should allow editing cells', async function() {
|
|
|
|
// Updates should be reflected in the detail floating rowModel cell.
|
|
|
|
await gu.sendKeys('Roger Federer', $.ENTER);
|
|
|
|
await gu.waitForServer();
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Actor', [1]), ['Roger Federer']);
|
|
|
|
|
|
|
|
// Undo updates should be reflected as well.
|
|
|
|
await gu.sendKeys([$.MOD, 'z']);
|
|
|
|
await gu.waitForServer();
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Actor', [1]), ['Tom Hanks']);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Note: This is a test of a specific bug related to the detail rowModel being resized after
|
|
|
|
// being unset.
|
|
|
|
it('should allow row resize operations after switching section type', async function() {
|
|
|
|
// Switch to Card List view and enter a formula. This should cause the scrolly to resize all rows.
|
|
|
|
// If the detail view rowModel is wrongly resized, the action will fail.
|
|
|
|
await $('.test-right-panel button:contains(Change Widget)').click();
|
|
|
|
await $('.test-wselect-type:contains(Card List)').click();
|
|
|
|
await $('.test-wselect-addBtn').click();
|
|
|
|
await gu.waitForServer();
|
|
|
|
await gu.sendKeys('=');
|
|
|
|
await $('.test-editor-tooltip-convert').click(); // Convert to a formula
|
|
|
|
await gu.sendKeys('100', $.ENTER);
|
|
|
|
await gu.waitForServer();
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Actor', [1, 2, 3, 4]),
|
|
|
|
['100', '100', '100', '100']);
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should include an add record row', async function() {
|
|
|
|
// Should include an add record row which works in card view and detail view.
|
|
|
|
// Check that adding 'Jurassic Park' to the card view add record row adds it as a row.
|
|
|
|
await $('.g_record_detail:nth-child(14) .field_clip').eq(1).wait().click();
|
|
|
|
await gu.sendKeys('Jurassic Park', $.ENTER);
|
|
|
|
await gu.waitForServer();
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Film', [14]), ['Jurassic Park']);
|
|
|
|
// Check that adding 'Star Wars' to the detail view add record row adds it as a row.
|
|
|
|
await $('.test-right-panel button:contains(Change Widget)').click();
|
|
|
|
await $('.test-wselect-type:contains(Card)').click();
|
|
|
|
await $('.test-wselect-addBtn').click();
|
|
|
|
await gu.waitForServer();
|
|
|
|
await $('.detail-add-btn').wait().click();
|
|
|
|
// Card view, so rowNum is now 1
|
|
|
|
await gu.getDetailCell('Film', 1).click();
|
|
|
|
await gu.sendKeys('Star Wars', $.ENTER);
|
|
|
|
await gu.waitForServer();
|
|
|
|
assert.deepEqual(await gu.getVisibleDetailCells('Film', [1]), ['Star Wars']);
|
|
|
|
|
|
|
|
// Should allow pasting into the add record row.
|
|
|
|
await gu.getDetailCell('Actor', 1).click();
|
2023-10-11 21:03:02 +00:00
|
|
|
await clipboard.lockAndPerform(async (cb) => {
|
|
|
|
await cb.copy();
|
|
|
|
await $('.detail-add-btn').click();
|
|
|
|
await gu.waitForServer();
|
|
|
|
// Paste '100' into the last field of the row and check that it is added as its own row.
|
|
|
|
await gu.getDetailCell('Character', 1).click();
|
|
|
|
await cb.paste();
|
|
|
|
});
|
2023-06-27 06:11:08 +00:00
|
|
|
await gu.waitForServer();
|
|
|
|
assert.deepEqual(await gu.getDetailCell('Character', 1).text(), '100');
|
|
|
|
|
|
|
|
// Should not throw errors when deleting the add record row.
|
|
|
|
await $('.detail-add-btn').click();
|
|
|
|
await gu.sendKeys([$.MOD, $.DELETE]);
|
|
|
|
// Errors will be detected in afterEach.
|
|
|
|
});
|
|
|
|
});
|