mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2025-05-12 17:04:46 +00:00
[ACA-4644] Inherited & linked rules that are disabled should not be listed (#2843)
* [ACA-4644] Inherited & linked rules that are disabled should not be listed * Added condition for linked rule sets to need only enabled rules * Added a bypass for the empty rules list for linked rule sets that have only disabled rules * Replaced array filter with some
This commit is contained in:
parent
49f0cc3b61
commit
8c7c40a3d4
@ -121,7 +121,8 @@
|
|||||||
"LOAD_MORE_RULE_SETS": "Load rules from other folders",
|
"LOAD_MORE_RULE_SETS": "Load rules from other folders",
|
||||||
"LOAD_MORE_RULES": "Load more rules",
|
"LOAD_MORE_RULES": "Load more rules",
|
||||||
"LOADING_RULES": "Loading rules",
|
"LOADING_RULES": "Loading rules",
|
||||||
"INHERITED_RULES_WILL_BE_RUN_FIRST": "Inherited rules will be run first"
|
"INHERITED_RULES_WILL_BE_RUN_FIRST": "Inherited rules will be run first",
|
||||||
|
"ALL_LINKED_RULES_ARE_DISABLED": "All rules linked from this rule set are disabled"
|
||||||
},
|
},
|
||||||
"LINK_RULES_DIALOG": {
|
"LINK_RULES_DIALOG": {
|
||||||
"TITLE": "Select a folder to link rules from",
|
"TITLE": "Select a folder to link rules from",
|
||||||
|
@ -57,7 +57,7 @@
|
|||||||
</adf-toolbar>
|
</adf-toolbar>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
|
|
||||||
<div class="aca-manage-rules__container" *ngIf="(mainRuleSet$ | async) || isInheritedRuleSetsNotEmpty(inheritedRuleSets$ | async); else emptyContent">
|
<div class="aca-manage-rules__container" *ngIf="isMainRuleSetNotEmpty(mainRuleSet$ | async) || isInheritedRuleSetsNotEmpty(inheritedRuleSets$ | async); else emptyContent">
|
||||||
<aca-rule-list
|
<aca-rule-list
|
||||||
[mainRuleSet]="mainRuleSet$ | async"
|
[mainRuleSet]="mainRuleSet$ | async"
|
||||||
[folderId]="nodeId"
|
[folderId]="nodeId"
|
||||||
|
@ -30,7 +30,13 @@ import { CoreTestingModule } from '@alfresco/adf-core';
|
|||||||
import { FolderRulesService } from '../services/folder-rules.service';
|
import { FolderRulesService } from '../services/folder-rules.service';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { of } from 'rxjs';
|
import { of } from 'rxjs';
|
||||||
import { inheritedRuleSetMock, ownedRuleSetMock, ruleSetsWithEmptyRulesMock, ruleSetWithLinkMock } from '../mock/rule-sets.mock';
|
import {
|
||||||
|
inheritedRuleSetMock,
|
||||||
|
inheritedRuleSetWithEmptyRulesMock,
|
||||||
|
inheritedRuleSetWithOnlyDisabledRulesMock,
|
||||||
|
ownedRuleSetMock,
|
||||||
|
ruleSetWithLinkMock
|
||||||
|
} from '../mock/rule-sets.mock';
|
||||||
import { By } from '@angular/platform-browser';
|
import { By } from '@angular/platform-browser';
|
||||||
import { owningFolderIdMock, owningFolderMock } from '../mock/node.mock';
|
import { owningFolderIdMock, owningFolderMock } from '../mock/node.mock';
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
@ -97,10 +103,30 @@ describe('ManageRulesSmartComponent', () => {
|
|||||||
expect(deleteRuleBtn).toBeTruthy('no delete rule button');
|
expect(deleteRuleBtn).toBeTruthy('no delete rule button');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should only show adf-empty-content if node has no rules defined yet', () => {
|
it('should show adf-empty-content if node has no rules defined yet', () => {
|
||||||
folderRuleSetsService.folderInfo$ = of(owningFolderMock);
|
folderRuleSetsService.folderInfo$ = of(owningFolderMock);
|
||||||
folderRuleSetsService.mainRuleSet$ = of(null);
|
folderRuleSetsService.mainRuleSet$ = of(null);
|
||||||
folderRuleSetsService.inheritedRuleSets$ = of(ruleSetsWithEmptyRulesMock);
|
folderRuleSetsService.inheritedRuleSets$ = of([inheritedRuleSetWithEmptyRulesMock]);
|
||||||
|
folderRuleSetsService.isLoading$ = of(false);
|
||||||
|
actionsService.loading$ = of(false);
|
||||||
|
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
|
||||||
|
const adfEmptyContent = debugElement.query(By.css('adf-empty-content'));
|
||||||
|
const ruleSets = debugElement.queryAll(By.css(`[data-automation-id="rule-set-list-item"]`));
|
||||||
|
const ruleDetails = debugElement.query(By.css('aca-rule-details'));
|
||||||
|
|
||||||
|
expect(adfEmptyContent).toBeTruthy();
|
||||||
|
expect(ruleSets.length).toBe(0);
|
||||||
|
expect(ruleDetails).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should show adf-empty-content if there are only inherited disabled rules', () => {
|
||||||
|
folderRuleSetsService.folderInfo$ = of(owningFolderMock);
|
||||||
|
folderRuleSetsService.mainRuleSet$ = of(null);
|
||||||
|
folderRuleSetsService.inheritedRuleSets$ = of([inheritedRuleSetWithOnlyDisabledRulesMock]);
|
||||||
folderRuleSetsService.isLoading$ = of(false);
|
folderRuleSetsService.isLoading$ = of(false);
|
||||||
actionsService.loading$ = of(false);
|
actionsService.loading$ = of(false);
|
||||||
|
|
||||||
|
@ -242,7 +242,11 @@ export class ManageRulesSmartComponent implements OnInit, OnDestroy {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isMainRuleSetNotEmpty(mainRuleSet: RuleSet): boolean {
|
||||||
|
return !!mainRuleSet;
|
||||||
|
}
|
||||||
|
|
||||||
isInheritedRuleSetsNotEmpty(inheritedRuleSets: RuleSet[]): boolean {
|
isInheritedRuleSetsNotEmpty(inheritedRuleSets: RuleSet[]): boolean {
|
||||||
return inheritedRuleSets.filter((ruleSet) => ruleSet.rules.length > 0).length > 0;
|
return inheritedRuleSets.some((ruleSet) => ruleSet.rules.some((rule: Rule) => rule.isEnabled));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
import { RuleSet } from '../model/rule-set.model';
|
import { RuleSet } from '../model/rule-set.model';
|
||||||
import { otherFolderIdMock, otherFolderMock, owningFolderIdMock, owningFolderMock } from './node.mock';
|
import { otherFolderIdMock, otherFolderMock, owningFolderIdMock, owningFolderMock } from './node.mock';
|
||||||
import { Rule } from '../model/rule.model';
|
import { Rule } from '../model/rule.model';
|
||||||
import { inheritedRulesMock, linkedRulesMock, ownedRulesMock } from './rules.mock';
|
import { inheritedRulesMock, linkedRulesMock, ownedRulesMock, ruleMock } from './rules.mock';
|
||||||
|
|
||||||
export const getRuleSetsResponseMock = {
|
export const getRuleSetsResponseMock = {
|
||||||
list: {
|
list: {
|
||||||
@ -125,6 +125,17 @@ export const inheritedRuleSetWithEmptyRulesMock: RuleSet = {
|
|||||||
loadingRules: false
|
loadingRules: false
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ruleSetsMock: RuleSet[] = [inheritedRuleSetMock, ownedRuleSetMock, ruleSetWithLinkMock];
|
export const inheritedRuleSetWithOnlyDisabledRulesMock: RuleSet = {
|
||||||
|
id: 'inherited-rule-set',
|
||||||
|
isLinkedTo: false,
|
||||||
|
owningFolder: otherFolderMock,
|
||||||
|
linkedToBy: [],
|
||||||
|
rules: [
|
||||||
|
{ ...ruleMock('rule1'), isEnabled: false },
|
||||||
|
{ ...ruleMock('rule2'), isEnabled: false }
|
||||||
|
],
|
||||||
|
hasMoreRules: false,
|
||||||
|
loadingRules: false
|
||||||
|
};
|
||||||
|
|
||||||
export const ruleSetsWithEmptyRulesMock: RuleSet[] = [inheritedRuleSetWithEmptyRulesMock];
|
export const ruleSetsMock: RuleSet[] = [inheritedRuleSetMock, ownedRuleSetMock, ruleSetWithLinkMock];
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
*ngIf="mainRuleSetGroupingItems.length > 0"
|
*ngIf="mainRuleSetGroupingItems.length > 0 || isMainRuleSetLinked"
|
||||||
class="aca-rule-list__item"
|
class="aca-rule-list__item"
|
||||||
data-automation-id="rule-list-item"
|
data-automation-id="rule-list-item"
|
||||||
[ngClass]="{ expanded: mainRuleSetExpanded }">
|
[ngClass]="{ expanded: mainRuleSetExpanded }">
|
||||||
@ -66,14 +66,25 @@
|
|||||||
</mat-icon>
|
</mat-icon>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<aca-rule-list-grouping
|
<ng-container *ngIf="mainRuleSetExpanded">
|
||||||
*ngIf="mainRuleSetExpanded"
|
<aca-rule-list-grouping
|
||||||
[items]="mainRuleSetGroupingItems"
|
*ngIf="mainRuleSetGroupingItems.length > 0; else emptyLinkedRuleSet"
|
||||||
[selectedRule]="selectedRule"
|
[items]="mainRuleSetGroupingItems"
|
||||||
[showEnabledToggles]="isMainRuleSetOwned"
|
[selectedRule]="selectedRule"
|
||||||
(selectRule)="onSelectRule($event)"
|
[showEnabledToggles]="isMainRuleSetOwned"
|
||||||
(ruleEnabledChanged)="onRuleEnabledChanged($event)"
|
(selectRule)="onSelectRule($event)"
|
||||||
(loadMoreRules)="onLoadMoreRules($event)">
|
(ruleEnabledChanged)="onRuleEnabledChanged($event)"
|
||||||
</aca-rule-list-grouping>
|
(loadMoreRules)="onLoadMoreRules($event)">
|
||||||
|
</aca-rule-list-grouping>
|
||||||
|
|
||||||
|
<ng-template #emptyLinkedRuleSet>
|
||||||
|
<div class="aca-rule-list__item__all-linked-rules-are-disabled">
|
||||||
|
{{ 'ACA_FOLDER_RULES.RULE_LIST.ALL_LINKED_RULES_ARE_DISABLED' | translate }}
|
||||||
|
<button mat-stroked-button [routerLink]="['/nodes', mainRuleSet.owningFolder.id, 'rules']">
|
||||||
|
{{ 'ACA_FOLDER_RULES.MANAGE_RULES.TOOLBAR.ACTIONS.SEE_IN_FOLDER' | translate }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -46,5 +46,18 @@
|
|||||||
border-bottom: 1px solid var(--theme-border-color);
|
border-bottom: 1px solid var(--theme-border-color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&__all-linked-rules-are-disabled {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
color: var(--theme-disabled-text-color);
|
||||||
|
font-style: italic;
|
||||||
|
text-align: center;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,14 +69,17 @@ export class RuleListUiComponent {
|
|||||||
get isMainRuleSetOwned(): boolean {
|
get isMainRuleSetOwned(): boolean {
|
||||||
return FolderRuleSetsService.isOwnedRuleSet(this.mainRuleSet, this.folderId);
|
return FolderRuleSetsService.isOwnedRuleSet(this.mainRuleSet, this.folderId);
|
||||||
}
|
}
|
||||||
|
get isMainRuleSetLinked(): boolean {
|
||||||
|
return FolderRuleSetsService.isLinkedRuleSet(this.mainRuleSet, this.folderId);
|
||||||
|
}
|
||||||
|
|
||||||
get mainRuleSetGroupingItems(): RuleGroupingItem[] {
|
get mainRuleSetGroupingItems(): RuleGroupingItem[] {
|
||||||
return this.mainRuleSet ? this.getRuleSetGroupingItems(this.mainRuleSet) : [];
|
return this.mainRuleSet ? this.getRuleSetGroupingItems(this.mainRuleSet, !this.isMainRuleSetOwned) : [];
|
||||||
}
|
}
|
||||||
|
|
||||||
get inheritedRuleSetGroupingItems(): RuleGroupingItem[] {
|
get inheritedRuleSetGroupingItems(): RuleGroupingItem[] {
|
||||||
const items = this.inheritedRuleSets.reduce((accumulator: RuleGroupingItem[], currentRuleSet: RuleSet) => {
|
const items = this.inheritedRuleSets.reduce((accumulator: RuleGroupingItem[], currentRuleSet: RuleSet) => {
|
||||||
accumulator.push(...this.getRuleSetGroupingItems(currentRuleSet));
|
accumulator.push(...this.getRuleSetGroupingItems(currentRuleSet, true));
|
||||||
return accumulator;
|
return accumulator;
|
||||||
}, []);
|
}, []);
|
||||||
if (this.ruleSetsLoading || this.hasMoreRuleSets) {
|
if (this.ruleSetsLoading || this.hasMoreRuleSets) {
|
||||||
@ -87,11 +90,13 @@ export class RuleListUiComponent {
|
|||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
getRuleSetGroupingItems(ruleSet: RuleSet): RuleGroupingItem[] {
|
getRuleSetGroupingItems(ruleSet: RuleSet, filterOutDisabledRules: boolean): RuleGroupingItem[] {
|
||||||
const items: RuleGroupingItem[] = ruleSet.rules.map((rule: Rule) => ({
|
const items: RuleGroupingItem[] = ruleSet.rules
|
||||||
type: 'rule',
|
.filter((rule: Rule) => rule.isEnabled || !filterOutDisabledRules)
|
||||||
rule
|
.map((rule: Rule) => ({
|
||||||
}));
|
type: 'rule',
|
||||||
|
rule
|
||||||
|
}));
|
||||||
if (ruleSet.loadingRules || ruleSet.hasMoreRules) {
|
if (ruleSet.loadingRules || ruleSet.hasMoreRules) {
|
||||||
items.push(
|
items.push(
|
||||||
ruleSet.loadingRules
|
ruleSet.loadingRules
|
||||||
|
@ -143,7 +143,10 @@ export class FolderRuleSetsService {
|
|||||||
this.mainRuleSetSource.next(mainRuleSet);
|
this.mainRuleSetSource.next(mainRuleSet);
|
||||||
this.inheritedRuleSetsSource.next(inheritedRuleSets);
|
this.inheritedRuleSetsSource.next(inheritedRuleSets);
|
||||||
this.hasMoreRuleSetsSource.next(this.hasMoreRuleSets);
|
this.hasMoreRuleSetsSource.next(this.hasMoreRuleSets);
|
||||||
this.folderRulesService.selectRule(mainRuleSet?.rules[0] ?? inheritedRuleSets[0]?.rules[0] ?? null);
|
const ruleToSelect =
|
||||||
|
mainRuleSet?.rules.find((r: Rule) => FolderRuleSetsService.isOwnedRuleSet(mainRuleSet, nodeId) || r.isEnabled) ??
|
||||||
|
inheritedRuleSets.reduce((foundRule: Rule, ruleSet: RuleSet) => foundRule ?? ruleSet.rules.find((r: Rule) => r.isEnabled), null);
|
||||||
|
this.folderRulesService.selectRule(ruleToSelect);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user