@c8y/ngx-components 1024.20.1 → 1024.21.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs +527 -12
- package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +31 -9
- package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ai.mjs +503 -62
- package/fesm2022/c8y-ngx-components-ai.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs +2 -2
- package/fesm2022/c8y-ngx-components-alarm-event-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +3 -3
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-application-access-list.mjs +1 -1
- package/fesm2022/c8y-ngx-components-application-access-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-application-select.mjs +1 -1
- package/fesm2022/c8y-ngx-components-application-select.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +3 -2
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-bookmarks.mjs +1 -1
- package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs +5 -5
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-Jyjkv4JT.mjs → c8y-ngx-components-context-dashboard-dashboard-version-history.component-CP1afwVe.mjs} +2 -2
- package/fesm2022/{c8y-ngx-components-context-dashboard-dashboard-version-history.component-Jyjkv4JT.mjs.map → c8y-ngx-components-context-dashboard-dashboard-version-history.component-CP1afwVe.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +81 -20
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-UEUYsXBv.mjs → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-CRvgIgri.mjs} +2 -2
- package/fesm2022/{c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-UEUYsXBv.mjs.map → c8y-ngx-components-dashboard-details-advanced-tab-dashboard-details-advanced-tab.component-CRvgIgri.mjs.map} +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-details-advanced-tab.mjs +2 -2
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +3 -3
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +2 -2
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +2 -2
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-diagnostics.mjs +1 -1
- package/fesm2022/c8y-ngx-components-diagnostics.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +146 -126
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +2 -2
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +4 -4
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +1 -1
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-events.mjs +2 -2
- package/fesm2022/c8y-ngx-components-events.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs +4 -4
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +2 -2
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +2 -2
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +2 -2
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs +5 -5
- package/fesm2022/c8y-ngx-components-protocol-lpwan.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs +3 -3
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs +1 -1
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs +1 -1
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +4 -4
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +4 -4
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-shared.mjs +2 -2
- package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +3 -3
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs +1 -1
- package/fesm2022/c8y-ngx-components-static-assets-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tracking.mjs +1 -1
- package/fesm2022/c8y-ngx-components-tracking.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs +17 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs +21 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-scada.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +60 -31
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs +2 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-image.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-quick-links.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +500 -38
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +72 -0
- package/locales/es.po +72 -0
- package/locales/fr.po +72 -0
- package/locales/ja_JP.po +72 -0
- package/locales/ko.po +72 -0
- package/locales/locales.pot +72 -3
- package/locales/nl.po +72 -0
- package/locales/pl.po +73 -1
- package/locales/pt_BR.po +74 -2
- package/locales/zh_CN.po +72 -0
- package/locales/zh_TW.po +72 -0
- package/package.json +1 -1
- package/types/c8y-ngx-components-ai-agent-chat.d.ts +201 -3
- package/types/c8y-ngx-components-ai-agent-chat.d.ts.map +1 -1
- package/types/c8y-ngx-components-ai-ai-chat.d.ts +14 -4
- package/types/c8y-ngx-components-ai-ai-chat.d.ts.map +1 -1
- package/types/c8y-ngx-components-ai.d.ts +157 -2
- package/types/c8y-ngx-components-ai.d.ts.map +1 -1
- package/types/c8y-ngx-components-asset-properties.d.ts.map +1 -1
- package/types/c8y-ngx-components-context-dashboard.d.ts +37 -3
- package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
- package/types/c8y-ngx-components-echart.d.ts +6 -0
- package/types/c8y-ngx-components-echart.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-asset-table.d.ts +5 -0
- package/types/c8y-ngx-components-widgets-implementations-asset-table.d.ts.map +1 -1
- package/types/c8y-ngx-components.d.ts +310 -12
- package/types/c8y-ngx-components.d.ts.map +1 -1
|
@@ -108,7 +108,7 @@ class StaticAssetsFileListComponent {
|
|
|
108
108
|
document.getElementById(this.styleTagId)?.remove();
|
|
109
109
|
}
|
|
110
110
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: StaticAssetsFileListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
111
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.19", type: StaticAssetsFileListComponent, isStandalone: true, selector: "c8y-static-assets-file-list", inputs: { inModalView: { classPropertyName: "inModalView", publicName: "inModalView", isSignal: true, isRequired: false, transformFunction: null }, assetType: { classPropertyName: "assetType", publicName: "assetType", isSignal: true, isRequired: false, transformFunction: null }, supportedFileExtensions: { classPropertyName: "supportedFileExtensions", publicName: "supportedFileExtensions", isSignal: true, isRequired: false, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelected: "itemSelected" }, viewQueries: [{ propertyName: "dropArea", first: true, predicate: DropAreaComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *ngIf=\"files$ | async as assets; else loading\">\n <div\n class=\"text-center sticky-top separator-bottom bg-component\"\n style=\"z-index: 1001\"\n >\n <p\n class=\"m-0 p-16\"\n *ngIf=\"assets.length\"\n >\n {{ 'Select from the list below or`first part, followed by upload a new asset`' | translate }}\n <button\n class=\"btn-link\"\n aria-controls=\"collapseUpload\"\n [attr.aria-expanded]=\"isExpanded\"\n (click)=\"isExpanded = !isExpanded\"\n >\n {{ 'upload a new asset' | translate }}\n </button>\n </p>\n <div\n class=\"collapse\"\n id=\"collapseUpload\"\n [isAnimated]=\"true\"\n [collapse]=\"!isExpanded\"\n >\n <div class=\"p-t-24 p-l-24 p-r-24 bg-level-1 separator-top-bottom p-b-32\">\n <c8y-drop-area\n class=\"drop-area-sm m-b-8\"\n [icon]=\"'upload'\"\n [accept]=\"accept$ | async\"\n (dropped)=\"addFiles($event)\"\n ></c8y-drop-area>\n <c8y-messages\n [helpMessage]=\"\n 'After uploading, the asset will be visible in the list below.' | translate\n \"\n ></c8y-messages>\n </div>\n </div>\n </div>\n <div *ngIf=\"assets.length\">\n <c8y-list-group\n class=\"m-b-0\"\n *ngIf=\"layout() != 'grid'\"\n >\n <c8y-list-item *ngFor=\"let asset of assets\">\n <c8y-list-item-icon icon=\"file\"></c8y-list-item-icon>\n\n <c8y-list-item-body>\n <div class=\"row\">\n <div class=\"col-md-3 col-xs-12 d-flex a-i-center\">\n <div\n class=\"text-truncate\"\n title=\"{{ asset.fileName }}\"\n >\n {{ asset.fileName }}\n </div>\n <button\n class=\"btn-dot m-l-4\"\n [title]=\"'Preview' | translate\"\n [popover]=\"preview\"\n placement=\"end\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n >\n <i [c8yIcon]=\"'eye'\"></i>\n </button>\n <ng-template #preview>\n <div class=\"bg-checkered\">\n <img\n class=\"fit-w\"\n [alt]=\"asset.fileName\"\n [src]=\"asset.path\"\n />\n </div>\n </ng-template>\n </div>\n <div class=\"col-md-3 col-xs-12 text-muted\">\n <code class=\"text-10\">{{ asset.type }}</code>\n </div>\n <div class=\"col-md-2 col-xs-12 text-muted\">\n <span class=\"small\">{{ asset.size | bytes }}</span>\n </div>\n <div\n class=\"col-md-2 col-xs-12 text-muted\"\n [title]=\"asset.addedAt | c8yDate\"\n >\n <div class=\"icon-flex small\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'calendar'\"\n ></i>\n <span>{{ asset.addedAt | c8yDate }}</span>\n </div>\n </div>\n <div class=\"col-md-2 col-xs-12 d-flex\">\n <button\n class=\"btn btn-default btn-sm m-l-auto showOnHover\"\n (click)=\"select(asset)\"\n translate\n >\n Select\n </button>\n </div>\n </div>\n </c8y-list-item-body>\n </c8y-list-item>\n </c8y-list-group>\n <div\n class=\"card-group-block interact-grid\"\n *ngIf=\"layout() === 'grid'\"\n >\n <button\n class=\"card btn-clean interact pointer\"\n [ngClass]=\"{\n 'col-md-3 col-sm-4 col-xs-12': inModalView(),\n 'col-md-1 col-sm-3 col-xs-12': !inModalView()\n }\"\n *ngFor=\"let asset of assets\"\n (click)=\"select(asset)\"\n >\n <div class=\"card-block\">\n <ng-container [ngSwitch]=\"asset | staticAssetMainType\">\n <div\n class=\"bg-checkered\"\n *ngSwitchCase=\"'image'\"\n >\n <img\n class=\"img-responsive m-auto img-square\"\n [alt]=\"asset.fileName\"\n [src]=\"asset.path\"\n />\n </div>\n <div\n class=\"bg-checkered\"\n *ngSwitchCase=\"'font'\"\n >\n <div\n class=\"img-responsive m-auto img-square\"\n [ngStyle]=\"{ 'font-family': asset.hashSum }\"\n >\n <p class=\"fit-h text-balance text-truncate-wrap\">\n <!-- intentionally not translated -->\n The quick brown fox jumps over the lazy dog.\n </p>\n </div>\n </div>\n <div\n class=\"bg-checkered\"\n *ngSwitchDefault\n >\n <div class=\"img-responsive m-auto img-square d-flex a-i-center j-c-center\">\n <i\n class=\"icon-2x\"\n [c8yIcon]=\"'file'\"\n ></i>\n </div>\n </div>\n </ng-container>\n <p\n class=\"text-medium text-truncate-wrap m-t-8\"\n [title]=\"asset.fileName\"\n >\n <a\n [href]=\"asset.path\"\n download\n (click)=\"$event.stopPropagation()\"\n >\n <i [c8yIcon]=\"'download'\"></i>\n {{ asset.fileName }}\n </a>\n </p>\n <p class=\"m-b-4\">\n <code class=\"text-10\">{{ asset.type }}</code>\n </p>\n <p class=\"small text-muted d-flex flex-wrap a-i-center\">\n {{ asset.size | bytes }}\n <span class=\"m-l-auto\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'calendar'\"\n ></i>\n <span>{{ asset.addedAt | c8yDate }}</span>\n </span>\n </p>\n </div>\n </button>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"p-24\">\n <c8y-loading></c8y-loading>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "progressLabel", "message"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "directive", type: i1.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: StaticAssetMainTypePipe, name: "staticAssetMainType" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
111
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.19", type: StaticAssetsFileListComponent, isStandalone: true, selector: "c8y-static-assets-file-list", inputs: { inModalView: { classPropertyName: "inModalView", publicName: "inModalView", isSignal: true, isRequired: false, transformFunction: null }, assetType: { classPropertyName: "assetType", publicName: "assetType", isSignal: true, isRequired: false, transformFunction: null }, supportedFileExtensions: { classPropertyName: "supportedFileExtensions", publicName: "supportedFileExtensions", isSignal: true, isRequired: false, transformFunction: null }, layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelected: "itemSelected" }, viewQueries: [{ propertyName: "dropArea", first: true, predicate: DropAreaComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *ngIf=\"files$ | async as assets; else loading\">\n <div\n class=\"text-center sticky-top separator-bottom bg-component\"\n style=\"z-index: 1001\"\n >\n <p\n class=\"m-0 p-16\"\n *ngIf=\"assets.length\"\n >\n {{ 'Select from the list below or`first part, followed by upload a new asset`' | translate }}\n <button\n class=\"btn-link\"\n aria-controls=\"collapseUpload\"\n [attr.aria-expanded]=\"isExpanded\"\n (click)=\"isExpanded = !isExpanded\"\n >\n {{ 'upload a new asset' | translate }}\n </button>\n </p>\n <div\n class=\"collapse\"\n id=\"collapseUpload\"\n [isAnimated]=\"true\"\n [collapse]=\"!isExpanded\"\n >\n <div class=\"p-t-24 p-l-24 p-r-24 bg-level-1 separator-top-bottom p-b-32\">\n <c8y-drop-area\n class=\"drop-area-sm m-b-8\"\n [icon]=\"'upload'\"\n [accept]=\"accept$ | async\"\n (dropped)=\"addFiles($event)\"\n ></c8y-drop-area>\n <c8y-messages\n [helpMessage]=\"\n 'After uploading, the asset will be visible in the list below.' | translate\n \"\n ></c8y-messages>\n </div>\n </div>\n </div>\n <div *ngIf=\"assets.length\">\n <c8y-list-group\n class=\"m-b-0\"\n *ngIf=\"layout() != 'grid'\"\n >\n <c8y-list-item *ngFor=\"let asset of assets\">\n <c8y-list-item-icon icon=\"file\"></c8y-list-item-icon>\n\n <c8y-list-item-body>\n <div class=\"row\">\n <div class=\"col-md-3 col-xs-12 d-flex a-i-center\">\n <div\n class=\"text-truncate\"\n title=\"{{ asset.fileName }}\"\n >\n {{ asset.fileName }}\n </div>\n <button\n class=\"btn-dot m-l-4\"\n [title]=\"'Preview' | translate\"\n [popover]=\"preview\"\n placement=\"end\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n >\n <i [c8yIcon]=\"'eye'\"></i>\n </button>\n <ng-template #preview>\n <div class=\"bg-checkered\">\n <img\n class=\"fit-w\"\n [alt]=\"asset.fileName\"\n [src]=\"asset.path\"\n />\n </div>\n </ng-template>\n </div>\n <div class=\"col-md-3 col-xs-12 text-muted\">\n <code class=\"text-10\">{{ asset.type }}</code>\n </div>\n <div class=\"col-md-2 col-xs-12 text-muted\">\n <span class=\"small\">{{ asset.size | bytes }}</span>\n </div>\n <div\n class=\"col-md-2 col-xs-12 text-muted\"\n [title]=\"asset.addedAt | c8yDate\"\n >\n <div class=\"icon-flex small\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'calendar'\"\n ></i>\n <span>{{ asset.addedAt | c8yDate }}</span>\n </div>\n </div>\n <div class=\"col-md-2 col-xs-12 d-flex\">\n <button\n class=\"btn btn-default btn-sm m-l-auto showOnHover\"\n (click)=\"select(asset)\"\n translate\n >\n Select\n </button>\n </div>\n </div>\n </c8y-list-item-body>\n </c8y-list-item>\n </c8y-list-group>\n <div\n class=\"card-group-block interact-grid\"\n *ngIf=\"layout() === 'grid'\"\n >\n <button\n class=\"card btn-clean interact pointer\"\n [ngClass]=\"{\n 'col-md-3 col-sm-4 col-xs-12': inModalView(),\n 'col-md-1 col-sm-3 col-xs-12': !inModalView()\n }\"\n *ngFor=\"let asset of assets\"\n (click)=\"select(asset)\"\n >\n <div class=\"card-block\">\n <ng-container [ngSwitch]=\"asset | staticAssetMainType\">\n <div\n class=\"bg-checkered\"\n *ngSwitchCase=\"'image'\"\n >\n <img\n class=\"img-responsive m-auto img-square\"\n [alt]=\"asset.fileName\"\n [src]=\"asset.path\"\n />\n </div>\n <div\n class=\"bg-checkered\"\n *ngSwitchCase=\"'font'\"\n >\n <div\n class=\"img-responsive m-auto img-square\"\n [ngStyle]=\"{ 'font-family': asset.hashSum }\"\n >\n <p class=\"fit-h text-balance text-truncate-wrap\">\n <!-- intentionally not translated -->\n The quick brown fox jumps over the lazy dog.\n </p>\n </div>\n </div>\n <div\n class=\"bg-checkered\"\n *ngSwitchDefault\n >\n <div class=\"img-responsive m-auto img-square d-flex a-i-center j-c-center\">\n <i\n class=\"icon-2x\"\n [c8yIcon]=\"'file'\"\n ></i>\n </div>\n </div>\n </ng-container>\n <p\n class=\"text-medium text-truncate-wrap m-t-8\"\n [title]=\"asset.fileName\"\n >\n <a\n [href]=\"asset.path\"\n download\n (click)=\"$event.stopPropagation()\"\n >\n <i [c8yIcon]=\"'download'\"></i>\n {{ asset.fileName }}\n </a>\n </p>\n <p class=\"m-b-4\">\n <code class=\"text-10\">{{ asset.type }}</code>\n </p>\n <p class=\"small text-muted d-flex flex-wrap a-i-center\">\n {{ asset.size | bytes }}\n <span class=\"m-l-auto\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'calendar'\"\n ></i>\n <span>{{ asset.addedAt | c8yDate }}</span>\n </span>\n </p>\n </div>\n </button>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"p-24\">\n <c8y-loading></c8y-loading>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "progressLabel", "message"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage", "additionalMessages"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable", "selectOnClick"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "directive", type: i1.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: StaticAssetMainTypePipe, name: "staticAssetMainType" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
112
112
|
}
|
|
113
113
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: StaticAssetsFileListComponent, decorators: [{
|
|
114
114
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-static-assets-modal.mjs","sources":["../../static-assets/modal/static-asset-main-type.pipe.ts","../../static-assets/modal/static-assets-file-list/static-assets-file-list.component.ts","../../static-assets/modal/static-assets-file-list/static-assets-file-list.component.html","../../static-assets/modal/static-assets-modal.component.ts","../../static-assets/modal/static-assets-modal.component.html","../../static-assets/modal/c8y-ngx-components-static-assets-modal.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { StaticAsset } from '@c8y/ngx-components/static-assets/data';\n\n@Pipe({\n name: 'staticAssetMainType',\n pure: true,\n standalone: true\n})\nexport class StaticAssetMainTypePipe implements PipeTransform {\n supportedTypes = ['image', 'font'];\n\n transform(value: Pick<StaticAsset, 'type'> | StaticAsset): string {\n if (!value?.type) {\n return 'unknown';\n }\n\n const typePrefix = value.type.replace(/\\/.*$/, '');\n\n if (this.supportedTypes.includes(typePrefix)) {\n return typePrefix;\n }\n\n return 'unknown';\n }\n}\n","import {\n AsyncPipe,\n NgClass,\n NgForOf,\n NgIf,\n NgStyle,\n NgSwitch,\n NgSwitchCase,\n NgSwitchDefault\n} from '@angular/common';\nimport { Component, inject, input, OnDestroy, output, viewChild, ChangeDetectionStrategy } from '@angular/core';\nimport {\n AlertService,\n BytesPipe,\n C8yTranslateDirective,\n C8yTranslatePipe,\n DatePipe,\n DropAreaComponent,\n DroppedFile,\n IconDirective,\n ListGroupComponent,\n ListItemBodyComponent,\n ListItemComponent,\n ListItemIconComponent,\n LoadingComponent,\n MessagesComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { combineLatest, firstValueFrom, merge, Observable, Subject } from 'rxjs';\nimport { first, map, shareReplay, switchMap, tap } from 'rxjs/operators';\nimport {\n StaticAsset,\n StaticAssetsService,\n StaticAssetType\n} from '@c8y/ngx-components/static-assets/data';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { StaticAssetMainTypePipe } from '../static-asset-main-type.pipe';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-static-assets-file-list',\n templateUrl: './static-assets-file-list.component.html',\n standalone: true,\n imports: [\n NgForOf,\n NgIf,\n AsyncPipe,\n DatePipe,\n BytesPipe,\n LoadingComponent,\n DropAreaComponent,\n C8yTranslatePipe,\n C8yTranslateDirective,\n MessagesComponent,\n ListGroupComponent,\n ListItemComponent,\n ListItemIconComponent,\n ListItemBodyComponent,\n PopoverDirective,\n CollapseModule,\n NgStyle,\n NgClass,\n IconDirective,\n StaticAssetMainTypePipe,\n NgSwitch,\n NgSwitchCase,\n NgSwitchDefault\n ],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class StaticAssetsFileListComponent implements OnDestroy {\n itemSelected = output<StaticAsset>();\n inModalView = input<boolean>(false);\n assetType = input<StaticAssetType>('branding');\n supportedFileExtensions = input<string[]>([]);\n layout = input<'list' | 'grid'>('grid');\n files$: Observable<StaticAsset[]>;\n accept$: Observable<string>;\n isExpanded = false;\n private _unfilteredFiles$: Observable<StaticAsset[]>;\n private _filesUpdate$ = new Subject<StaticAsset[]>();\n private styleTagId = `static-assets-font-faces`;\n private dropArea = viewChild(DropAreaComponent);\n private alert = inject(AlertService);\n private translate = inject(TranslateService);\n private staticAssets = inject(StaticAssetsService);\n\n constructor() {\n this._unfilteredFiles$ = merge(\n toObservable(this.assetType).pipe(\n switchMap(assetType => this.staticAssets.listFiles(assetType))\n ),\n this._filesUpdate$\n ).pipe(shareReplay({ bufferSize: 1, refCount: true }));\n\n this.files$ = combineLatest([\n this._unfilteredFiles$,\n toObservable(this.supportedFileExtensions)\n ]).pipe(\n map(([files, supportedFileExtensions]) =>\n supportedFileExtensions?.length\n ? files.filter(tmp => supportedFileExtensions.includes(tmp.extension.toLowerCase()))\n : files\n ),\n map(files =>\n files.sort((a, b) => (a.addedAt < b.addedAt ? 1 : a.addedAt > b.addedAt ? -1 : 0))\n ),\n tap(files => {\n if (!files.length) {\n this.isExpanded = true;\n }\n }),\n shareReplay({ bufferSize: 1, refCount: true })\n );\n\n this.accept$ = toObservable(this.supportedFileExtensions).pipe(map(exts => exts.join(',')));\n this.files$.pipe(takeUntilDestroyed()).subscribe(files => this.applyStylesForFiles(files));\n }\n\n ngOnDestroy(): void {\n this.removeStyleTag();\n }\n\n async addFiles(files: DroppedFile[]) {\n if (!files?.length) {\n return;\n }\n this.dropArea().loading = true;\n try {\n const existingFiles = await firstValueFrom(this._unfilteredFiles$.pipe(first()));\n const updatedFiles = await this.staticAssets.addFilesToStaticAssets(\n this.assetType(),\n files,\n existingFiles\n );\n this._filesUpdate$.next(updatedFiles);\n } catch (e) {\n this.alert.danger(this.translate.instant(gettext('Failed to upload asset.')), e?.message);\n }\n\n this.dropArea().files = null;\n this.dropArea().loading = false;\n }\n\n select(asset: StaticAsset) {\n this.itemSelected.emit(asset);\n }\n\n private applyStylesForFiles(files: StaticAsset[]) {\n this.removeStyleTag();\n const styles = files\n .filter(file => file.type.startsWith('font/'))\n .map(file => `@font-face { font-family: '${file.hashSum}'; src: url('${file.path}'); }`)\n .join('\\n');\n\n if (!styles) {\n return;\n }\n const styleTag = document.createElement('style');\n styleTag.id = this.styleTagId;\n styleTag.innerHTML = styles;\n styleTag.type = 'text/css';\n document.body.appendChild(styleTag);\n }\n\n private removeStyleTag() {\n document.getElementById(this.styleTagId)?.remove();\n }\n}\n","<ng-container *ngIf=\"files$ | async as assets; else loading\">\n <div\n class=\"text-center sticky-top separator-bottom bg-component\"\n style=\"z-index: 1001\"\n >\n <p\n class=\"m-0 p-16\"\n *ngIf=\"assets.length\"\n >\n {{ 'Select from the list below or`first part, followed by upload a new asset`' | translate }}\n <button\n class=\"btn-link\"\n aria-controls=\"collapseUpload\"\n [attr.aria-expanded]=\"isExpanded\"\n (click)=\"isExpanded = !isExpanded\"\n >\n {{ 'upload a new asset' | translate }}\n </button>\n </p>\n <div\n class=\"collapse\"\n id=\"collapseUpload\"\n [isAnimated]=\"true\"\n [collapse]=\"!isExpanded\"\n >\n <div class=\"p-t-24 p-l-24 p-r-24 bg-level-1 separator-top-bottom p-b-32\">\n <c8y-drop-area\n class=\"drop-area-sm m-b-8\"\n [icon]=\"'upload'\"\n [accept]=\"accept$ | async\"\n (dropped)=\"addFiles($event)\"\n ></c8y-drop-area>\n <c8y-messages\n [helpMessage]=\"\n 'After uploading, the asset will be visible in the list below.' | translate\n \"\n ></c8y-messages>\n </div>\n </div>\n </div>\n <div *ngIf=\"assets.length\">\n <c8y-list-group\n class=\"m-b-0\"\n *ngIf=\"layout() != 'grid'\"\n >\n <c8y-list-item *ngFor=\"let asset of assets\">\n <c8y-list-item-icon icon=\"file\"></c8y-list-item-icon>\n\n <c8y-list-item-body>\n <div class=\"row\">\n <div class=\"col-md-3 col-xs-12 d-flex a-i-center\">\n <div\n class=\"text-truncate\"\n title=\"{{ asset.fileName }}\"\n >\n {{ asset.fileName }}\n </div>\n <button\n class=\"btn-dot m-l-4\"\n [title]=\"'Preview' | translate\"\n [popover]=\"preview\"\n placement=\"end\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n >\n <i [c8yIcon]=\"'eye'\"></i>\n </button>\n <ng-template #preview>\n <div class=\"bg-checkered\">\n <img\n class=\"fit-w\"\n [alt]=\"asset.fileName\"\n [src]=\"asset.path\"\n />\n </div>\n </ng-template>\n </div>\n <div class=\"col-md-3 col-xs-12 text-muted\">\n <code class=\"text-10\">{{ asset.type }}</code>\n </div>\n <div class=\"col-md-2 col-xs-12 text-muted\">\n <span class=\"small\">{{ asset.size | bytes }}</span>\n </div>\n <div\n class=\"col-md-2 col-xs-12 text-muted\"\n [title]=\"asset.addedAt | c8yDate\"\n >\n <div class=\"icon-flex small\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'calendar'\"\n ></i>\n <span>{{ asset.addedAt | c8yDate }}</span>\n </div>\n </div>\n <div class=\"col-md-2 col-xs-12 d-flex\">\n <button\n class=\"btn btn-default btn-sm m-l-auto showOnHover\"\n (click)=\"select(asset)\"\n translate\n >\n Select\n </button>\n </div>\n </div>\n </c8y-list-item-body>\n </c8y-list-item>\n </c8y-list-group>\n <div\n class=\"card-group-block interact-grid\"\n *ngIf=\"layout() === 'grid'\"\n >\n <button\n class=\"card btn-clean interact pointer\"\n [ngClass]=\"{\n 'col-md-3 col-sm-4 col-xs-12': inModalView(),\n 'col-md-1 col-sm-3 col-xs-12': !inModalView()\n }\"\n *ngFor=\"let asset of assets\"\n (click)=\"select(asset)\"\n >\n <div class=\"card-block\">\n <ng-container [ngSwitch]=\"asset | staticAssetMainType\">\n <div\n class=\"bg-checkered\"\n *ngSwitchCase=\"'image'\"\n >\n <img\n class=\"img-responsive m-auto img-square\"\n [alt]=\"asset.fileName\"\n [src]=\"asset.path\"\n />\n </div>\n <div\n class=\"bg-checkered\"\n *ngSwitchCase=\"'font'\"\n >\n <div\n class=\"img-responsive m-auto img-square\"\n [ngStyle]=\"{ 'font-family': asset.hashSum }\"\n >\n <p class=\"fit-h text-balance text-truncate-wrap\">\n <!-- intentionally not translated -->\n The quick brown fox jumps over the lazy dog.\n </p>\n </div>\n </div>\n <div\n class=\"bg-checkered\"\n *ngSwitchDefault\n >\n <div class=\"img-responsive m-auto img-square d-flex a-i-center j-c-center\">\n <i\n class=\"icon-2x\"\n [c8yIcon]=\"'file'\"\n ></i>\n </div>\n </div>\n </ng-container>\n <p\n class=\"text-medium text-truncate-wrap m-t-8\"\n [title]=\"asset.fileName\"\n >\n <a\n [href]=\"asset.path\"\n download\n (click)=\"$event.stopPropagation()\"\n >\n <i [c8yIcon]=\"'download'\"></i>\n {{ asset.fileName }}\n </a>\n </p>\n <p class=\"m-b-4\">\n <code class=\"text-10\">{{ asset.type }}</code>\n </p>\n <p class=\"small text-muted d-flex flex-wrap a-i-center\">\n {{ asset.size | bytes }}\n <span class=\"m-l-auto\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'calendar'\"\n ></i>\n <span>{{ asset.addedAt | c8yDate }}</span>\n </span>\n </p>\n </div>\n </button>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"p-24\">\n <c8y-loading></c8y-loading>\n </div>\n</ng-template>\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport type { StaticAsset, StaticAssetType } from '@c8y/ngx-components/static-assets/data';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { IconDirective, ModalComponent } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { StaticAssetsFileListComponent } from './static-assets-file-list/static-assets-file-list.component';\n\n@Component({\n selector: 'c8y-static-assets-modal',\n templateUrl: './static-assets-modal.component.html',\n imports: [StaticAssetsFileListComponent, ModalComponent, IconDirective],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class StaticAssetsModalComponent {\n @Input() assetType: StaticAssetType = 'branding';\n @Input() supportedFileExtensions: string[] = [];\n @Input() modalTitle: string = gettext('Select asset');\n @Input() layout: 'list' | 'grid' = 'grid';\n result: Promise<StaticAsset>;\n private resolve: (res: StaticAsset) => void;\n private reject: (err?: unknown) => void;\n\n constructor(private modalRef: BsModalRef) {\n this.result = new Promise<StaticAsset>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n select(asset: StaticAsset) {\n this.modalRef.hide();\n this.resolve(asset);\n }\n\n cancel() {\n this.modalRef.hide();\n this.reject();\n }\n}\n","<c8y-modal\n [title]=\"modalTitle\"\n (onDismiss)=\"cancel()\"\n [headerClasses]=\"'dialog-header'\"\n [labels]=\"{ cancel: 'Cancel' }\"\n [flushBody]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'select-all'\"></span>\n </ng-container>\n <c8y-static-assets-file-list\n (itemSelected)=\"select($event)\"\n [assetType]=\"assetType\"\n [supportedFileExtensions]=\"supportedFileExtensions\"\n [layout]=\"layout\"\n [inModalView]=\"true\"\n ></c8y-static-assets-file-list>\n</c8y-modal>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-static-assets-modal.mjs","sources":["../../static-assets/modal/static-asset-main-type.pipe.ts","../../static-assets/modal/static-assets-file-list/static-assets-file-list.component.ts","../../static-assets/modal/static-assets-file-list/static-assets-file-list.component.html","../../static-assets/modal/static-assets-modal.component.ts","../../static-assets/modal/static-assets-modal.component.html","../../static-assets/modal/c8y-ngx-components-static-assets-modal.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { StaticAsset } from '@c8y/ngx-components/static-assets/data';\n\n@Pipe({\n name: 'staticAssetMainType',\n pure: true,\n standalone: true\n})\nexport class StaticAssetMainTypePipe implements PipeTransform {\n supportedTypes = ['image', 'font'];\n\n transform(value: Pick<StaticAsset, 'type'> | StaticAsset): string {\n if (!value?.type) {\n return 'unknown';\n }\n\n const typePrefix = value.type.replace(/\\/.*$/, '');\n\n if (this.supportedTypes.includes(typePrefix)) {\n return typePrefix;\n }\n\n return 'unknown';\n }\n}\n","import {\n AsyncPipe,\n NgClass,\n NgForOf,\n NgIf,\n NgStyle,\n NgSwitch,\n NgSwitchCase,\n NgSwitchDefault\n} from '@angular/common';\nimport { Component, inject, input, OnDestroy, output, viewChild, ChangeDetectionStrategy } from '@angular/core';\nimport {\n AlertService,\n BytesPipe,\n C8yTranslateDirective,\n C8yTranslatePipe,\n DatePipe,\n DropAreaComponent,\n DroppedFile,\n IconDirective,\n ListGroupComponent,\n ListItemBodyComponent,\n ListItemComponent,\n ListItemIconComponent,\n LoadingComponent,\n MessagesComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { combineLatest, firstValueFrom, merge, Observable, Subject } from 'rxjs';\nimport { first, map, shareReplay, switchMap, tap } from 'rxjs/operators';\nimport {\n StaticAsset,\n StaticAssetsService,\n StaticAssetType\n} from '@c8y/ngx-components/static-assets/data';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { StaticAssetMainTypePipe } from '../static-asset-main-type.pipe';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'c8y-static-assets-file-list',\n templateUrl: './static-assets-file-list.component.html',\n standalone: true,\n imports: [\n NgForOf,\n NgIf,\n AsyncPipe,\n DatePipe,\n BytesPipe,\n LoadingComponent,\n DropAreaComponent,\n C8yTranslatePipe,\n C8yTranslateDirective,\n MessagesComponent,\n ListGroupComponent,\n ListItemComponent,\n ListItemIconComponent,\n ListItemBodyComponent,\n PopoverDirective,\n CollapseModule,\n NgStyle,\n NgClass,\n IconDirective,\n StaticAssetMainTypePipe,\n NgSwitch,\n NgSwitchCase,\n NgSwitchDefault\n ],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class StaticAssetsFileListComponent implements OnDestroy {\n itemSelected = output<StaticAsset>();\n inModalView = input<boolean>(false);\n assetType = input<StaticAssetType>('branding');\n supportedFileExtensions = input<string[]>([]);\n layout = input<'list' | 'grid'>('grid');\n files$: Observable<StaticAsset[]>;\n accept$: Observable<string>;\n isExpanded = false;\n private _unfilteredFiles$: Observable<StaticAsset[]>;\n private _filesUpdate$ = new Subject<StaticAsset[]>();\n private styleTagId = `static-assets-font-faces`;\n private dropArea = viewChild(DropAreaComponent);\n private alert = inject(AlertService);\n private translate = inject(TranslateService);\n private staticAssets = inject(StaticAssetsService);\n\n constructor() {\n this._unfilteredFiles$ = merge(\n toObservable(this.assetType).pipe(\n switchMap(assetType => this.staticAssets.listFiles(assetType))\n ),\n this._filesUpdate$\n ).pipe(shareReplay({ bufferSize: 1, refCount: true }));\n\n this.files$ = combineLatest([\n this._unfilteredFiles$,\n toObservable(this.supportedFileExtensions)\n ]).pipe(\n map(([files, supportedFileExtensions]) =>\n supportedFileExtensions?.length\n ? files.filter(tmp => supportedFileExtensions.includes(tmp.extension.toLowerCase()))\n : files\n ),\n map(files =>\n files.sort((a, b) => (a.addedAt < b.addedAt ? 1 : a.addedAt > b.addedAt ? -1 : 0))\n ),\n tap(files => {\n if (!files.length) {\n this.isExpanded = true;\n }\n }),\n shareReplay({ bufferSize: 1, refCount: true })\n );\n\n this.accept$ = toObservable(this.supportedFileExtensions).pipe(map(exts => exts.join(',')));\n this.files$.pipe(takeUntilDestroyed()).subscribe(files => this.applyStylesForFiles(files));\n }\n\n ngOnDestroy(): void {\n this.removeStyleTag();\n }\n\n async addFiles(files: DroppedFile[]) {\n if (!files?.length) {\n return;\n }\n this.dropArea().loading = true;\n try {\n const existingFiles = await firstValueFrom(this._unfilteredFiles$.pipe(first()));\n const updatedFiles = await this.staticAssets.addFilesToStaticAssets(\n this.assetType(),\n files,\n existingFiles\n );\n this._filesUpdate$.next(updatedFiles);\n } catch (e) {\n this.alert.danger(this.translate.instant(gettext('Failed to upload asset.')), e?.message);\n }\n\n this.dropArea().files = null;\n this.dropArea().loading = false;\n }\n\n select(asset: StaticAsset) {\n this.itemSelected.emit(asset);\n }\n\n private applyStylesForFiles(files: StaticAsset[]) {\n this.removeStyleTag();\n const styles = files\n .filter(file => file.type.startsWith('font/'))\n .map(file => `@font-face { font-family: '${file.hashSum}'; src: url('${file.path}'); }`)\n .join('\\n');\n\n if (!styles) {\n return;\n }\n const styleTag = document.createElement('style');\n styleTag.id = this.styleTagId;\n styleTag.innerHTML = styles;\n styleTag.type = 'text/css';\n document.body.appendChild(styleTag);\n }\n\n private removeStyleTag() {\n document.getElementById(this.styleTagId)?.remove();\n }\n}\n","<ng-container *ngIf=\"files$ | async as assets; else loading\">\n <div\n class=\"text-center sticky-top separator-bottom bg-component\"\n style=\"z-index: 1001\"\n >\n <p\n class=\"m-0 p-16\"\n *ngIf=\"assets.length\"\n >\n {{ 'Select from the list below or`first part, followed by upload a new asset`' | translate }}\n <button\n class=\"btn-link\"\n aria-controls=\"collapseUpload\"\n [attr.aria-expanded]=\"isExpanded\"\n (click)=\"isExpanded = !isExpanded\"\n >\n {{ 'upload a new asset' | translate }}\n </button>\n </p>\n <div\n class=\"collapse\"\n id=\"collapseUpload\"\n [isAnimated]=\"true\"\n [collapse]=\"!isExpanded\"\n >\n <div class=\"p-t-24 p-l-24 p-r-24 bg-level-1 separator-top-bottom p-b-32\">\n <c8y-drop-area\n class=\"drop-area-sm m-b-8\"\n [icon]=\"'upload'\"\n [accept]=\"accept$ | async\"\n (dropped)=\"addFiles($event)\"\n ></c8y-drop-area>\n <c8y-messages\n [helpMessage]=\"\n 'After uploading, the asset will be visible in the list below.' | translate\n \"\n ></c8y-messages>\n </div>\n </div>\n </div>\n <div *ngIf=\"assets.length\">\n <c8y-list-group\n class=\"m-b-0\"\n *ngIf=\"layout() != 'grid'\"\n >\n <c8y-list-item *ngFor=\"let asset of assets\">\n <c8y-list-item-icon icon=\"file\"></c8y-list-item-icon>\n\n <c8y-list-item-body>\n <div class=\"row\">\n <div class=\"col-md-3 col-xs-12 d-flex a-i-center\">\n <div\n class=\"text-truncate\"\n title=\"{{ asset.fileName }}\"\n >\n {{ asset.fileName }}\n </div>\n <button\n class=\"btn-dot m-l-4\"\n [title]=\"'Preview' | translate\"\n [popover]=\"preview\"\n placement=\"end\"\n triggers=\"focus\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n >\n <i [c8yIcon]=\"'eye'\"></i>\n </button>\n <ng-template #preview>\n <div class=\"bg-checkered\">\n <img\n class=\"fit-w\"\n [alt]=\"asset.fileName\"\n [src]=\"asset.path\"\n />\n </div>\n </ng-template>\n </div>\n <div class=\"col-md-3 col-xs-12 text-muted\">\n <code class=\"text-10\">{{ asset.type }}</code>\n </div>\n <div class=\"col-md-2 col-xs-12 text-muted\">\n <span class=\"small\">{{ asset.size | bytes }}</span>\n </div>\n <div\n class=\"col-md-2 col-xs-12 text-muted\"\n [title]=\"asset.addedAt | c8yDate\"\n >\n <div class=\"icon-flex small\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'calendar'\"\n ></i>\n <span>{{ asset.addedAt | c8yDate }}</span>\n </div>\n </div>\n <div class=\"col-md-2 col-xs-12 d-flex\">\n <button\n class=\"btn btn-default btn-sm m-l-auto showOnHover\"\n (click)=\"select(asset)\"\n translate\n >\n Select\n </button>\n </div>\n </div>\n </c8y-list-item-body>\n </c8y-list-item>\n </c8y-list-group>\n <div\n class=\"card-group-block interact-grid\"\n *ngIf=\"layout() === 'grid'\"\n >\n <button\n class=\"card btn-clean interact pointer\"\n [ngClass]=\"{\n 'col-md-3 col-sm-4 col-xs-12': inModalView(),\n 'col-md-1 col-sm-3 col-xs-12': !inModalView()\n }\"\n *ngFor=\"let asset of assets\"\n (click)=\"select(asset)\"\n >\n <div class=\"card-block\">\n <ng-container [ngSwitch]=\"asset | staticAssetMainType\">\n <div\n class=\"bg-checkered\"\n *ngSwitchCase=\"'image'\"\n >\n <img\n class=\"img-responsive m-auto img-square\"\n [alt]=\"asset.fileName\"\n [src]=\"asset.path\"\n />\n </div>\n <div\n class=\"bg-checkered\"\n *ngSwitchCase=\"'font'\"\n >\n <div\n class=\"img-responsive m-auto img-square\"\n [ngStyle]=\"{ 'font-family': asset.hashSum }\"\n >\n <p class=\"fit-h text-balance text-truncate-wrap\">\n <!-- intentionally not translated -->\n The quick brown fox jumps over the lazy dog.\n </p>\n </div>\n </div>\n <div\n class=\"bg-checkered\"\n *ngSwitchDefault\n >\n <div class=\"img-responsive m-auto img-square d-flex a-i-center j-c-center\">\n <i\n class=\"icon-2x\"\n [c8yIcon]=\"'file'\"\n ></i>\n </div>\n </div>\n </ng-container>\n <p\n class=\"text-medium text-truncate-wrap m-t-8\"\n [title]=\"asset.fileName\"\n >\n <a\n [href]=\"asset.path\"\n download\n (click)=\"$event.stopPropagation()\"\n >\n <i [c8yIcon]=\"'download'\"></i>\n {{ asset.fileName }}\n </a>\n </p>\n <p class=\"m-b-4\">\n <code class=\"text-10\">{{ asset.type }}</code>\n </p>\n <p class=\"small text-muted d-flex flex-wrap a-i-center\">\n {{ asset.size | bytes }}\n <span class=\"m-l-auto\">\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'calendar'\"\n ></i>\n <span>{{ asset.addedAt | c8yDate }}</span>\n </span>\n </p>\n </div>\n </button>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <div class=\"p-24\">\n <c8y-loading></c8y-loading>\n </div>\n</ng-template>\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport type { StaticAsset, StaticAssetType } from '@c8y/ngx-components/static-assets/data';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { IconDirective, ModalComponent } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { StaticAssetsFileListComponent } from './static-assets-file-list/static-assets-file-list.component';\n\n@Component({\n selector: 'c8y-static-assets-modal',\n templateUrl: './static-assets-modal.component.html',\n imports: [StaticAssetsFileListComponent, ModalComponent, IconDirective],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class StaticAssetsModalComponent {\n @Input() assetType: StaticAssetType = 'branding';\n @Input() supportedFileExtensions: string[] = [];\n @Input() modalTitle: string = gettext('Select asset');\n @Input() layout: 'list' | 'grid' = 'grid';\n result: Promise<StaticAsset>;\n private resolve: (res: StaticAsset) => void;\n private reject: (err?: unknown) => void;\n\n constructor(private modalRef: BsModalRef) {\n this.result = new Promise<StaticAsset>((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n\n select(asset: StaticAsset) {\n this.modalRef.hide();\n this.resolve(asset);\n }\n\n cancel() {\n this.modalRef.hide();\n this.reject();\n }\n}\n","<c8y-modal\n [title]=\"modalTitle\"\n (onDismiss)=\"cancel()\"\n [headerClasses]=\"'dialog-header'\"\n [labels]=\"{ cancel: 'Cancel' }\"\n [flushBody]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'select-all'\"></span>\n </ng-container>\n <c8y-static-assets-file-list\n (itemSelected)=\"select($event)\"\n [assetType]=\"assetType\"\n [supportedFileExtensions]=\"supportedFileExtensions\"\n [layout]=\"layout\"\n [inModalView]=\"true\"\n ></c8y-static-assets-file-list>\n</c8y-modal>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
|
|
@@ -213,7 +213,7 @@ class TrackingComponent {
|
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: TrackingComponent, deps: [{ token: TrackingService }, { token: i2.EventRealtimeService }, { token: i2.ContextRouteService }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
216
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: TrackingComponent, isStandalone: true, selector: "c8y-tracking", providers: [EventRealtimeService], viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n [attr.data-cy]=\"'c8y-tracking--tracking-event-item-' + event?.id\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n @if (!service.hasEvents) {\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n </ng-template>\n\n @if (loadMoreComponent?.hasMore) {\n <div>\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n data-cy=\"c8y-tracking--load-more\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n }\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "directive", type: i4.MapPopupDirective, selector: "[c8yMapPopup]" }, { kind: "ngmodule", type: ActionBarModule }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: i2.TimeIntervalComponent, selector: "c8y-time-interval", inputs: ["minCustomDate", "maxCustomDate", "dateRangePickerConfig", "selectedInterval"], outputs: ["interval"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: TrackingMarkerPopupComponent, selector: "c8y-tracking-marker-popup", inputs: ["context", "showTrackingLink"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.JsonPipe, name: "json" }, { kind: "pipe", type: i5.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
216
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.19", type: TrackingComponent, isStandalone: true, selector: "c8y-tracking", providers: [EventRealtimeService], viewQueries: [{ propertyName: "map", first: true, predicate: MapComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n [attr.data-cy]=\"'c8y-tracking--tracking-event-item-' + event?.id\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n @if (!service.hasEvents) {\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n </ng-template>\n\n @if (loadMoreComponent?.hasMore) {\n <div>\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n data-cy=\"c8y-tracking--load-more\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n }\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "directive", type: i4.MapPopupDirective, selector: "[c8yMapPopup]" }, { kind: "ngmodule", type: ActionBarModule }, { kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable", "selectOnClick"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.RealtimeButtonComponent, selector: "c8y-realtime-btn", inputs: ["service", "label", "title", "disabled"], outputs: ["onToggle"] }, { kind: "component", type: i2.TimeIntervalComponent, selector: "c8y-time-interval", inputs: ["minCustomDate", "maxCustomDate", "dateRangePickerConfig", "selectedInterval"], outputs: ["interval"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: TrackingMarkerPopupComponent, selector: "c8y-tracking-marker-popup", inputs: ["context", "showTrackingLink"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.JsonPipe, name: "json" }, { kind: "pipe", type: i5.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
217
217
|
}
|
|
218
218
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: TrackingComponent, decorators: [{
|
|
219
219
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-tracking.mjs","sources":["../../tracking/tracking.service.ts","../../tracking/tracking-marker-popup.component.ts","../../tracking/tracking-marker-popup.component.html","../../tracking/tracking-tab.guard.ts","../../tracking/tracking.component.ts","../../tracking/tracking.component.html","../../tracking/tracking.feature.ts","../../tracking/c8y-ngx-components-tracking.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { EventService, IEvent, IResultList } from '@c8y/client';\nimport { ForOfFilterPipe, GeoService, TimeInterval } from '@c8y/ngx-components';\nimport { PositionManagedObject } from '@c8y/ngx-components/map';\nimport { first, identity, isEmpty, last } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subject, combineLatest, pipe } from 'rxjs';\nimport { distinctUntilChanged, map, share, switchMap, tap } from 'rxjs/operators';\n\nconst LOCATION_UPDATE_EVENT_TYPE = 'c8y_LocationUpdate';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TrackingService {\n private static readonly BASE_FILTER = {\n pageSize: 1000,\n withTotalPages: true,\n type: LOCATION_UPDATE_EVENT_TYPE\n };\n\n events$: Observable<IResultList<IEvent>>;\n polyline$: Observable<L.LatLngExpression[]>;\n pipe: ForOfFilterPipe;\n trackVisible = true;\n hasEvents = false;\n\n private _polylineEventsSubject$ = new BehaviorSubject<IEvent[]>([]);\n\n private deviceId$: Subject<string | number> = new Subject();\n private timeInterval$: Subject<TimeInterval> = new Subject();\n private reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n\n constructor(\n private eventService: EventService,\n private geo: GeoService\n ) {\n this.polyline$ = this._polylineEventsSubject$.asObservable().pipe(\n map(events => (events || []).map(event => this.geo.getLatLong(event)).filter(identity)),\n share()\n );\n\n this.events$ = combineLatest([\n this.deviceId$.pipe(distinctUntilChanged()),\n this.timeInterval$,\n this.reload$\n ]).pipe(\n switchMap(([source, interval]) => {\n const { dateFrom, dateTo } = interval;\n return this.eventService.list({\n ...TrackingService.BASE_FILTER,\n source,\n dateFrom: dateFrom.toISOString(),\n dateTo: dateTo.toISOString()\n });\n }),\n tap(() => this._polylineEventsSubject$.next([])),\n share()\n );\n\n this.pipe = pipe(\n tap(events => (this.hasEvents = !isEmpty(events))),\n map((events: IEvent[]) => (events || []).filter(event => this.isMatchingEvent(event))),\n tap((events: IEvent[]) => {\n const prepend =\n this.compareEvents(last(this._polylineEventsSubject$.value), first(events)) < 0;\n const polyline: IEvent[] = prepend\n ? [...events, ...this._polylineEventsSubject$.value]\n : [...this._polylineEventsSubject$.value, ...events];\n\n this._polylineEventsSubject$.next(polyline);\n })\n );\n }\n\n setDeviceId(deviceId: string | number) {\n this.deviceId$.next(deviceId);\n }\n\n setInterval(interval: TimeInterval) {\n this.timeInterval$.next(interval);\n }\n\n clearTrack() {\n this._polylineEventsSubject$.next([]);\n }\n\n reload() {\n this.reload$.next();\n }\n\n async latestPositionUpdate(mo: PositionManagedObject): Promise<Date> {\n const dateTo = new Date();\n dateTo.setDate(dateTo.getDate() + 1);\n\n const filters = {\n fragmentType: 'c8y_Position',\n dateFrom: new Date(0).toISOString(),\n dateTo: dateTo.toISOString(),\n pageSize: 1,\n source: mo.id\n };\n const events = await this.eventService.list(filters);\n return events?.data?.length ? new Date(events.data[0].time) : undefined;\n }\n\n toggleTrack() {\n if (this.trackVisible) {\n this.clearTrack();\n } else {\n this.reload();\n }\n this.trackVisible = !this.trackVisible;\n }\n\n isLocationUpdateEvent(event: IEvent): boolean {\n return event.type === LOCATION_UPDATE_EVENT_TYPE;\n }\n\n private isMatchingEvent(event: IEvent): boolean {\n return this.isLocationUpdateEvent(event);\n }\n\n private compareEvents(a: IEvent, b: IEvent): number {\n return Date.parse(a?.time) - Date.parse(b?.time);\n }\n}\n","import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { IEvent } from '@c8y/client';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { PositionManagedObject } from '@c8y/ngx-components/map';\nimport { TrackingService } from './tracking.service';\n\n@Component({\n standalone: true,\n selector: 'c8y-tracking-marker-popup',\n templateUrl: './tracking-marker-popup.component.html',\n imports: [CoreModule, RouterModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class TrackingMarkerPopupComponent implements OnInit {\n @Input()\n context: PositionManagedObject | IEvent;\n\n /**\n * Displays link to device tracking tab.\n */\n @Input()\n showTrackingLink = false;\n\n isDevice: boolean;\n date: Date;\n\n constructor(public trackingService: TrackingService) {}\n\n async ngOnInit() {\n this.isDevice = !this.trackingService.isLocationUpdateEvent(this.context as unknown as IEvent);\n if (this.isDevice) {\n this.trackingService.setDeviceId(this.context.id);\n this.date = await this.trackingService.latestPositionUpdate(\n this.context as PositionManagedObject\n );\n } else {\n this.date = this.context.time;\n }\n }\n}\n","<div class=\"map-marker\">\n @if (isDevice) {\n <a\n class=\"text-truncate text-14 text-medium p-0 m-b-8 deviceLink\"\n [title]=\"context?.name\"\n [routerLink]=\"['/device/', context?.id]\"\n >\n {{ context?.name }}\n </a>\n }\n <div\n class=\"m-b-8\"\n ng-if=\"lastUpdated\"\n >\n <p class=\"m-0\">{{ 'Position:' | translate }}</p>\n <div class=\"text-muted\">\n <p class=\"m-b-0\">{{ context?.c8y_Position?.lat }},</p>\n <p class=\"m-t-0\">{{ context?.c8y_Position?.lng }}</p>\n </div>\n @if (!!context?.c8y_Position?.alt || context?.c8y_Position?.alt === 0) {\n <p class=\"m-0\">{{ 'Altitude:' | translate }}</p>\n <div class=\"text-muted\">\n <p\n class=\"m-b-0\"\n [translate]=\"'{{alt}} m`meters, altitude`'\"\n [translateParams]=\"{ alt: context?.c8y_Position?.alt }\"\n ></p>\n </div>\n }\n @if (!!date) {\n <p class=\"m-0 p-t-4\">{{ 'Date and time:' | translate }}</p>\n <span class=\"text-muted\">{{ date | c8yDate }}</span>\n }\n </div>\n\n @if (isDevice) {\n @if (showTrackingLink) {\n <span>\n Go to\n <a [routerLink]=\"['/device', context?.id, 'tracking']\">Tracking</a>\n </span>\n } @else {\n <div class=\"d-flex a-i-center\">\n <label\n class=\"c8y-switch\"\n for=\"switch\"\n >\n <input\n id=\"switch\"\n type=\"checkbox\"\n [checked]=\"trackingService.trackVisible\"\n (change)=\"trackingService.toggleTrack()\"\n />\n <span></span>\n </label>\n <div class=\"description p-b-0\">\n {{ 'Show track' | translate }}\n </div>\n </div>\n }\n }\n</div>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate } from '@angular/router';\nimport { IManagedObject } from '@c8y/client';\nimport { ContextRouteService, GeoService, ViewContext } from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TrackingTabFactory implements CanActivate {\n constructor(\n private contextRouteService: ContextRouteService,\n private geoService: GeoService\n ) {}\n\n canActivate(snapshot: ActivatedRouteSnapshot): boolean {\n const contextData = this.contextRouteService.getContextData(snapshot);\n return (\n contextData?.context === ViewContext.Device &&\n !isEmpty(this.geoService.getLatLong(contextData?.contextData as IManagedObject))\n );\n }\n}\n","import { AfterViewInit, Component, OnInit, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute } from '@angular/router';\nimport { IEvent } from '@c8y/client';\nimport {\n ActionBarModule,\n ContextRouteService,\n CoreModule,\n DateRangePickerConfig,\n EventRealtimeService,\n LoadMoreComponent,\n TimeInterval,\n TimeIntervalComponent\n} from '@c8y/ngx-components';\nimport { MapComponent, MapConfig, MapModule, PositionManagedObject } from '@c8y/ngx-components/map';\nimport { TrackingMarkerPopupComponent } from './tracking-marker-popup.component';\nimport { TrackingService } from './tracking.service';\n\n@Component({\n standalone: true,\n templateUrl: './tracking.component.html',\n imports: [\n MapModule,\n ActionBarModule,\n CoreModule,\n TimeIntervalComponent,\n FormsModule,\n TrackingMarkerPopupComponent\n ],\n providers: [EventRealtimeService],\n selector: 'c8y-tracking',\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class TrackingComponent implements OnInit, AfterViewInit {\n @ViewChild(MapComponent)\n map: MapComponent;\n\n dateRangePickerConfig: DateRangePickerConfig = {\n adaptivePosition: true,\n showPreviousMonth: true,\n preventChangeToNextMonth: true\n };\n\n config: MapConfig = {\n realtime: true,\n follow: false,\n zoomLevel: 12,\n fitBoundsOptions: {\n padding: [50, 50]\n }\n };\n\n maxDate = new Date();\n activeMarkers: { [key: string]: boolean } = {};\n realtimeDisabled = false;\n device: PositionManagedObject;\n loadMoreComponent: LoadMoreComponent;\n\n constructor(\n public service: TrackingService,\n public realtime: EventRealtimeService,\n private contextRouteService: ContextRouteService,\n private activatedRoute: ActivatedRoute\n ) {}\n\n async ngOnInit() {\n const { contextData } = this.contextRouteService.getContextData(this.activatedRoute);\n this.device = contextData as PositionManagedObject;\n }\n\n async ngAfterViewInit() {\n this.service.setDeviceId(this.device.id);\n this.togglePositionRealtime(this.realtime.active);\n }\n\n toggleMarker(event: IEvent) {\n let marker = this.map.findMarker(event);\n\n if (marker) {\n this.map.removeMarker(marker);\n delete this.activeMarkers[`p${event.id}`];\n } else {\n marker = this.map.getTrackingMarker(event);\n this.map.addMarkerToMap(marker);\n this.activeMarkers[`p${event.id}`] = true;\n }\n }\n\n togglePositionRealtime(active: boolean) {\n this.config = { ...this.config, realtime: active };\n }\n\n toggleRealtime(interval: TimeInterval) {\n const currentTimeInRange = Date.now() <= interval?.dateTo?.getTime();\n this.togglePositionRealtime(currentTimeInRange);\n this.realtimeDisabled = !currentTimeInRange;\n\n if (currentTimeInRange) {\n this.realtime.start();\n } else {\n this.realtime.stop();\n }\n }\n}\n","<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n [attr.data-cy]=\"'c8y-tracking--tracking-event-item-' + event?.id\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n @if (!service.hasEvents) {\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n </ng-template>\n\n @if (loadMoreComponent?.hasMore) {\n <div>\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n data-cy=\"c8y-tracking--load-more\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n }\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { hookRoute, ViewContext } from '@c8y/ngx-components';\nimport { TrackingTabFactory } from './tracking-tab.guard';\nimport { TrackingComponent } from './tracking.component';\n\nexport const trackingFeatureProvider: EnvironmentProviders = makeEnvironmentProviders([\n TrackingTabFactory,\n hookRoute({\n path: 'tracking',\n component: TrackingComponent,\n context: ViewContext.Device,\n label: gettext('Tracking'),\n icon: 'crosshairs',\n canActivate: [TrackingTabFactory]\n })\n]);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TrackingService","i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-tracking.mjs","sources":["../../tracking/tracking.service.ts","../../tracking/tracking-marker-popup.component.ts","../../tracking/tracking-marker-popup.component.html","../../tracking/tracking-tab.guard.ts","../../tracking/tracking.component.ts","../../tracking/tracking.component.html","../../tracking/tracking.feature.ts","../../tracking/c8y-ngx-components-tracking.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { EventService, IEvent, IResultList } from '@c8y/client';\nimport { ForOfFilterPipe, GeoService, TimeInterval } from '@c8y/ngx-components';\nimport { PositionManagedObject } from '@c8y/ngx-components/map';\nimport { first, identity, isEmpty, last } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subject, combineLatest, pipe } from 'rxjs';\nimport { distinctUntilChanged, map, share, switchMap, tap } from 'rxjs/operators';\n\nconst LOCATION_UPDATE_EVENT_TYPE = 'c8y_LocationUpdate';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TrackingService {\n private static readonly BASE_FILTER = {\n pageSize: 1000,\n withTotalPages: true,\n type: LOCATION_UPDATE_EVENT_TYPE\n };\n\n events$: Observable<IResultList<IEvent>>;\n polyline$: Observable<L.LatLngExpression[]>;\n pipe: ForOfFilterPipe;\n trackVisible = true;\n hasEvents = false;\n\n private _polylineEventsSubject$ = new BehaviorSubject<IEvent[]>([]);\n\n private deviceId$: Subject<string | number> = new Subject();\n private timeInterval$: Subject<TimeInterval> = new Subject();\n private reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n\n constructor(\n private eventService: EventService,\n private geo: GeoService\n ) {\n this.polyline$ = this._polylineEventsSubject$.asObservable().pipe(\n map(events => (events || []).map(event => this.geo.getLatLong(event)).filter(identity)),\n share()\n );\n\n this.events$ = combineLatest([\n this.deviceId$.pipe(distinctUntilChanged()),\n this.timeInterval$,\n this.reload$\n ]).pipe(\n switchMap(([source, interval]) => {\n const { dateFrom, dateTo } = interval;\n return this.eventService.list({\n ...TrackingService.BASE_FILTER,\n source,\n dateFrom: dateFrom.toISOString(),\n dateTo: dateTo.toISOString()\n });\n }),\n tap(() => this._polylineEventsSubject$.next([])),\n share()\n );\n\n this.pipe = pipe(\n tap(events => (this.hasEvents = !isEmpty(events))),\n map((events: IEvent[]) => (events || []).filter(event => this.isMatchingEvent(event))),\n tap((events: IEvent[]) => {\n const prepend =\n this.compareEvents(last(this._polylineEventsSubject$.value), first(events)) < 0;\n const polyline: IEvent[] = prepend\n ? [...events, ...this._polylineEventsSubject$.value]\n : [...this._polylineEventsSubject$.value, ...events];\n\n this._polylineEventsSubject$.next(polyline);\n })\n );\n }\n\n setDeviceId(deviceId: string | number) {\n this.deviceId$.next(deviceId);\n }\n\n setInterval(interval: TimeInterval) {\n this.timeInterval$.next(interval);\n }\n\n clearTrack() {\n this._polylineEventsSubject$.next([]);\n }\n\n reload() {\n this.reload$.next();\n }\n\n async latestPositionUpdate(mo: PositionManagedObject): Promise<Date> {\n const dateTo = new Date();\n dateTo.setDate(dateTo.getDate() + 1);\n\n const filters = {\n fragmentType: 'c8y_Position',\n dateFrom: new Date(0).toISOString(),\n dateTo: dateTo.toISOString(),\n pageSize: 1,\n source: mo.id\n };\n const events = await this.eventService.list(filters);\n return events?.data?.length ? new Date(events.data[0].time) : undefined;\n }\n\n toggleTrack() {\n if (this.trackVisible) {\n this.clearTrack();\n } else {\n this.reload();\n }\n this.trackVisible = !this.trackVisible;\n }\n\n isLocationUpdateEvent(event: IEvent): boolean {\n return event.type === LOCATION_UPDATE_EVENT_TYPE;\n }\n\n private isMatchingEvent(event: IEvent): boolean {\n return this.isLocationUpdateEvent(event);\n }\n\n private compareEvents(a: IEvent, b: IEvent): number {\n return Date.parse(a?.time) - Date.parse(b?.time);\n }\n}\n","import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\nimport { IEvent } from '@c8y/client';\nimport { CoreModule } from '@c8y/ngx-components';\nimport { PositionManagedObject } from '@c8y/ngx-components/map';\nimport { TrackingService } from './tracking.service';\n\n@Component({\n standalone: true,\n selector: 'c8y-tracking-marker-popup',\n templateUrl: './tracking-marker-popup.component.html',\n imports: [CoreModule, RouterModule, FormsModule],\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class TrackingMarkerPopupComponent implements OnInit {\n @Input()\n context: PositionManagedObject | IEvent;\n\n /**\n * Displays link to device tracking tab.\n */\n @Input()\n showTrackingLink = false;\n\n isDevice: boolean;\n date: Date;\n\n constructor(public trackingService: TrackingService) {}\n\n async ngOnInit() {\n this.isDevice = !this.trackingService.isLocationUpdateEvent(this.context as unknown as IEvent);\n if (this.isDevice) {\n this.trackingService.setDeviceId(this.context.id);\n this.date = await this.trackingService.latestPositionUpdate(\n this.context as PositionManagedObject\n );\n } else {\n this.date = this.context.time;\n }\n }\n}\n","<div class=\"map-marker\">\n @if (isDevice) {\n <a\n class=\"text-truncate text-14 text-medium p-0 m-b-8 deviceLink\"\n [title]=\"context?.name\"\n [routerLink]=\"['/device/', context?.id]\"\n >\n {{ context?.name }}\n </a>\n }\n <div\n class=\"m-b-8\"\n ng-if=\"lastUpdated\"\n >\n <p class=\"m-0\">{{ 'Position:' | translate }}</p>\n <div class=\"text-muted\">\n <p class=\"m-b-0\">{{ context?.c8y_Position?.lat }},</p>\n <p class=\"m-t-0\">{{ context?.c8y_Position?.lng }}</p>\n </div>\n @if (!!context?.c8y_Position?.alt || context?.c8y_Position?.alt === 0) {\n <p class=\"m-0\">{{ 'Altitude:' | translate }}</p>\n <div class=\"text-muted\">\n <p\n class=\"m-b-0\"\n [translate]=\"'{{alt}} m`meters, altitude`'\"\n [translateParams]=\"{ alt: context?.c8y_Position?.alt }\"\n ></p>\n </div>\n }\n @if (!!date) {\n <p class=\"m-0 p-t-4\">{{ 'Date and time:' | translate }}</p>\n <span class=\"text-muted\">{{ date | c8yDate }}</span>\n }\n </div>\n\n @if (isDevice) {\n @if (showTrackingLink) {\n <span>\n Go to\n <a [routerLink]=\"['/device', context?.id, 'tracking']\">Tracking</a>\n </span>\n } @else {\n <div class=\"d-flex a-i-center\">\n <label\n class=\"c8y-switch\"\n for=\"switch\"\n >\n <input\n id=\"switch\"\n type=\"checkbox\"\n [checked]=\"trackingService.trackVisible\"\n (change)=\"trackingService.toggleTrack()\"\n />\n <span></span>\n </label>\n <div class=\"description p-b-0\">\n {{ 'Show track' | translate }}\n </div>\n </div>\n }\n }\n</div>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate } from '@angular/router';\nimport { IManagedObject } from '@c8y/client';\nimport { ContextRouteService, GeoService, ViewContext } from '@c8y/ngx-components';\nimport { isEmpty } from 'lodash-es';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TrackingTabFactory implements CanActivate {\n constructor(\n private contextRouteService: ContextRouteService,\n private geoService: GeoService\n ) {}\n\n canActivate(snapshot: ActivatedRouteSnapshot): boolean {\n const contextData = this.contextRouteService.getContextData(snapshot);\n return (\n contextData?.context === ViewContext.Device &&\n !isEmpty(this.geoService.getLatLong(contextData?.contextData as IManagedObject))\n );\n }\n}\n","import { AfterViewInit, Component, OnInit, ViewChild, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute } from '@angular/router';\nimport { IEvent } from '@c8y/client';\nimport {\n ActionBarModule,\n ContextRouteService,\n CoreModule,\n DateRangePickerConfig,\n EventRealtimeService,\n LoadMoreComponent,\n TimeInterval,\n TimeIntervalComponent\n} from '@c8y/ngx-components';\nimport { MapComponent, MapConfig, MapModule, PositionManagedObject } from '@c8y/ngx-components/map';\nimport { TrackingMarkerPopupComponent } from './tracking-marker-popup.component';\nimport { TrackingService } from './tracking.service';\n\n@Component({\n standalone: true,\n templateUrl: './tracking.component.html',\n imports: [\n MapModule,\n ActionBarModule,\n CoreModule,\n TimeIntervalComponent,\n FormsModule,\n TrackingMarkerPopupComponent\n ],\n providers: [EventRealtimeService],\n selector: 'c8y-tracking',\n changeDetection: ChangeDetectionStrategy.Eager\n})\nexport class TrackingComponent implements OnInit, AfterViewInit {\n @ViewChild(MapComponent)\n map: MapComponent;\n\n dateRangePickerConfig: DateRangePickerConfig = {\n adaptivePosition: true,\n showPreviousMonth: true,\n preventChangeToNextMonth: true\n };\n\n config: MapConfig = {\n realtime: true,\n follow: false,\n zoomLevel: 12,\n fitBoundsOptions: {\n padding: [50, 50]\n }\n };\n\n maxDate = new Date();\n activeMarkers: { [key: string]: boolean } = {};\n realtimeDisabled = false;\n device: PositionManagedObject;\n loadMoreComponent: LoadMoreComponent;\n\n constructor(\n public service: TrackingService,\n public realtime: EventRealtimeService,\n private contextRouteService: ContextRouteService,\n private activatedRoute: ActivatedRoute\n ) {}\n\n async ngOnInit() {\n const { contextData } = this.contextRouteService.getContextData(this.activatedRoute);\n this.device = contextData as PositionManagedObject;\n }\n\n async ngAfterViewInit() {\n this.service.setDeviceId(this.device.id);\n this.togglePositionRealtime(this.realtime.active);\n }\n\n toggleMarker(event: IEvent) {\n let marker = this.map.findMarker(event);\n\n if (marker) {\n this.map.removeMarker(marker);\n delete this.activeMarkers[`p${event.id}`];\n } else {\n marker = this.map.getTrackingMarker(event);\n this.map.addMarkerToMap(marker);\n this.activeMarkers[`p${event.id}`] = true;\n }\n }\n\n togglePositionRealtime(active: boolean) {\n this.config = { ...this.config, realtime: active };\n }\n\n toggleRealtime(interval: TimeInterval) {\n const currentTimeInRange = Date.now() <= interval?.dateTo?.getTime();\n this.togglePositionRealtime(currentTimeInRange);\n this.realtimeDisabled = !currentTimeInRange;\n\n if (currentTimeInRange) {\n this.realtime.start();\n } else {\n this.realtime.stop();\n }\n }\n}\n","<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"100\"\n>\n <c8y-realtime-btn\n [service]=\"realtime\"\n [disabled]=\"realtimeDisabled\"\n (onToggle)=\"togglePositionRealtime($event)\"\n ></c8y-realtime-btn>\n</c8y-action-bar-item>\n<c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"60\"\n>\n <c8y-time-interval\n [maxCustomDate]=\"maxDate\"\n [dateRangePickerConfig]=\"dateRangePickerConfig\"\n (interval)=\"service.setInterval($event); toggleRealtime($event)\"\n ></c8y-time-interval>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid content-fullpage d-grid grid__col--8-4--md\">\n <div\n class=\"bg-white p-relative\"\n style=\"min-height: 30vh\"\n >\n <c8y-map\n [config]=\"config\"\n [assets]=\"device\"\n [polyline$]=\"service.polyline$\"\n [polylineOptions]=\"{ color: 'darkblue' }\"\n >\n <div *c8yMapPopup=\"let context\">\n <c8y-tracking-marker-popup [context]=\"context\"></c8y-tracking-marker-popup>\n </div>\n </c8y-map>\n </div>\n\n <div class=\"d-flex d-col bg-inherit content-fullpage bg-gray-white\">\n <div class=\"card-header large-padding separator sticky-top\">\n <span\n class=\"card-title\"\n translate\n >\n Tracking events\n </span>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group class=\"c8y-list__group--strip\">\n <ng-template\n c8yFor\n let-event\n [c8yForOf]=\"service.events$\"\n [c8yForPipe]=\"service.pipe\"\n [c8yForRealtime]=\"realtime\"\n [c8yForRealtimeOptions]=\"{ entityOrId: device }\"\n [c8yForLoadMore]=\"'hidden'\"\n [c8yForNotFound]=\"empty\"\n (c8yForLoadMoreComponent)=\"\n loadMoreComponent = $event; loadMoreComponent.useIntersection = false\n \"\n >\n <c8y-li\n class=\"pointer\"\n [ngClass]=\"{ 'text-primary text-bold': activeMarkers['p' + event?.id] }\"\n (click)=\"toggleMarker(event)\"\n [attr.data-cy]=\"'c8y-tracking--tracking-event-item-' + event?.id\"\n >\n <c8y-li-icon [ngClass]=\"{ 'text-primary': activeMarkers['p' + event?.id] }\">\n <i c8yIcon=\"c8y-location\"></i>\n </c8y-li-icon>\n <c8y-li-body>\n <div class=\"d-flex\">\n <span>\n {{ event.time | date: 'mediumDate' }}\n </span>\n <span class=\"m-l-auto\">\n {{ event.time | date: 'mediumTime' }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n\n <!-- empty state -->\n <ng-template #empty>\n @if (!service.hasEvents) {\n <c8y-ui-empty-state\n icon=\"c8y-location\"\n [title]=\"'No tracking events found.' | translate\"\n [subtitle]=\"'Select another time range.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n </ng-template>\n\n @if (loadMoreComponent?.hasMore) {\n <div>\n <button\n class=\"btn btn-link fit-w sticky-bottom separator-top\"\n [title]=\"'Load more' | translate\"\n type=\"button\"\n [disabled]=\"loadMoreComponent?.isLoading\"\n (click)=\"loadMoreComponent.loadMore()\"\n data-cy=\"c8y-tracking--load-more\"\n >\n {{ 'Load more' | translate }}\n </button>\n </div>\n }\n\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Deselect all markers' | translate\"\n type=\"button\"\n [disabled]=\"(activeMarkers | json) === '{}'\"\n (click)=\"map.clearMarkers('event'); activeMarkers = {}\"\n >\n {{ 'Deselect all markers' | translate }}\n </button>\n </div>\n </div>\n</div>\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { hookRoute, ViewContext } from '@c8y/ngx-components';\nimport { TrackingTabFactory } from './tracking-tab.guard';\nimport { TrackingComponent } from './tracking.component';\n\nexport const trackingFeatureProvider: EnvironmentProviders = makeEnvironmentProviders([\n TrackingTabFactory,\n hookRoute({\n path: 'tracking',\n component: TrackingComponent,\n context: ViewContext.Device,\n label: gettext('Tracking'),\n icon: 'crosshairs',\n canActivate: [TrackingTabFactory]\n })\n]);\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.TrackingService","i1"],"mappings":"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"}
|