UNPKG

@nakedobjects/gemini

Version:

Single Page Application client for a Naked Objects application.

100 lines 18.9 kB
import { Component, ViewChild, ViewContainerRef } from '@angular/core'; import * as Ro from '@nakedobjects/restful-objects'; import { ViewType } from '@nakedobjects/services'; import { PaneComponent } from '../pane/pane'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@nakedobjects/services"; import * as i3 from "../custom-component.service"; import * as i4 from "@angular/common"; import * as i5 from "../action-bar/action-bar.component"; export class DynamicListComponent extends PaneComponent { error; componentFactoryResolver; customComponentService; configService; parent; constructor(activatedRoute, urlManager, context, error, componentFactoryResolver, customComponentService, configService) { super(activatedRoute, urlManager, context); this.error = error; this.componentFactoryResolver = componentFactoryResolver; this.customComponentService = customComponentService; this.configService = configService; } reloadPlaceholderButton = { value: 'Reload', doClick: () => this.reload(), show: () => true, disabled: () => null, tempDisabled: () => null, title: () => '', accesskey: null, presentationHint: '', showDialog: () => false }; lastOid = null; title = ''; showPlaceholder = true; cachedRouteData; getActionExtensions(routeData) { return routeData.objectId ? this.context.getActionExtensionsFromObject(routeData.paneId, Ro.ObjectIdWrapper.fromObjectId(routeData.objectId, this.configService.config.keySeparator), routeData.actionId) : this.context.getActionExtensionsFromMenu(routeData.menuId, routeData.actionId); } reload() { const recreate = () => this.cachedRouteData.objectId ? this.context.getListFromObject(this.cachedRouteData) : this.context.getListFromMenu(this.cachedRouteData); recreate() .then(() => this.setup(this.cachedRouteData)) .catch((reject) => { this.error.handleError(reject); }); } get actionHolders() { return [this.reloadPlaceholderButton]; } doSetup(routeData) { return super.doSetup(routeData) || this.context.getCachedList(routeData.paneId, routeData.page, routeData.pageSize) == null; } setup(routeData) { this.cachedRouteData = routeData; const cachedList = this.context.getCachedList(routeData.paneId, routeData.page, routeData.pageSize); if (cachedList) { this.showPlaceholder = false; const et = cachedList.extensions().elementType(); if (et && et !== this.lastOid) { this.lastOid = et; this.parent?.clear(); this.customComponentService.getCustomComponent(et, ViewType.List).then(c => { const childComponent = this.componentFactoryResolver.resolveComponentFactory(c); this.parent?.createComponent(childComponent); }); } } else { this.showPlaceholder = true; this.title = 'List'; this.parent?.clear(); this.lastOid = null; // so we recreate child after reload this.getActionExtensions(routeData) .then((ext) => this.title = ext.friendlyName()) .catch((reject) => this.error.handleError(reject)); } } ngOnDestroy() { super.ngOnDestroy(); this.parent?.clear(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DynamicListComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.UrlManagerService }, { token: i2.ContextService }, { token: i2.ErrorService }, { token: i0.ComponentFactoryResolver }, { token: i3.CustomComponentService }, { token: i2.ConfigService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DynamicListComponent, selector: "nof-dynamic-list", viewQueries: [{ propertyName: "parent", first: true, predicate: ["parent"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: "<div [attr.id]=\"paneIdName\" [ngClass]=\"paneType\">\n <div #parent></div>\n <div *ngIf=\"showPlaceholder\"class=\"list\">\n <div class=\"header\">\n <div class=\"title\">\n {{title}}\n </div>\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n </div>\n </div>\n</div>\n<router-outlet (activate)=\"onChild()\" (deactivate)=\"onChildless()\"></router-outlet>\n", styles: [".list{color:var(--contrast-text-color);padding-left:var(--space-5);height:100%;overflow-y:auto;display:block;font-weight:var(--font-weight-1)}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}.title,.type{position:relative;font-weight:var(--font-weight-1);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:block}.type{float:left;margin-right:var(--space-5);display:none}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i5.ActionBarComponent, selector: "nof-action-bar", inputs: ["actions", "menuHolder"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DynamicListComponent, decorators: [{ type: Component, args: [{ selector: 'nof-dynamic-list', template: "<div [attr.id]=\"paneIdName\" [ngClass]=\"paneType\">\n <div #parent></div>\n <div *ngIf=\"showPlaceholder\"class=\"list\">\n <div class=\"header\">\n <div class=\"title\">\n {{title}}\n </div>\n <nof-action-bar [actions]=\"actionHolders\"></nof-action-bar>\n </div>\n </div>\n</div>\n<router-outlet (activate)=\"onChild()\" (deactivate)=\"onChildless()\"></router-outlet>\n", styles: [".list{color:var(--contrast-text-color);padding-left:var(--space-5);height:100%;overflow-y:auto;display:block;font-weight:var(--font-weight-1)}.header{display:block;margin-bottom:var(--space-5);overflow:hidden;color:var(--contrast-text-color);background-color:var(--header-background-color)}.title,.type{position:relative;font-weight:var(--font-weight-1);font-size:var(--font-size-4);line-height:38pt;margin-left:var(--space-1);padding-left:var(--space-3);padding-right:var(--space-3);margin-right:var(--space-5);margin-top:var(--space-1);display:block}.type{float:left;margin-right:var(--space-5);display:none}\n"] }] }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.UrlManagerService }, { type: i2.ContextService }, { type: i2.ErrorService }, { type: i0.ComponentFactoryResolver }, { type: i3.CustomComponentService }, { type: i2.ConfigService }], propDecorators: { parent: [{ type: ViewChild, args: ['parent', { read: ViewContainerRef, static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2dlbWluaS9zcmMvZHluYW1pYy1saXN0L2R5bmFtaWMtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2R5bmFtaWMtbGlzdC9keW5hbWljLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBdUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVHLE9BQU8sS0FBSyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEQsT0FBTyxFQUErRixRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUcvSSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7O0FBTzdDLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxhQUFhO0lBUzlCO0lBQ0E7SUFDQTtJQUNBO0lBVHJCLE1BQU0sQ0FBb0I7SUFFMUIsWUFDSSxjQUE4QixFQUM5QixVQUE2QixFQUM3QixPQUF1QixFQUNOLEtBQW1CLEVBQ25CLHdCQUFrRCxFQUNsRCxzQkFBOEMsRUFDOUMsYUFBNEI7UUFDN0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFKMUIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFFakQsQ0FBQztJQUVPLHVCQUF1QixHQUFrQjtRQUM3QyxLQUFLLEVBQUUsUUFBUTtRQUNmLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQzVCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO1FBQ2hCLFFBQVEsRUFB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cG9uZW50LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgKiBhcyBSbyBmcm9tICdAbmFrZWRvYmplY3RzL3Jlc3RmdWwtb2JqZWN0cyc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlLCBDb250ZXh0U2VydmljZSwgRXJyb3JTZXJ2aWNlLCBFcnJvcldyYXBwZXIsIFBhbmVSb3V0ZURhdGEsIFVybE1hbmFnZXJTZXJ2aWNlLCBWaWV3VHlwZSB9IGZyb20gJ0BuYWtlZG9iamVjdHMvc2VydmljZXMnO1xuaW1wb3J0IHsgSUFjdGlvbkhvbGRlciB9IGZyb20gJy4uL2FjdGlvbi9hY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IEN1c3RvbUNvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFuZUNvbXBvbmVudCB9IGZyb20gJy4uL3BhbmUvcGFuZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbm9mLWR5bmFtaWMtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICdkeW5hbWljLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydkeW5hbWljLWxpc3QuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNMaXN0Q29tcG9uZW50IGV4dGVuZHMgUGFuZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBAVmlld0NoaWxkKCdwYXJlbnQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYyA6IHRydWUgfSlcbiAgICBwYXJlbnQ/OiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgdXJsTWFuYWdlcjogVXJsTWFuYWdlclNlcnZpY2UsXG4gICAgICAgIGNvbnRleHQ6IENvbnRleHRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGVycm9yOiBFcnJvclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tQ29tcG9uZW50U2VydmljZTogQ3VzdG9tQ29tcG9uZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKGFjdGl2YXRlZFJvdXRlLCB1cmxNYW5hZ2VyLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbG9hZFBsYWNlaG9sZGVyQnV0dG9uOiBJQWN0aW9uSG9sZGVyID0ge1xuICAgICAgICB2YWx1ZTogJ1JlbG9hZCcsXG4gICAgICAgIGRvQ2xpY2s6ICgpID0+IHRoaXMucmVsb2FkKCksXG4gICAgICAgIHNob3c6ICgpID0+IHRydWUsXG4gICAgICAgIGRpc2FibGVkOiAoKSA9PiBudWxsLFxuICAgICAgICB0ZW1wRGlzYWJsZWQ6ICgpID0+IG51bGwsXG4gICAgICAgIHRpdGxlOiAoKSA9PiAnJyxcbiAgICAgICAgYWNjZXNza2V5OiBudWxsLFxuICAgICAgICBwcmVzZW50YXRpb25IaW50OiAnJyxcbiAgICAgICAgc2hvd0RpYWxvZzogKCkgPT4gZmFsc2VcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBsYXN0T2lkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICB0aXRsZSA9ICcnO1xuICAgIHNob3dQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgcHJpdmF0ZSBjYWNoZWRSb3V0ZURhdGEhOiBQYW5lUm91dGVEYXRhO1xuXG4gICAgZ2V0QWN0aW9uRXh0ZW5zaW9ucyhyb3V0ZURhdGE6IFBhbmVSb3V0ZURhdGEpOiBQcm9taXNlPFJvLkV4dGVuc2lvbnM+IHtcbiAgICAgICAgcmV0dXJuIHJvdXRlRGF0YS5vYmplY3RJZFxuICAgICAgICAgICAgPyB0aGlzLmNvbnRleHQuZ2V0QWN0aW9uRXh0ZW5zaW9uc0Zyb21PYmplY3Qocm91dGVEYXRhLnBhbmVJZCwgUm8uT2JqZWN0SWRXcmFwcGVyLmZyb21PYmplY3RJZChyb3V0ZURhdGEub2JqZWN0SWQsIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcua2V5U2VwYXJhdG9yKSwgcm91dGVEYXRhLmFjdGlvbklkISlcbiAgICAgICAgICAgIDogdGhpcy5jb250ZXh0LmdldEFjdGlvbkV4dGVuc2lvbnNGcm9tTWVudShyb3V0ZURhdGEubWVudUlkISwgcm91dGVEYXRhLmFjdGlvbklkISk7XG4gICAgfVxuXG4gICAgcmVsb2FkKCkge1xuXG4gICAgICAgIGNvbnN0IHJlY3JlYXRlID0gKCkgPT5cbiAgICAgICAgICAgIHRoaXMuY2FjaGVkUm91dGVEYXRhIS5vYmplY3RJZFxuICAgICAgICAgICAgICAgID8gdGhpcy5jb250ZXh0LmdldExpc3RGcm9tT2JqZWN0KHRoaXMuY2FjaGVkUm91dGVEYXRhKVxuICAgICAgICAgICAgICAgIDogdGhpcy5jb250ZXh0LmdldExpc3RGcm9tTWVudSh0aGlzLmNhY2hlZFJvdXRlRGF0YSk7XG5cbiAgICAgICAgcmVjcmVhdGUoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5zZXR1cCh0aGlzLmNhY2hlZFJvdXRlRGF0YSkpXG4gICAgICAgICAgICAuY2F0Y2goKHJlamVjdDogRXJyb3JXcmFwcGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvci5oYW5kbGVFcnJvcihyZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGFjdGlvbkhvbGRlcnMoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5yZWxvYWRQbGFjZWhvbGRlckJ1dHRvbl07XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGRvU2V0dXAocm91dGVEYXRhOiBQYW5lUm91dGVEYXRhKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5kb1NldHVwKHJvdXRlRGF0YSkgfHxcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5nZXRDYWNoZWRMaXN0KHJvdXRlRGF0YS5wYW5lSWQsIHJvdXRlRGF0YS5wYWdlISwgcm91dGVEYXRhLnBhZ2VTaXplISkgPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0dXAocm91dGVEYXRhOiBQYW5lUm91dGVEYXRhKSB7XG4gICAgICAgIHRoaXMuY2FjaGVkUm91dGVEYXRhID0gcm91dGVEYXRhO1xuICAgICAgICBjb25zdCBjYWNoZWRMaXN0ID0gdGhpcy5jb250ZXh0LmdldENhY2hlZExpc3Qocm91dGVEYXRhLnBhbmVJZCwgcm91dGVEYXRhLnBhZ2UhLCByb3V0ZURhdGEucGFnZVNpemUhKTtcblxuICAgICAgICBpZiAoY2FjaGVkTGlzdCkge1xuICAgICAgICAgICAgdGhpcy5zaG93UGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGV0ID0gY2FjaGVkTGlzdC5leHRlbnNpb25zKCkuZWxlbWVudFR5cGUoKTtcblxuICAgICAgICAgICAgaWYgKGV0ICYmIGV0ICE9PSB0aGlzLmxhc3RPaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RPaWQgPSBldDtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudD8uY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNvbXBvbmVudFNlcnZpY2UuZ2V0Q3VzdG9tQ29tcG9uZW50KGV0LCBWaWV3VHlwZS5MaXN0KS50aGVuKGMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGMgYXMgVHlwZTx1bmtub3duPik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Py5jcmVhdGVDb21wb25lbnQoY2hpbGRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnRpdGxlID0gJ0xpc3QnO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQ/LmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RPaWQgPSBudWxsOyAvLyBzbyB3ZSByZWNyZWF0ZSBjaGlsZCBhZnRlciByZWxvYWRcbiAgICAgICAgICAgIHRoaXMuZ2V0QWN0aW9uRXh0ZW5zaW9ucyhyb3V0ZURhdGEpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGV4dDogUm8uRXh0ZW5zaW9ucykgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aXRsZSA9IGV4dC5mcmllbmRseU5hbWUoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKHJlamVjdDogRXJyb3JXcmFwcGVyKSA9PiB0aGlzLmVycm9yLmhhbmRsZUVycm9yKHJlamVjdCkpO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wYXJlbnQ/LmNsZWFyKCk7XG4gICAgfVxufVxuIiwiPGRpdiBbYXR0ci5pZF09XCJwYW5lSWROYW1lXCIgW25nQ2xhc3NdPVwicGFuZVR5cGVcIj5cbiAgICA8ZGl2ICNwYXJlbnQ+PC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInNob3dQbGFjZWhvbGRlclwiY2xhc3M9XCJsaXN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgIHt7dGl0bGV9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bm9mLWFjdGlvbi1iYXIgW2FjdGlvbnNdPVwiYWN0aW9uSG9sZGVyc1wiPjwvbm9mLWFjdGlvbi1iYXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48cm91dGVyLW91dGxldCAoYWN0aXZhdGUpPVwib25DaGlsZCgpXCIgKGRlYWN0aXZhdGUpPVwib25DaGlsZGxlc3MoKVwiPjwvcm91dGVyLW91dGxldD5cbiJdfQ==