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 @@ </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" diff --git a/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.spec.ts b/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.spec.ts index b47710c69..ebc87905e 100644 --- a/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.spec.ts +++ b/projects/aca-folder-rules/src/lib/manage-rules/manage-rules.smart-component.spec.ts @@ -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); 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 @@ </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> 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); }); }