[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:
Thomas Hunter 2022-12-13 10:10:17 +00:00 committed by GitHub
parent 49f0cc3b61
commit 8c7c40a3d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 101 additions and 27 deletions

View File

@ -121,7 +121,8 @@
"LOAD_MORE_RULE_SETS": "Load rules from other folders",
"LOAD_MORE_RULES": "Load more 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": {
"TITLE": "Select a folder to link rules from",

View File

@ -57,7 +57,7 @@
</adf-toolbar>
<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
[mainRuleSet]="mainRuleSet$ | async"
[folderId]="nodeId"

View File

@ -30,7 +30,13 @@ import { CoreTestingModule } from '@alfresco/adf-core';
import { FolderRulesService } from '../services/folder-rules.service';
import { ActivatedRoute } from '@angular/router';
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 { owningFolderIdMock, owningFolderMock } from '../mock/node.mock';
import { MatDialog } from '@angular/material/dialog';
@ -97,10 +103,30 @@ describe('ManageRulesSmartComponent', () => {
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.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);
actionsService.loading$ = of(false);

View File

@ -242,7 +242,11 @@ export class ManageRulesSmartComponent implements OnInit, OnDestroy {
});
}
isMainRuleSetNotEmpty(mainRuleSet: RuleSet): boolean {
return !!mainRuleSet;
}
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));
}
}

View File

@ -26,7 +26,7 @@
import { RuleSet } from '../model/rule-set.model';
import { otherFolderIdMock, otherFolderMock, owningFolderIdMock, owningFolderMock } from './node.mock';
import { Rule } from '../model/rule.model';
import { inheritedRulesMock, linkedRulesMock, ownedRulesMock } from './rules.mock';
import { inheritedRulesMock, linkedRulesMock, ownedRulesMock, ruleMock } from './rules.mock';
export const getRuleSetsResponseMock = {
list: {
@ -125,6 +125,17 @@ export const inheritedRuleSetWithEmptyRulesMock: RuleSet = {
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];

View File

@ -35,7 +35,7 @@
</div>
<div
*ngIf="mainRuleSetGroupingItems.length > 0"
*ngIf="mainRuleSetGroupingItems.length > 0 || isMainRuleSetLinked"
class="aca-rule-list__item"
data-automation-id="rule-list-item"
[ngClass]="{ expanded: mainRuleSetExpanded }">
@ -66,14 +66,25 @@
</mat-icon>
</div>
<aca-rule-list-grouping
*ngIf="mainRuleSetExpanded"
[items]="mainRuleSetGroupingItems"
[selectedRule]="selectedRule"
[showEnabledToggles]="isMainRuleSetOwned"
(selectRule)="onSelectRule($event)"
(ruleEnabledChanged)="onRuleEnabledChanged($event)"
(loadMoreRules)="onLoadMoreRules($event)">
</aca-rule-list-grouping>
<ng-container *ngIf="mainRuleSetExpanded">
<aca-rule-list-grouping
*ngIf="mainRuleSetGroupingItems.length > 0; else emptyLinkedRuleSet"
[items]="mainRuleSetGroupingItems"
[selectedRule]="selectedRule"
[showEnabledToggles]="isMainRuleSetOwned"
(selectRule)="onSelectRule($event)"
(ruleEnabledChanged)="onRuleEnabledChanged($event)"
(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>

View File

@ -46,5 +46,18 @@
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;
}
}
}

View File

@ -69,14 +69,17 @@ export class RuleListUiComponent {
get isMainRuleSetOwned(): boolean {
return FolderRuleSetsService.isOwnedRuleSet(this.mainRuleSet, this.folderId);
}
get isMainRuleSetLinked(): boolean {
return FolderRuleSetsService.isLinkedRuleSet(this.mainRuleSet, this.folderId);
}
get mainRuleSetGroupingItems(): RuleGroupingItem[] {
return this.mainRuleSet ? this.getRuleSetGroupingItems(this.mainRuleSet) : [];
return this.mainRuleSet ? this.getRuleSetGroupingItems(this.mainRuleSet, !this.isMainRuleSetOwned) : [];
}
get inheritedRuleSetGroupingItems(): RuleGroupingItem[] {
const items = this.inheritedRuleSets.reduce((accumulator: RuleGroupingItem[], currentRuleSet: RuleSet) => {
accumulator.push(...this.getRuleSetGroupingItems(currentRuleSet));
accumulator.push(...this.getRuleSetGroupingItems(currentRuleSet, true));
return accumulator;
}, []);
if (this.ruleSetsLoading || this.hasMoreRuleSets) {
@ -87,11 +90,13 @@ export class RuleListUiComponent {
return items;
}
getRuleSetGroupingItems(ruleSet: RuleSet): RuleGroupingItem[] {
const items: RuleGroupingItem[] = ruleSet.rules.map((rule: Rule) => ({
type: 'rule',
rule
}));
getRuleSetGroupingItems(ruleSet: RuleSet, filterOutDisabledRules: boolean): RuleGroupingItem[] {
const items: RuleGroupingItem[] = ruleSet.rules
.filter((rule: Rule) => rule.isEnabled || !filterOutDisabledRules)
.map((rule: Rule) => ({
type: 'rule',
rule
}));
if (ruleSet.loadingRules || ruleSet.hasMoreRules) {
items.push(
ruleSet.loadingRules

View File

@ -143,7 +143,10 @@ export class FolderRuleSetsService {
this.mainRuleSetSource.next(mainRuleSet);
this.inheritedRuleSetsSource.next(inheritedRuleSets);
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);
});
}