diff --git a/smp-angular/src/app/edit/edit-domain/domain-group-panel/domain-group.component.ts b/smp-angular/src/app/edit/edit-domain/domain-group-panel/domain-group.component.ts index ee27b6546e67e6177a7447e3aa964ba524dace66..660c3f7387de4fb7e12783f1146aa9f4f1ca30b0 100644 --- a/smp-angular/src/app/edit/edit-domain/domain-group-panel/domain-group.component.ts +++ b/smp-angular/src/app/edit/edit-domain/domain-group-panel/domain-group.component.ts @@ -29,6 +29,9 @@ import {lastValueFrom} from "rxjs"; import { SmpTableColDef } from "../../../common/components/smp-table/smp-table-coldef.model"; +import { + EditResourceController +} from "../../edit-resources/edit-resource.controller"; @Component({ selector: 'domain-group-panel', @@ -52,6 +55,7 @@ export class DomainGroupComponent implements OnInit, BeforeLeaveGuard { selectedGroup: GroupRo; constructor(private editDomainService: EditDomainService, + private editResourceController: EditResourceController, private alertService: AlertMessageService, private dialog: MatDialog, private formBuilder: FormBuilder, @@ -216,6 +220,7 @@ export class DomainGroupComponent implements OnInit, BeforeLeaveGuard { if (result) { this.alertService.success(await lastValueFrom(this.translateService.get("domain.group.success.delete", {groupName: result.groupName}))); this.onGroupSelected(null); + this.editResourceController.dataChanged = true; this.refresh() } }, (error) => { diff --git a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.ts b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.ts index 6f24f1b9b81c12356f7607c3f3227dce511b99c8..4368213e44e4ed1d6d25d4dafa06af930bc352a8 100644 --- a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.ts +++ b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.ts @@ -6,6 +6,9 @@ import {AlertMessageService} from "../../../../common/alert-message/alert-messag import {VisibilityEnum} from "../../../../common/enums/visibility.enum"; import {GroupRo} from "../../../../common/model/group-ro.model"; import {EditDomainService} from "../../edit-domain.service"; +import { + EditResourceController +} from "../../../edit-resources/edit-resource.controller"; @Component({ @@ -29,6 +32,7 @@ export class GroupDialogComponent { constructor(@Inject(MAT_DIALOG_DATA) public data: any, private editDomainService: EditDomainService, + private editResourceController: EditResourceController, public dialogRef: MatDialogRef<GroupDialogComponent>, private alertService: AlertMessageService, private formBuilder: FormBuilder @@ -112,6 +116,7 @@ export class GroupDialogComponent { this.editDomainService.createDomainGroupObservable(this._currentDomain.domainId, group).subscribe((group: GroupRo) => { if (!!group) { + this.editResourceController.dataChanged = true; this.closeDialog(); } }, (error) => { @@ -126,6 +131,7 @@ export class GroupDialogComponent { public saveGroup(group: GroupRo) { this.editDomainService.saveDomainGroupObservable(this._currentDomain.domainId, group).subscribe((group: GroupRo) => { if (!!group) { + this.editResourceController.dataChanged = true; this.closeDialog(); } }, (error) => { diff --git a/smp-angular/src/app/edit/edit-group/group-resource-panel/group-resource-panel.component.ts b/smp-angular/src/app/edit/edit-group/group-resource-panel/group-resource-panel.component.ts index 326d15ef158a4c232a8bbd0c7243a810f50123f6..1901c0cdb5641392992bcc39c4d3b505ae16fe7f 100644 --- a/smp-angular/src/app/edit/edit-group/group-resource-panel/group-resource-panel.component.ts +++ b/smp-angular/src/app/edit/edit-group/group-resource-panel/group-resource-panel.component.ts @@ -34,6 +34,9 @@ import {MatTableDataSource} from "@angular/material/table"; import { SmpTableColDef } from "../../../common/components/smp-table/smp-table-coldef.model"; +import { + EditResourceController +} from "../../edit-resources/edit-resource.controller"; @Component({ selector: 'group-resource-panel', @@ -58,6 +61,7 @@ export class GroupResourcePanelComponent implements BeforeLeaveGuard { columns: SmpTableColDef[]; constructor(private editGroupService: EditGroupService, + private editResourceController: EditResourceController, private alertService: AlertMessageService, private dialog: MatDialog, private translateService: TranslateService) { @@ -220,6 +224,7 @@ export class GroupResourcePanelComponent implements BeforeLeaveGuard { this.editGroupService.deleteResourceFromGroup(resource, this._group, this.domain) .pipe( finalize(() => { + this.editResourceController.dataChanged = true; this.refresh(); this.isLoadingResults = false; })) diff --git a/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.ts b/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.ts index b2595a6a3cefd8b5e3affed7e8275d8e6e5cd04d..44f48e5c40c6c5cf051e2624a0303327a352075e 100644 --- a/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.ts +++ b/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.ts @@ -31,6 +31,9 @@ import { DomainPropertyRo } from "../../../../common/model/domain-property-ro.model"; import {Subscription} from "rxjs"; +import { + EditResourceController +} from "../../../edit-resources/edit-resource.controller"; @Component({ @@ -67,6 +70,7 @@ export class ResourceDialogComponent implements OnInit { public dialogRef: MatDialogRef<ResourceDialogComponent>, private editGroupService: EditGroupService, private editResourceService: EditResourceService, + private editResourceController: EditResourceController, private alertService: AlertMessageService, private httpErrorHandlerService: HttpErrorHandlerService, private editDomainService: EditDomainService, @@ -224,6 +228,8 @@ export class ResourceDialogComponent implements OnInit { this.editGroupService.createResourceForGroup(this.resource, this.group, this.domain).subscribe({ next: (result: ResourceRo) => { if (!!result) { + // refresh the domains/groups/resources for user to see the changes + this.editResourceController.dataChanged = true; this.closeDialog(); } this.submitInProgress = false; @@ -239,6 +245,8 @@ export class ResourceDialogComponent implements OnInit { this.editResourceService.updateResourceForGroup(resource, this.group, this.domain).subscribe({ next: (result: ResourceRo): void => { if (!!result) { + // refresh the domains/groups/resources for user to see the changes + this.editResourceController.dataChanged = true; this.closeDialog(); } this.submitInProgress = false; diff --git a/smp-angular/src/app/edit/edit-resources/edit-resource.component.ts b/smp-angular/src/app/edit/edit-resources/edit-resource.component.ts index 2271a143d0148308fa26d61f1ba3964d7c391225..0577e4e00d47c05726d482ffec255f618c48778d 100644 --- a/smp-angular/src/app/edit/edit-resources/edit-resource.component.ts +++ b/smp-angular/src/app/edit/edit-resources/edit-resource.component.ts @@ -47,6 +47,8 @@ export class EditResourceComponent implements OnInit, BeforeLeaveGuard { ngOnInit() { console.log("EditResourceComponent: ngOnInit " + this.columns.length); + this.editResourceController.refreshDataOnDataChange(); + if (!this.selectedResource) { this.editResourceController.refreshDomains(); } else { diff --git a/smp-angular/src/app/edit/edit-resources/edit-resource.controller.ts b/smp-angular/src/app/edit/edit-resources/edit-resource.controller.ts index 899324fca1adca87f78252926bf3047cdebfdaa6..6f9d9581948bcbf3bfe6104c6c998879694351fa 100644 --- a/smp-angular/src/app/edit/edit-resources/edit-resource.controller.ts +++ b/smp-angular/src/app/edit/edit-resources/edit-resource.controller.ts @@ -28,13 +28,16 @@ export class EditResourceController extends MatTableDataSource<ResourceRo> { domainList: DomainRo[] = []; groupList: GroupRo[] = []; + // data changed indicates the cached data may be outdated and need to be refreshed + _dataChanged: boolean = false; + _isLoadingResults:boolean = false; + _selectedDomain: DomainRo; _selectedGroup: GroupRo; _selectedResource: ResourceRo; _selectedDomainResourceDefs: ResourceDefinitionRo[]; resourcesFilter: any = {}; - isLoadingResults = false; dataLength:number = 0; pageIndex:number = 0; @@ -58,6 +61,29 @@ export class EditResourceController extends MatTableDataSource<ResourceRo> { }); } + // this flag is used to trigger data refresh when data is needed. + //The data can be changed for the user when adding/creating new resource in the edit group + @Input() set dataChanged(value: boolean) { + this._dataChanged = value; + } + + get dataChanged(): boolean { + return this._dataChanged; + } + + // this flag is used to trigger data refresh when data is needed. + //The data can be changed for the user when adding/creating new resource in the edit group + @Input() set isLoadingResults(value: boolean) { + if (!value) { + // data was loaded, and we can reset the flag for data changed + this._dataChanged = value + } + this._isLoadingResults = value; + } + + get isLoadingResults(): boolean { + return this._isLoadingResults; + } private clearSelectedData() { this.domainList = []; @@ -77,7 +103,7 @@ export class EditResourceController extends MatTableDataSource<ResourceRo> { @Input() set selectedDomain(domain: DomainRo) { this._selectedDomain = domain; - if (!!this.selectedDomain) { + if (!!this.selectedDomain || this.dataChanged) { this.refreshGroups(); this.refreshDomainsResourceDefinitions(); } else { @@ -93,7 +119,7 @@ export class EditResourceController extends MatTableDataSource<ResourceRo> { @Input() set selectedGroup(resource: GroupRo) { this._selectedGroup = resource; - if (!!this._selectedGroup) { + if (!!this._selectedGroup || this.dataChanged ) { this.refreshResources(); } else { this.isLoadingResults = false; @@ -123,6 +149,15 @@ export class EditResourceController extends MatTableDataSource<ResourceRo> { this._selectedResource = resource; }; + /** + * Method refreshes data when data changed + */ + refreshDataOnDataChange() { + if (this.dataChanged) { + this.refreshDomains(); + } + } + refreshDomains() { this.isLoadingResults = true; @@ -140,6 +175,7 @@ export class EditResourceController extends MatTableDataSource<ResourceRo> { refreshGroups() { if (!this.selectedDomain) { this.updateGroupList([]); + this.isLoadingResults = false; return; } @@ -191,6 +227,7 @@ export class EditResourceController extends MatTableDataSource<ResourceRo> { if (!!this.domainList && this.domainList.length > 0) { this.selectedDomain = this.domainList[0]; } else { + this._dataChanged = false; this.isLoadingResults = false; } } @@ -200,6 +237,7 @@ export class EditResourceController extends MatTableDataSource<ResourceRo> { if (!!this.groupList && this.groupList.length > 0) { this.selectedGroup = this.groupList[0]; } else { + this._dataChanged = false; this.isLoadingResults = false; } } diff --git a/smp-angular/src/assets/i18n/en.json b/smp-angular/src/assets/i18n/en.json index 6beaf4bdd7c6bd8d6776b23e758c985bb412e18b..3287378a1e05981dcd9b8fd2af63512ee42bface 100644 --- a/smp-angular/src/assets/i18n/en.json +++ b/smp-angular/src/assets/i18n/en.json @@ -547,7 +547,7 @@ "edit.resource.placeholder.filter": "Resource filter", "edit.resource.placeholder.selected.domain": "Select domain", "edit.resource.placeholder.selected.group": "Select group", - "edit.resource.text": "Edit resource administration panel is a tool for resource administrators to administer the resource", + "edit.resource.text": "Edit resource administration panel is a tool for resource administrators to administer the resource.<br /><b>Note:</b>Only domains and groups where the user is a resource administrator are shown.", "edit.resource.title": "Edit Resource", "edit.resource.tooltip.selected.domain": "Select domain.", "edit.resource.tooltip.selected.group": "Select group.",