@nakedobjects/gemini
Version:
Single Page Application client for a Naked Objects application.
100 lines • 18.9 kB
JavaScript
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==