diff --git a/projects/aca-folder-rules/assets/i18n/en.json b/projects/aca-folder-rules/assets/i18n/en.json index 2ce08d5eb..af73a207f 100644 --- a/projects/aca-folder-rules/assets/i18n/en.json +++ b/projects/aca-folder-rules/assets/i18n/en.json @@ -90,7 +90,8 @@ "RULES": "rules" }, "ACTIONS": { - "CREATE_RULE": "Create rule" + "CREATE_RULE": "Create rule", + "EDIT_RULE": "Edit" } }, "EMPTY_RULES_LIST": { 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 ef52ac195..e8baf52f7 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 @@ -25,7 +25,7 @@ class="aca-manage-rules__actions-bar__title__breadcrumb"> - + @@ -40,6 +40,9 @@ +

{{ selectedRule.description }}

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 88c02df32..c990ab999 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 @@ -103,10 +103,13 @@ export class ManageRulesSmartComponent implements OnInit, OnDestroy { this.selectedRule = rule; } - openNewRuleDialog() { + openCreateUpdateRuleDialog(model = {}) { const dialogRef = this.matDialogService.open(EditRuleDialogSmartComponent, { width: '90%', - panelClass: 'aca-edit-rule-dialog-container' + panelClass: 'aca-edit-rule-dialog-container', + data: { + model + } }); this.onSubmitRuleDialog(dialogRef); @@ -115,7 +118,11 @@ export class ManageRulesSmartComponent implements OnInit, OnDestroy { onSubmitRuleDialog(dialogRef) { dialogRef.componentInstance.submitted.subscribe(async (rule) => { try { - await this.folderRulesService.createRule(this.nodeId, rule); + if (rule.id) { + await this.folderRulesService.updateRule(this.nodeId, rule.id, rule); + } else { + await this.folderRulesService.createRule(this.nodeId, rule); + } this.folderRulesService.loadRules(this.nodeId); dialogRef.close(); } catch (error) { @@ -140,4 +147,8 @@ export class ManageRulesSmartComponent implements OnInit, OnDestroy { } }); } + + onRuleUpdate(): void { + this.openCreateUpdateRuleDialog(this.selectedRule); + } } diff --git a/projects/aca-folder-rules/src/lib/rule-details/edit-rule-dialog.smart-component.ts b/projects/aca-folder-rules/src/lib/rule-details/edit-rule-dialog.smart-component.ts index 9fb69a8d4..1d2301a0d 100644 --- a/projects/aca-folder-rules/src/lib/rule-details/edit-rule-dialog.smart-component.ts +++ b/projects/aca-folder-rules/src/lib/rule-details/edit-rule-dialog.smart-component.ts @@ -47,12 +47,12 @@ export class EditRuleDialogSmartComponent implements OnInit { actionDefinitions$ = this.actionsService.actionDefinitionsListing$; loading$ = this.actionsService.loading$; - constructor(@Inject(MAT_DIALOG_DATA) public options: EditRuleDialogOptions, private actionsService: ActionsService) { - this.model = this.options?.model || {}; + constructor(@Inject(MAT_DIALOG_DATA) public data: EditRuleDialogOptions, private actionsService: ActionsService) { + this.model = this.data?.model || {}; } get isUpdateMode(): boolean { - return !!this.options?.model?.id; + return !!this.data?.model?.id; } get title(): string { diff --git a/projects/aca-folder-rules/src/lib/rule-details/options/rule-options.ui-component.html b/projects/aca-folder-rules/src/lib/rule-details/options/rule-options.ui-component.html index c51c4a063..582d3b1b6 100644 --- a/projects/aca-folder-rules/src/lib/rule-details/options/rule-options.ui-component.html +++ b/projects/aca-folder-rules/src/lib/rule-details/options/rule-options.ui-component.html @@ -25,11 +25,10 @@ {{ 'ACA_FOLDER_RULES.RULE_DETAILS.OPTIONS.DISABLE_RULE' | translate }} - diff --git a/projects/aca-folder-rules/src/lib/rule-details/rule-details.ui-component.ts b/projects/aca-folder-rules/src/lib/rule-details/rule-details.ui-component.ts index 94b7ae8e6..f5508905f 100644 --- a/projects/aca-folder-rules/src/lib/rule-details/rule-details.ui-component.ts +++ b/projects/aca-folder-rules/src/lib/rule-details/rule-details.ui-component.ts @@ -62,6 +62,7 @@ export class RuleDetailsUiComponent implements OnInit, OnDestroy { } set value(newValue: Partial) { newValue = { + id: newValue.id || FolderRulesService.emptyRule.id, name: newValue.name || FolderRulesService.emptyRule.name, description: newValue.description || FolderRulesService.emptyRule.description, triggers: newValue.triggers || FolderRulesService.emptyRule.triggers, @@ -69,7 +70,7 @@ export class RuleDetailsUiComponent implements OnInit, OnDestroy { isAsynchronous: newValue.isAsynchronous || FolderRulesService.emptyRule.isAsynchronous, errorScript: newValue.errorScript || FolderRulesService.emptyRule.errorScript, isInheritable: newValue.isInheritable || FolderRulesService.emptyRule.isInheritable, - isEnabled: newValue.isEnabled || FolderRulesService.emptyRule.isEnabled, + isEnabled: typeof newValue.isInheritable == 'boolean' ? newValue.isEnabled : FolderRulesService.emptyRule.isEnabled, actions: newValue.actions || FolderRulesService.emptyRule.actions }; if (this.form) { @@ -118,6 +119,7 @@ export class RuleDetailsUiComponent implements OnInit, OnDestroy { ngOnInit() { this.form = new UntypedFormGroup({ + id: new UntypedFormControl(this.value.id), name: new UntypedFormControl(this.value.name || '', Validators.required), description: new UntypedFormControl(this.value.description || ''), triggers: new UntypedFormControl(this.value.triggers || ['inbound'], Validators.required), diff --git a/projects/aca-folder-rules/src/lib/services/folder-rules.service.spec.ts b/projects/aca-folder-rules/src/lib/services/folder-rules.service.spec.ts index fa99c3f79..7c3c3d381 100644 --- a/projects/aca-folder-rules/src/lib/services/folder-rules.service.spec.ts +++ b/projects/aca-folder-rules/src/lib/services/folder-rules.service.spec.ts @@ -151,4 +151,13 @@ describe('FolderRulesService', () => { expect(result).toEqual(dummyRules[0]); }); }); + + it('should send correct PUT request to update rule and return it', async () => { + spyOn(folderRulesService, 'apiCall') + .withArgs(`/nodes/${nodeId}/rule-sets/${ruleSetId}/rules/${ruleId}`, 'PUT', paramsWithBody) + .and.returnValue(Promise.resolve(dummyRules[0])); + + const result = await folderRulesService.updateRule(nodeId, ruleId, dummyRules[0]); + expect(result).toEqual(dummyRules[0]); + }); }); diff --git a/projects/aca-folder-rules/src/lib/services/folder-rules.service.ts b/projects/aca-folder-rules/src/lib/services/folder-rules.service.ts index 9b61b90a8..7c2f368e7 100644 --- a/projects/aca-folder-rules/src/lib/services/folder-rules.service.ts +++ b/projects/aca-folder-rules/src/lib/services/folder-rules.service.ts @@ -118,7 +118,19 @@ export class FolderRulesService { {}, {}, {}, - { ...this.addFakeAction(rule) }, + { ...rule }, + ['application/json'], + ['application/json'] + ]); + } + + updateRule(nodeId: string, ruleId: string, rule: Rule, ruleSetId: string = '-default-') { + return this.apiCall(`/nodes/${nodeId}/rule-sets/${ruleSetId}/rules/${ruleId}`, 'PUT', [ + {}, + {}, + {}, + {}, + { ...rule }, ['application/json'], ['application/json'] ]); @@ -169,24 +181,6 @@ export class FolderRulesService { }); } - private addFakeAction(rule): Partial { - if (rule.actions) { - return rule; - } else { - return { - ...rule, - actions: [ - { - actionDefinitionId: 'add-features', - params: { - 'aspect-name': 'ai:creativeWorks' - } - } - ] - }; - } - } - private apiCall(path: string, httpMethod: string, params?: any[]): Promise { return this.apiService.getInstance().contentClient.callApi(path, httpMethod, ...params); }