From 8c7c40a3d4f8b1a2347afcb58d4949eebc2fa08f Mon Sep 17 00:00:00 2001 From: Thomas Hunter Date: Tue, 13 Dec 2022 10:10:17 +0000 Subject: [PATCH] [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 --- projects/aca-folder-rules/assets/i18n/en.json | 3 +- .../manage-rules.smart-component.html | 2 +- .../manage-rules.smart-component.spec.ts | 32 +++++++++++++++++-- .../manage-rules.smart-component.ts | 6 +++- .../src/lib/mock/rule-sets.mock.ts | 17 ++++++++-- .../rule-list/rule-list.ui-component.html | 31 ++++++++++++------ .../rule-list/rule-list.ui-component.scss | 13 ++++++++ .../rule-list/rule-list.ui-component.ts | 19 +++++++---- .../lib/services/folder-rule-sets.service.ts | 5 ++- 9 files changed, 101 insertions(+), 27 deletions(-) diff --git a/projects/aca-folder-rules/assets/i18n/en.json b/projects/aca-folder-rules/assets/i18n/en.json index e78462cf9..09f8f2f6d 100644 --- a/projects/aca-folder-rules/assets/i18n/en.json +++ b/projects/aca-folder-rules/assets/i18n/en.json @@ -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", diff --git a/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.html b/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.html index d28781c26..d1b5b133a 100644 --- a/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.html +++ b/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.html @@ -57,7 +57,7 @@ -
+
{ 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); diff --git a/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.ts b/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.ts index b5ad47efd..4bb70ffd8 100644 --- a/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.ts +++ b/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.ts @@ -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)); } } diff --git a/projects/aca-folder-rules/src/lib/mock/rule-sets.mock.ts b/projects/aca-folder-rules/src/lib/mock/rule-sets.mock.ts index 9f3bbc959..e5acb3336 100644 --- a/projects/aca-folder-rules/src/lib/mock/rule-sets.mock.ts +++ b/projects/aca-folder-rules/src/lib/mock/rule-sets.mock.ts @@ -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]; diff --git a/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.html b/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.html index 0bcdb0bf0..53808d20a 100644 --- a/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.html +++ b/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.html @@ -35,7 +35,7 @@
@@ -66,14 +66,25 @@
- - + + + + + +
+ {{ 'ACA_FOLDER_RULES.RULE_LIST.ALL_LINKED_RULES_ARE_DISABLED' | translate }} + +
+
+
diff --git a/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.scss b/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.scss index dae8faaea..43f5bb19b 100644 --- a/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.scss +++ b/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.scss @@ -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; + } } } diff --git a/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.ts b/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.ts index 1b96273cf..508d12dd8 100644 --- a/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.ts +++ b/projects/aca-folder-rules/src/lib/rule-list/rule-list/rule-list.ui-component.ts @@ -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 diff --git a/projects/aca-folder-rules/src/lib/services/folder-rule-sets.service.ts b/projects/aca-folder-rules/src/lib/services/folder-rule-sets.service.ts index df7b16ed9..7984e18a5 100644 --- a/projects/aca-folder-rules/src/lib/services/folder-rule-sets.service.ts +++ b/projects/aca-folder-rules/src/lib/services/folder-rule-sets.service.ts @@ -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); }); }