mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) Support user variable in dropdown conditions
Summary: Dropdown conditions can now reference a `user` variable, similar to the one available in Access Rules. Test Plan: Browser test. Reviewers: jarek, paulfitz Reviewed By: jarek, paulfitz Differential Revision: https://phab.getgrist.com/D4255
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import {UserAPI} from 'app/common/UserAPI';
|
||||
import {assert, driver, Key} from 'mocha-webdriver';
|
||||
import * as gu from 'test/nbrowser/gristUtils';
|
||||
import {setupTestSuite} from 'test/nbrowser/testUtils';
|
||||
@@ -5,22 +6,56 @@ import {setupTestSuite} from 'test/nbrowser/testUtils';
|
||||
describe('DropdownConditionEditor', function () {
|
||||
this.timeout(20000);
|
||||
const cleanup = setupTestSuite();
|
||||
let api: UserAPI;
|
||||
let docId: string;
|
||||
|
||||
before(async () => {
|
||||
const session = await gu.session().login();
|
||||
await session.tempDoc(cleanup, 'DropdownCondition.grist');
|
||||
const session = await gu.session().user('user1').login();
|
||||
api = session.createHomeApi();
|
||||
docId = (await session.tempDoc(cleanup, 'DropdownCondition.grist')).id;
|
||||
await api.updateDocPermissions(docId, {users: {
|
||||
[gu.translateUser('user2').email]: 'editors',
|
||||
}});
|
||||
await addUserAttributes();
|
||||
await gu.openPage('Employees');
|
||||
await gu.openColumnPanel();
|
||||
});
|
||||
|
||||
afterEach(() => gu.checkForErrors());
|
||||
|
||||
async function addUserAttributes() {
|
||||
await api.applyUserActions(docId, [
|
||||
['AddTable', 'Roles', [{id: 'Email'}, {id: 'Admin', type: 'Bool'}]],
|
||||
['AddRecord', 'Roles', null, {Email: gu.translateUser('user1').email, Admin: true}],
|
||||
['AddRecord', 'Roles', null, {Email: gu.translateUser('user2').email, Admin: false}],
|
||||
]);
|
||||
await driver.find('.test-tools-access-rules').click();
|
||||
await gu.waitForServer();
|
||||
await driver.findContentWait('button', /Add User Attributes/, 2000).click();
|
||||
const userAttrRule = await driver.find('.test-rule-userattr');
|
||||
await userAttrRule.find('.test-rule-userattr-name').click();
|
||||
await driver.sendKeys('Roles', Key.ENTER);
|
||||
await userAttrRule.find('.test-rule-userattr-attr').click();
|
||||
await driver.sendKeys('Email', Key.ENTER);
|
||||
await userAttrRule.find('.test-rule-userattr-table').click();
|
||||
await driver.findContent('.test-select-menu li', 'Roles').click();
|
||||
await userAttrRule.find('.test-rule-userattr-col').click();
|
||||
await driver.sendKeys('Email', Key.ENTER);
|
||||
await driver.find('.test-rules-save').click();
|
||||
await gu.waitForServer();
|
||||
}
|
||||
|
||||
describe(`in choice columns`, function() {
|
||||
before(async () => {
|
||||
const session = await gu.session().user('user1').login();
|
||||
await session.loadDoc(`/doc/${docId}`);
|
||||
});
|
||||
|
||||
it('creates dropdown conditions', async function() {
|
||||
await gu.getCell(1, 1).click();
|
||||
assert.isFalse(await driver.find('.test-field-dropdown-condition').isPresent());
|
||||
await driver.find('.test-field-set-dropdown-condition').click();
|
||||
await driver.find('.test-field-dropdown-condition').click();
|
||||
await gu.waitAppFocus(false);
|
||||
await gu.sendKeys('c');
|
||||
await gu.sendKeys(await gu.selectAllKey(), Key.DELETE, 'c');
|
||||
await gu.waitToPass(async () => {
|
||||
const completions = await driver.findAll('.ace_autocomplete .ace_line', el => el.getText());
|
||||
assert.deepEqual(completions, [
|
||||
@@ -28,6 +63,7 @@ describe('DropdownConditionEditor', function () {
|
||||
're\nc\n.Name\n ',
|
||||
're\nc\n.Role\n ',
|
||||
're\nc\n.Supervisor\n ',
|
||||
'user.A\nc\ncess\n ',
|
||||
]);
|
||||
});
|
||||
await gu.sendKeysSlowly(['hoice not in $']);
|
||||
@@ -141,6 +177,11 @@ describe('DropdownConditionEditor', function () {
|
||||
});
|
||||
|
||||
describe(`in reference columns`, function() {
|
||||
before(async () => {
|
||||
const session = await gu.session().user('user1').login();
|
||||
await session.loadDoc(`/doc/${docId}`);
|
||||
});
|
||||
|
||||
it('creates dropdown conditions', async function() {
|
||||
await gu.getCell(2, 1).click();
|
||||
assert.isFalse(await driver.find('.test-field-dropdown-condition').isPresent());
|
||||
@@ -288,4 +329,44 @@ describe('DropdownConditionEditor', function () {
|
||||
await gu.sendKeys(Key.ESCAPE);
|
||||
});
|
||||
});
|
||||
|
||||
it('supports user variable', async function() {
|
||||
// Filter dropdown values based on a user attribute.
|
||||
await gu.getCell(1, 1).click();
|
||||
await driver.find('.test-field-set-dropdown-condition').click();
|
||||
await gu.waitAppFocus(false);
|
||||
await gu.sendKeysSlowly(['user.']);
|
||||
await gu.waitToPass(async () => {
|
||||
const completions = await driver.findAll('.ace_autocomplete .ace_line', el => el.getText());
|
||||
assert.deepEqual(completions, [
|
||||
'user.\nAccess\n ',
|
||||
'user.\nEmail\n ',
|
||||
'user.\nIsLoggedIn\n ',
|
||||
'user.\nLinkKey.\n ',
|
||||
'user.\nName\n ',
|
||||
'user.\nOrigin\n ',
|
||||
'user.\nRoles.Admin\n ',
|
||||
'user.\nRoles.Email\n ',
|
||||
''
|
||||
]);
|
||||
});
|
||||
await gu.sendKeys('Roles.Admin == True', Key.ENTER);
|
||||
await gu.waitForServer();
|
||||
|
||||
// Check that user1 (who is an admin) can see dropdown values.
|
||||
await gu.sendKeys(Key.ENTER);
|
||||
assert.deepEqual(await driver.findAll('.test-autocomplete li', (el) => el.getText()), [
|
||||
'Trainee',
|
||||
'Supervisor',
|
||||
]);
|
||||
await gu.sendKeys(Key.ESCAPE);
|
||||
|
||||
// Switch to user2 (who is not an admin), and check that they can't see any dropdown values.
|
||||
const session = await gu.session().user('user2').login();
|
||||
await session.loadDoc(`/doc/${docId}`);
|
||||
await gu.getCell(1, 1).click();
|
||||
await gu.sendKeys(Key.ENTER);
|
||||
assert.deepEqual(await driver.findAll('.test-autocomplete li', (el) => el.getText()), []);
|
||||
await gu.sendKeys(Key.ESCAPE);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user