Skip to content

Commit 3a1be94

Browse files
committed
Permissions UI: Misc changes and improvements part 3 #8822
1 parent b1c5f9c commit 3a1be94

13 files changed

+217
-157
lines changed

modules/lib/src/main/resources/assets/js/app/dialog/permissions/AccessControlChangedItemView.ts

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
import {DivEl} from '@enonic/lib-admin-ui/dom/DivEl';
22
import {AccessControlChangedItem} from './AccessControlChangedItem';
33
import {ApplyPermissionsScope} from './PermissionsData';
4-
import {i18n} from '@enonic/lib-admin-ui/util/Messages';
54
import {Permission} from '../../access/Permission';
65
import * as Q from 'q';
76
import {PrincipalViewer} from '@enonic/lib-admin-ui/ui/security/PrincipalViewer';
8-
import {SpanEl} from '@enonic/lib-admin-ui/dom/SpanEl';
97
import {EditPermissionState} from './EditPermissionState';
108
import {AccessHelper} from '../../security/AccessHelper';
119
import {AccessDiffView} from './AccessDiffView';
12-
import {Access} from '../../security/Access';
1310
import {PermissionsHelper} from '../../access/PermissionsHelper';
1411
import {PermissionStateView} from './PermissionStateView';
12+
import {Access} from '../../security/Access';
13+
import {ObjectHelper} from '@enonic/lib-admin-ui/ObjectHelper';
1514

1615
export class AccessControlChangedItemView
1716
extends DivEl {
@@ -27,18 +26,6 @@ export class AccessControlChangedItemView
2726
this.applyTo = applyTo;
2827
}
2928

30-
private getAccessValue(): string {
31-
if (this.isEntryRemoved()) {
32-
return i18n('dialog.permissions.step.strategy.item.removed');
33-
}
34-
35-
if (this.isEntryAdded()) {
36-
return i18n('dialog.permissions.step.strategy.item.added');
37-
}
38-
39-
return i18n('dialog.permissions.step.strategy.item.modified');
40-
}
41-
4229
private isEntryRemoved(): boolean {
4330
return !this.item.getPermissions().updated || this.item.getPermissions().updated?.length === 0;
4431
}
@@ -67,14 +54,11 @@ export class AccessControlChangedItemView
6754
doRender(): Q.Promise<boolean> {
6855
return super.doRender().then((rendered: boolean) => {
6956
this.addClass(this.applyTo);
70-
this.toggleClass('removed', this.isEntryRemoved());
57+
this.addClass(this.getStateClassName());
7158

7259
const principalViewer = new PrincipalViewer();
7360
principalViewer.setObject(this.item.getPrincipal());
7461

75-
const accessEl = new SpanEl('access-control-changed-item-access');
76-
accessEl.setHtml(this.getAccessValue());
77-
7862
const prevPermissions = this.item.getPermissions().persisted;
7963
const fromAccess = prevPermissions ? AccessHelper.getAccessValueFromPermissions(this.item.getPermissions().persisted) : null;
8064
const currentPermissions = this.item.getPermissions().updated;
@@ -98,4 +82,20 @@ export class AccessControlChangedItemView
9882
return rendered;
9983
});
10084
}
85+
86+
private getStateClassName(): string {
87+
if (this.isEntryRemoved()) {
88+
return 'removed'
89+
}
90+
91+
if (this.isEntryAdded()) {
92+
return 'added';
93+
}
94+
95+
if (ObjectHelper.anyArrayEquals(this.item.getPermissions().persisted, this.item.getPermissions().updated)) {
96+
return 'unchanged';
97+
}
98+
99+
return 'modified';
100+
}
101101
}

modules/lib/src/main/resources/assets/js/app/dialog/permissions/AccessControlChangedItemsList.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export class AccessControlChangedItemsList
1010

1111
private applyTo: ApplyPermissionsScope;
1212

13+
private resetChildPermissions: boolean;
14+
1315
private originalValues: AccessControlEntry[] = [];
1416

1517
private currentValues: AccessControlEntry[] = [];
@@ -30,12 +32,16 @@ export class AccessControlChangedItemsList
3032
this.applyTo = applyTo;
3133
}
3234

35+
setResetChildPermissions(resetChildPermissions: boolean): void {
36+
this.resetChildPermissions = resetChildPermissions;
37+
}
38+
3339
setOriginalValues(originalValues: AccessControlEntry[]): void {
34-
this.originalValues = originalValues;
40+
this.originalValues = originalValues.filter((entry => !RoleKeys.isEveryone(entry.getPrincipalKey())));
3541
}
3642

3743
setCurrentValues(currentValues: AccessControlEntry[]): void {
38-
this.currentValues = currentValues;
44+
this.currentValues = currentValues.filter((entry => !RoleKeys.isEveryone(entry.getPrincipalKey())));
3945
this.setItems(this.calcChangedItems());
4046
}
4147

@@ -45,14 +51,12 @@ export class AccessControlChangedItemsList
4551
this.originalValues.forEach((originalVal) => {
4652
const found = this.currentValues.find((currentVal) => originalVal.getPrincipalKey().equals(currentVal.getPrincipalKey()));
4753
if (found) { // item was present before and remains
48-
if (!originalVal.equals(found)) { // item's permissions were changed or || this.isOverwriteForChildren()
54+
if (!originalVal.equals(found) || this.resetChildPermissions) { // item's permissions were changed or || this.isOverwriteForChildren()
4955
result.push(new AccessControlChangedItem(originalVal.getPrincipal(),
5056
{persisted: originalVal.getAllowedPermissions(), updated: found.getAllowedPermissions()}));
5157
}
5258
} else { // item was removed
53-
if (!RoleKeys.isEveryone(originalVal.getPrincipalKey())) {
54-
result.push(new AccessControlChangedItem(originalVal.getPrincipal(), {persisted: originalVal.getAllowedPermissions()}));
55-
}
59+
result.push(new AccessControlChangedItem(originalVal.getPrincipal(), {persisted: originalVal.getAllowedPermissions()}));
5660
}
5761
});
5862

modules/lib/src/main/resources/assets/js/app/dialog/permissions/AccessDiffView.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,33 @@ export class AccessDiffView extends DivEl {
3131
} else if (!this.after) { // Removed
3232
this.showRemovedAccess(this.before);
3333
} else { // modified
34-
if (this.before === this.after) { // for custom access
35-
this.showAddedAccess(this.after);
34+
if (this.before === this.after) {
35+
this.showUnchangedAccess(this.after);
3636
} else {
3737
this.showModifiedAccess(this.before, this.after);
3838
}
3939
}
4040
}
4141

42+
private showAccess(access: Access, className: string): void {
43+
this.appendChild(new SpanEl('access-line ' + className).setHtml(this.getAccessDisplayName(access)));
44+
}
45+
4246
private showAddedAccess(access: Access): void {
43-
this.appendChild(new SpanEl('access-line added').setHtml(this.getAccessDisplayName(access)));
47+
this.showAccess(access, 'added');
48+
}
49+
50+
private showUnchangedAccess(access: Access): void {
51+
this.showAccess(access, 'unchanged');
4452
}
4553

4654
private showRemovedAccess(access: Access): void {
47-
this.appendChild(new SpanEl('access-line removed').setHtml(this.getAccessDisplayName(access)));
55+
this.showAccess(access, 'removed');
4856
}
4957

5058
private showModifiedAccess(fromAccess: Access, toAccess: Access): void {
5159
this.showRemovedAccess(fromAccess);
52-
this.showAddedAccess(toAccess);
60+
this.showAccess(toAccess, 'modified');
5361
}
5462

5563
private getAccessDisplayName(access: Access): string {

modules/lib/src/main/resources/assets/js/app/dialog/permissions/AccessModeLine.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ export class AccessModeLine
3131
}
3232
}
3333

34+
isAccessChanged(): boolean {
35+
return this.hadEveryoneRole !== this.hasEveryoneRole;
36+
}
37+
3438
private getLabel(hasEveryoneRole: boolean): string {
3539
return hasEveryoneRole ? i18n('dialog.permissions.step.main.access.public') : i18n(
3640
'dialog.permissions.step.main.access.restricted');

modules/lib/src/main/resources/assets/js/app/dialog/permissions/EditPermissionsDialog.ts

Lines changed: 20 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {H6El} from '@enonic/lib-admin-ui/dom/H6El';
2-
import {showWarning} from '@enonic/lib-admin-ui/notify/MessageBus';
2+
import {showFeedback, showWarning} from '@enonic/lib-admin-ui/notify/MessageBus';
33
import {TaskId} from '@enonic/lib-admin-ui/task/TaskId';
44
import {TaskState} from '@enonic/lib-admin-ui/task/TaskState';
55
import {i18n} from '@enonic/lib-admin-ui/util/Messages';
@@ -15,14 +15,11 @@ import {GetDescendantsOfContentsRequest} from '../../resource/GetDescendantsOfCo
1515
import {DefaultErrorHandler} from '@enonic/lib-admin-ui/DefaultErrorHandler';
1616
import {SummaryStep} from './steps/SummaryStep';
1717
import {StrategyStep} from './steps/StrategyStep';
18-
import {MenuButton, MenuButtonConfig} from '@enonic/lib-admin-ui/ui/button/MenuButton';
19-
import {DropdownButtonRow} from '@enonic/lib-admin-ui/ui/dialog/DropdownButtonRow';
2018
import {Action} from '@enonic/lib-admin-ui/ui/Action';
2119
import {PermissionsData} from './PermissionsData';
2220
import {DialogStep} from '@enonic/lib-admin-ui/ui/dialog/multistep/DialogStep';
2321
import {AccessControlEntry} from '../../access/AccessControlEntry';
2422
import {AccessControlHelper} from '../../wizard/AccessControlHelper';
25-
import {ConfirmationDialog} from '@enonic/lib-admin-ui/ui/dialog/ConfirmationDialog';
2623

2724
export class EditPermissionsDialog
2825
extends MultiStepDialog
@@ -40,26 +37,18 @@ export class EditPermissionsDialog
4037

4138
private summaryStep: SummaryStep;
4239

43-
private menuButton: MenuButton;
44-
45-
private secondaryAction: Action;
46-
4740
private backActionMirror: Action;
4841

4942
private originalValues: AccessControlEntry[];
5043

5144
private totalChildren: number;
5245

53-
private confirmOverwriteDialog: ConfirmationDialog;
54-
5546
constructor() {
5647
super({
5748
steps: [new MainAccessStep(), new StrategyStep(), new SummaryStep()],
5849
confirmation: {
5950
yesCallback: () => this.submit(),
60-
noCallback: () => this.close(),
6151
},
62-
buttonRow: new EditPermissionsDialogButtonRow(),
6352
title: i18n('dialog.permissions.step.title'),
6453
class: 'edit-permissions-dialog'
6554
} as MultiStepDialogConfig);
@@ -70,6 +59,7 @@ export class EditPermissionsDialog
7059

7160
this.mainStep = this.steps[0] as MainAccessStep;
7261
this.strategyStep = this.steps[1] as StrategyStep;
62+
this.strategyStep.setResetConfirmedHandler(() => this.showStep(this.summaryStep));
7363
this.summaryStep = this.steps[2] as SummaryStep;
7464

7565
this.backActionMirror = this.getBackAction(); // using the back action as a reset button on the first step
@@ -80,13 +70,6 @@ export class EditPermissionsDialog
8070
});
8171

8272
this.subTitle = new H6El('sub-title').setHtml(`${i18n('dialog.permissions.applying')}...`);
83-
84-
this.secondaryAction = new Action(i18n('dialog.permissions.step.action.overwrite')).setEnabled(false);
85-
86-
this.menuButton = this.getButtonRow().makeActionMenu({
87-
defaultAction: this.getButtonRow().getActions()[2],
88-
menuActions: [this.secondaryAction]
89-
});
9073
}
9174

9275
protected postInitElements(): void {
@@ -102,35 +85,28 @@ export class EditPermissionsDialog
10285
this.subTitle.hide();
10386
});
10487

105-
this.secondaryAction.onExecuted(() => {
106-
this.confirmOverwriteDialog = this.confirmOverwriteDialog ?? new ConfirmationDialog()
107-
.setQuestion(i18n('dialog.permissions.confirm.overwrite.question'))
108-
.setYesCallback(() => {
109-
this.doSubmit(true);
110-
});
111-
112-
this.confirmOverwriteDialog.open();
113-
});
114-
11588
this.mainStep.onDataChanged(() => {
11689
const isChanged = this.mainStep.isAnyPermissionChanged();
117-
this.menuButton.setEnabled(isChanged);
11890
this.backActionMirror.setEnabled(isChanged);
119-
this.secondaryAction.setEnabled(isChanged);
12091
});
12192
}
12293

123-
protected doSubmit(overwrite: boolean): void {
94+
protected doSubmit(data: PermissionsData): void {
12495
this.subTitle.show();
125-
const data = this.collectData();
12696
const permissions = new AccessControlList(data.permissions);
12797

12898
const req = new ApplyContentPermissionsRequest().setId(this.contentId).setScope(data.applyTo);
12999

130-
if (overwrite) {
100+
if (data.reset) {
131101
req.setPermissions(permissions);
132102
} else {
133103
const {added, removed} = AccessControlHelper.calcMergePermissions(this.originalValues, data.permissions);
104+
105+
if (added.getEntries().length === 0 && removed.getEntries().length === 0) {
106+
showFeedback(i18n('dialog.permissions.step.action.noChanges'));
107+
return;
108+
}
109+
134110
req.setAddPermissions(added);
135111
req.setRemovePermissions(removed);
136112
}
@@ -141,7 +117,7 @@ export class EditPermissionsDialog
141117
}
142118

143119
protected submit(): void {
144-
this.doSubmit(false);
120+
this.doSubmit(this.collectData());
145121
}
146122

147123
private collectData(): PermissionsData {
@@ -150,6 +126,7 @@ export class EditPermissionsDialog
150126
return {
151127
permissions: this.mainStep.getData(),
152128
applyTo: strategyData.applyTo,
129+
reset: strategyData.reset,
153130
}
154131
}
155132

@@ -234,15 +211,19 @@ export class EditPermissionsDialog
234211
}
235212
}
236213

237-
getButtonRow(): EditPermissionsDialogButtonRow {
238-
return super.getButtonRow() as EditPermissionsDialogButtonRow;
239-
}
240-
241214
private getBackAction(): Action {
242215
return this.getButtonRow().getActions()[1];
243216
}
244217

245218
protected getSubmitActionLabel(): string {
219+
if (this.strategyStep.getData().reset) {
220+
return i18n('dialog.permissions.step.action.overwrite', this.getTotalItemsToApplyTo());
221+
}
222+
223+
if (!this.isDirty()) {
224+
return i18n('dialog.permissions.step.action.noChanges');
225+
}
226+
246227
return i18n('dialog.permissions.step.action.submitNow', this.getTotalItemsToApplyTo());
247228
}
248229

@@ -288,14 +269,3 @@ export class EditPermissionsDialog
288269
this.progressManager.setProcessingLabel(processingLabel);
289270
}
290271
}
291-
292-
class EditPermissionsDialogButtonRow
293-
extends DropdownButtonRow {
294-
295-
makeActionMenu(menuButtonConfig: MenuButtonConfig, useDefault: boolean = true): MenuButton {
296-
super.makeActionMenu(menuButtonConfig, useDefault);
297-
298-
return this.actionMenu.addClass('edit-permissions-dialog-menu') as MenuButton;
299-
}
300-
301-
}

modules/lib/src/main/resources/assets/js/app/dialog/permissions/PermissionsData.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ export type ApplyPermissionsScope = 'single' | 'tree' | 'subtree';
55
export interface PermissionsData {
66
permissions: AccessControlEntry[],
77
applyTo: ApplyPermissionsScope,
8+
reset: boolean,
89
}

modules/lib/src/main/resources/assets/js/app/dialog/permissions/ShowHideDetailsButton.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export class ShowHideDetailsButton extends Button {
77

88
private total: number;
99

10+
private reset: boolean;
11+
1012
private onActiveChange?: (isActive: boolean) => void;
1113

1214
constructor() {
@@ -31,6 +33,11 @@ export class ShowHideDetailsButton extends Button {
3133
this.updateLabel();
3234
}
3335

36+
setReset(reset: boolean): void {
37+
this.reset = reset;
38+
this.updateLabel();
39+
}
40+
3441
setActiveChangeListener(onActiveChange: (isActive: boolean) => void): void {
3542
this.onActiveChange = onActiveChange;
3643
}
@@ -40,8 +47,16 @@ export class ShowHideDetailsButton extends Button {
4047
}
4148

4249
private updateLabel(): void {
43-
this.setLabel(
44-
this.active ? i18n('dialog.permissions.details.hide', this.total) : i18n('dialog.permissions.details.show', this.total));
50+
this.setLabel(this.getLabelText());
51+
}
52+
53+
private getLabelText(): string {
54+
if (this.active) {
55+
return this.reset ? i18n('dialog.permissions.details.permissions.hide') : i18n('dialog.permissions.details.changes.hide',
56+
this.total);
57+
}
58+
return this.reset ? i18n('dialog.permissions.details.permissions.show') : i18n('dialog.permissions.details.changes.show',
59+
this.total);
4560
}
4661

4762
}

0 commit comments

Comments
 (0)