@en-solutions/tgm-client-sdk 1.6.21
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/LICENSE +19 -0
- package/README.md +788 -0
- package/esm2022/en-solutions-tgm-client-sdk.mjs +5 -0
- package/esm2022/lib/components/database-manager/database-manager/database-manager.component.mjs +308 -0
- package/esm2022/lib/components/database-manager/database-manager.module.mjs +66 -0
- package/esm2022/lib/components/database-manager/object-browser/object-browser.component.mjs +98 -0
- package/esm2022/lib/components/database-manager/query-editor/query-editor.component.mjs +196 -0
- package/esm2022/lib/components/database-manager/query-toolbar/query-toolbar.component.mjs +70 -0
- package/esm2022/lib/components/database-manager/record-detail/record-detail.component.mjs +112 -0
- package/esm2022/lib/components/database-manager/registry/entity-registry.mjs +512 -0
- package/esm2022/lib/components/database-manager/results-grid/results-grid.component.mjs +165 -0
- package/esm2022/lib/components/database-manager/services/entity-schema.service.mjs +91 -0
- package/esm2022/lib/components/database-manager/services/query-executor.service.mjs +204 -0
- package/esm2022/lib/components/database-manager/table-data-viewer/table-data-viewer.component.mjs +166 -0
- package/esm2022/lib/components/database-manager/table-structure/table-structure.component.mjs +42 -0
- package/esm2022/lib/components/database-manager/types/database-manager.types.mjs +6 -0
- package/esm2022/lib/components/reporting/export-button/export-button.component.mjs +203 -0
- package/esm2022/lib/components/reporting/generated-report-list/generated-report-list.component.mjs +285 -0
- package/esm2022/lib/components/reporting/report-definition-form/report-definition-form.component.mjs +206 -0
- package/esm2022/lib/components/reporting/report-definition-list/report-definition-list.component.mjs +252 -0
- package/esm2022/lib/components/reporting/report-generate-dialog/report-generate-dialog.component.mjs +122 -0
- package/esm2022/lib/components/reporting/report-stats/report-stats.component.mjs +164 -0
- package/esm2022/lib/components/reporting/report-template-list/report-template-list.component.mjs +114 -0
- package/esm2022/lib/components/reporting/reporting.module.mjs +60 -0
- package/esm2022/lib/components/video-call/incoming-call/incoming-call.component.mjs +80 -0
- package/esm2022/lib/components/video-call/services/livekit-room.service.mjs +142 -0
- package/esm2022/lib/components/video-call/services/video-call-signaling.service.mjs +42 -0
- package/esm2022/lib/components/video-call/services/video-call-state.service.mjs +52 -0
- package/esm2022/lib/components/video-call/types/video-call.types.mjs +2 -0
- package/esm2022/lib/components/video-call/video-call.module.mjs +42 -0
- package/esm2022/lib/components/video-call/video-controls/video-controls.component.mjs +33 -0
- package/esm2022/lib/components/video-call/video-participant/video-participant.component.mjs +68 -0
- package/esm2022/lib/components/video-call/video-room/video-room.component.mjs +89 -0
- package/esm2022/lib/core/auth-interceptor.mjs +33 -0
- package/esm2022/lib/core/client-interceptor.mjs +34 -0
- package/esm2022/lib/core/error-handler.mjs +32 -0
- package/esm2022/lib/core/http-client.service.mjs +254 -0
- package/esm2022/lib/core/websocket.service.mjs +185 -0
- package/esm2022/lib/models/admin/audit.models.mjs +2 -0
- package/esm2022/lib/models/admin/backup.models.mjs +2 -0
- package/esm2022/lib/models/admin/client.models.mjs +2 -0
- package/esm2022/lib/models/admin/email-provider.models.mjs +2 -0
- package/esm2022/lib/models/admin/erp.models.mjs +2 -0
- package/esm2022/lib/models/admin/identity-provider.models.mjs +2 -0
- package/esm2022/lib/models/admin/index.mjs +14 -0
- package/esm2022/lib/models/admin/messaging-provider.models.mjs +2 -0
- package/esm2022/lib/models/admin/platform-admin.models.mjs +2 -0
- package/esm2022/lib/models/admin/queue.models.mjs +2 -0
- package/esm2022/lib/models/admin/role.models.mjs +2 -0
- package/esm2022/lib/models/admin/sandbox.models.mjs +2 -0
- package/esm2022/lib/models/admin/ticket.models.mjs +2 -0
- package/esm2022/lib/models/admin/webhook.models.mjs +2 -0
- package/esm2022/lib/models/api/ai.models.mjs +2 -0
- package/esm2022/lib/models/api/aip.models.mjs +2 -0
- package/esm2022/lib/models/api/cat.models.mjs +2 -0
- package/esm2022/lib/models/api/company.models.mjs +2 -0
- package/esm2022/lib/models/api/compliance.models.mjs +2 -0
- package/esm2022/lib/models/api/component.models.mjs +2 -0
- package/esm2022/lib/models/api/cortex-edge.models.mjs +2 -0
- package/esm2022/lib/models/api/cortex-event.models.mjs +2 -0
- package/esm2022/lib/models/api/cortex-insight.models.mjs +2 -0
- package/esm2022/lib/models/api/cortex-node.models.mjs +2 -0
- package/esm2022/lib/models/api/custom-field.models.mjs +2 -0
- package/esm2022/lib/models/api/deferral.models.mjs +2 -0
- package/esm2022/lib/models/api/diagnostic-report.models.mjs +2 -0
- package/esm2022/lib/models/api/document.models.mjs +2 -0
- package/esm2022/lib/models/api/energy.models.mjs +2 -0
- package/esm2022/lib/models/api/failure.models.mjs +2 -0
- package/esm2022/lib/models/api/fleet.models.mjs +2 -0
- package/esm2022/lib/models/api/inspection.models.mjs +2 -0
- package/esm2022/lib/models/api/intervention.models.mjs +2 -0
- package/esm2022/lib/models/api/iot.models.mjs +2 -0
- package/esm2022/lib/models/api/knowledge.models.mjs +2 -0
- package/esm2022/lib/models/api/loto.models.mjs +2 -0
- package/esm2022/lib/models/api/maintenance-record.models.mjs +2 -0
- package/esm2022/lib/models/api/maintenance.models.mjs +2 -0
- package/esm2022/lib/models/api/material.models.mjs +2 -0
- package/esm2022/lib/models/api/media.models.mjs +2 -0
- package/esm2022/lib/models/api/misc.models.mjs +2 -0
- package/esm2022/lib/models/api/project.models.mjs +2 -0
- package/esm2022/lib/models/api/quality.models.mjs +2 -0
- package/esm2022/lib/models/api/reporting.models.mjs +3 -0
- package/esm2022/lib/models/api/reservoir-websocket.models.mjs +17 -0
- package/esm2022/lib/models/api/reservoir.models.mjs +2 -0
- package/esm2022/lib/models/api/search.models.mjs +2 -0
- package/esm2022/lib/models/api/sensor.models.mjs +2 -0
- package/esm2022/lib/models/api/unit.models.mjs +2 -0
- package/esm2022/lib/models/api/user.models.mjs +2 -0
- package/esm2022/lib/models/api/warranty.models.mjs +2 -0
- package/esm2022/lib/models/api/work-permit.models.mjs +2 -0
- package/esm2022/lib/models/api/workflow.models.mjs +2 -0
- package/esm2022/lib/models/auth/index.mjs +4 -0
- package/esm2022/lib/models/auth/login.models.mjs +2 -0
- package/esm2022/lib/models/auth/sso.models.mjs +2 -0
- package/esm2022/lib/models/auth/totp.models.mjs +2 -0
- package/esm2022/lib/models/base.models.mjs +99 -0
- package/esm2022/lib/models/chat/chat.models.mjs +2 -0
- package/esm2022/lib/models/enums/cat.enums.mjs +17 -0
- package/esm2022/lib/models/enums/energy.enums.mjs +8 -0
- package/esm2022/lib/models/enums/erp.enums.mjs +5 -0
- package/esm2022/lib/models/enums/index.mjs +15 -0
- package/esm2022/lib/models/enums/inspection.enums.mjs +7 -0
- package/esm2022/lib/models/enums/loto.enums.mjs +25 -0
- package/esm2022/lib/models/enums/misc.enums.mjs +19 -0
- package/esm2022/lib/models/enums/quality.enums.mjs +22 -0
- package/esm2022/lib/models/enums/reservoir.enums.mjs +13 -0
- package/esm2022/lib/models/enums/sso.enums.mjs +3 -0
- package/esm2022/lib/models/enums/status.enums.mjs +41 -0
- package/esm2022/lib/models/enums/time.enums.mjs +5 -0
- package/esm2022/lib/models/enums/type.enums.mjs +45 -0
- package/esm2022/lib/models/enums/user.enums.mjs +6 -0
- package/esm2022/lib/models/enums/work-permit.enums.mjs +33 -0
- package/esm2022/lib/models/index.mjs +42 -0
- package/esm2022/lib/models/realtime/realtime-event.models.mjs +9 -0
- package/esm2022/lib/models/video/video-call.models.mjs +2 -0
- package/esm2022/lib/services/admin/activity-log.service.mjs +28 -0
- package/esm2022/lib/services/admin/announcement.service.mjs +37 -0
- package/esm2022/lib/services/admin/article-admin.service.mjs +37 -0
- package/esm2022/lib/services/admin/audit-log.service.mjs +53 -0
- package/esm2022/lib/services/admin/backup.service.mjs +28 -0
- package/esm2022/lib/services/admin/cache-admin.service.mjs +64 -0
- package/esm2022/lib/services/admin/client-admin.service.mjs +101 -0
- package/esm2022/lib/services/admin/client-api-key.service.mjs +31 -0
- package/esm2022/lib/services/admin/client-ocr.service.mjs +28 -0
- package/esm2022/lib/services/admin/client-usage.service.mjs +31 -0
- package/esm2022/lib/services/admin/data-export.service.mjs +19 -0
- package/esm2022/lib/services/admin/document-admin.service.mjs +40 -0
- package/esm2022/lib/services/admin/email-admin.service.mjs +28 -0
- package/esm2022/lib/services/admin/email-provider.service.mjs +58 -0
- package/esm2022/lib/services/admin/erp-admin.service.mjs +111 -0
- package/esm2022/lib/services/admin/identity-provider.service.mjs +46 -0
- package/esm2022/lib/services/admin/impersonation.service.mjs +19 -0
- package/esm2022/lib/services/admin/index.mjs +31 -0
- package/esm2022/lib/services/admin/messaging-provider.service.mjs +55 -0
- package/esm2022/lib/services/admin/notification.service.mjs +31 -0
- package/esm2022/lib/services/admin/platform-admin.service.mjs +34 -0
- package/esm2022/lib/services/admin/platform-webhook.service.mjs +34 -0
- package/esm2022/lib/services/admin/queue-admin.service.mjs +55 -0
- package/esm2022/lib/services/admin/role-admin.service.mjs +81 -0
- package/esm2022/lib/services/admin/sandbox-admin.service.mjs +34 -0
- package/esm2022/lib/services/admin/scheduler-admin.service.mjs +34 -0
- package/esm2022/lib/services/admin/subscription.service.mjs +28 -0
- package/esm2022/lib/services/admin/system-health.service.mjs +22 -0
- package/esm2022/lib/services/admin/user-admin.service.mjs +67 -0
- package/esm2022/lib/services/admin/user-permission.service.mjs +40 -0
- package/esm2022/lib/services/admin/webhook-admin.service.mjs +61 -0
- package/esm2022/lib/services/api/agent.service.mjs +29 -0
- package/esm2022/lib/services/api/ai-feedback.service.mjs +17 -0
- package/esm2022/lib/services/api/ai.service.mjs +66 -0
- package/esm2022/lib/services/api/aip-analysis.service.mjs +20 -0
- package/esm2022/lib/services/api/aip-financial.service.mjs +29 -0
- package/esm2022/lib/services/api/aip-geographic.service.mjs +30 -0
- package/esm2022/lib/services/api/aip-network.service.mjs +29 -0
- package/esm2022/lib/services/api/aip-performance.service.mjs +29 -0
- package/esm2022/lib/services/api/aip-resource.service.mjs +23 -0
- package/esm2022/lib/services/api/aip-workflow.service.mjs +32 -0
- package/esm2022/lib/services/api/aip.service.mjs +158 -0
- package/esm2022/lib/services/api/alert.service.mjs +26 -0
- package/esm2022/lib/services/api/anomaly-detection.service.mjs +40 -0
- package/esm2022/lib/services/api/asset-lifecycle.service.mjs +78 -0
- package/esm2022/lib/services/api/audit-entry.service.mjs +22 -0
- package/esm2022/lib/services/api/base-crud.service.mjs +37 -0
- package/esm2022/lib/services/api/bid.service.mjs +17 -0
- package/esm2022/lib/services/api/budget.service.mjs +17 -0
- package/esm2022/lib/services/api/bulk-operation.service.mjs +65 -0
- package/esm2022/lib/services/api/capex-project.service.mjs +17 -0
- package/esm2022/lib/services/api/cat.service.mjs +77 -0
- package/esm2022/lib/services/api/client-article.service.mjs +23 -0
- package/esm2022/lib/services/api/community.service.mjs +41 -0
- package/esm2022/lib/services/api/company-material-type.service.mjs +17 -0
- package/esm2022/lib/services/api/company-material.service.mjs +17 -0
- package/esm2022/lib/services/api/company.service.mjs +30 -0
- package/esm2022/lib/services/api/compliance.service.mjs +74 -0
- package/esm2022/lib/services/api/component-info.service.mjs +17 -0
- package/esm2022/lib/services/api/component-location.service.mjs +17 -0
- package/esm2022/lib/services/api/component.service.mjs +53 -0
- package/esm2022/lib/services/api/cortex-event.service.mjs +17 -0
- package/esm2022/lib/services/api/cortex-insight.service.mjs +23 -0
- package/esm2022/lib/services/api/cortex-node.service.mjs +17 -0
- package/esm2022/lib/services/api/cortex.service.mjs +29 -0
- package/esm2022/lib/services/api/custom-field.service.mjs +70 -0
- package/esm2022/lib/services/api/custom.service.mjs +43 -0
- package/esm2022/lib/services/api/dashboard.service.mjs +44 -0
- package/esm2022/lib/services/api/deferral.service.mjs +54 -0
- package/esm2022/lib/services/api/department.service.mjs +17 -0
- package/esm2022/lib/services/api/device-gateway.service.mjs +33 -0
- package/esm2022/lib/services/api/diagnostic-report.service.mjs +23 -0
- package/esm2022/lib/services/api/digital-twin.service.mjs +56 -0
- package/esm2022/lib/services/api/document.service.mjs +53 -0
- package/esm2022/lib/services/api/dynamic-crud.service.mjs +67 -0
- package/esm2022/lib/services/api/energy-analytics.service.mjs +42 -0
- package/esm2022/lib/services/api/energy-production.service.mjs +17 -0
- package/esm2022/lib/services/api/energy.service.mjs +91 -0
- package/esm2022/lib/services/api/entity-comment.service.mjs +31 -0
- package/esm2022/lib/services/api/event.service.mjs +17 -0
- package/esm2022/lib/services/api/export.service.mjs +216 -0
- package/esm2022/lib/services/api/extension.service.mjs +56 -0
- package/esm2022/lib/services/api/failure.service.mjs +53 -0
- package/esm2022/lib/services/api/fleet.service.mjs +140 -0
- package/esm2022/lib/services/api/inactive-component.service.mjs +17 -0
- package/esm2022/lib/services/api/index.mjs +101 -0
- package/esm2022/lib/services/api/inspection.service.mjs +29 -0
- package/esm2022/lib/services/api/intervention-request.service.mjs +17 -0
- package/esm2022/lib/services/api/intervention.service.mjs +17 -0
- package/esm2022/lib/services/api/knowledge.service.mjs +209 -0
- package/esm2022/lib/services/api/license.service.mjs +25 -0
- package/esm2022/lib/services/api/location.service.mjs +17 -0
- package/esm2022/lib/services/api/log.service.mjs +17 -0
- package/esm2022/lib/services/api/login-history.service.mjs +17 -0
- package/esm2022/lib/services/api/maintenance-plan.service.mjs +17 -0
- package/esm2022/lib/services/api/maintenance-record.service.mjs +17 -0
- package/esm2022/lib/services/api/material-consumable.service.mjs +41 -0
- package/esm2022/lib/services/api/material-instrument.service.mjs +29 -0
- package/esm2022/lib/services/api/material-item.service.mjs +53 -0
- package/esm2022/lib/services/api/material-tooling.service.mjs +41 -0
- package/esm2022/lib/services/api/measurement-unit.service.mjs +17 -0
- package/esm2022/lib/services/api/misc-crud.service.mjs +329 -0
- package/esm2022/lib/services/api/note.service.mjs +37 -0
- package/esm2022/lib/services/api/outage-resource.service.mjs +28 -0
- package/esm2022/lib/services/api/plant-data.service.mjs +31 -0
- package/esm2022/lib/services/api/procurement.service.mjs +53 -0
- package/esm2022/lib/services/api/project.service.mjs +17 -0
- package/esm2022/lib/services/api/property-template.service.mjs +17 -0
- package/esm2022/lib/services/api/quality.service.mjs +29 -0
- package/esm2022/lib/services/api/recurring-event.service.mjs +17 -0
- package/esm2022/lib/services/api/reporting.service.mjs +117 -0
- package/esm2022/lib/services/api/reservoir-data.service.mjs +19 -0
- package/esm2022/lib/services/api/reservoir.service.mjs +209 -0
- package/esm2022/lib/services/api/room.service.mjs +17 -0
- package/esm2022/lib/services/api/sandbox.service.mjs +62 -0
- package/esm2022/lib/services/api/scheduled-report.service.mjs +17 -0
- package/esm2022/lib/services/api/search.service.mjs +77 -0
- package/esm2022/lib/services/api/sensor.service.mjs +36 -0
- package/esm2022/lib/services/api/sla-policy.service.mjs +17 -0
- package/esm2022/lib/services/api/sla.service.mjs +17 -0
- package/esm2022/lib/services/api/threshold-alert-rule.service.mjs +17 -0
- package/esm2022/lib/services/api/ticket.service.mjs +73 -0
- package/esm2022/lib/services/api/time-entry.service.mjs +17 -0
- package/esm2022/lib/services/api/todo.service.mjs +17 -0
- package/esm2022/lib/services/api/unit.service.mjs +17 -0
- package/esm2022/lib/services/api/upload.service.mjs +84 -0
- package/esm2022/lib/services/api/user.service.mjs +107 -0
- package/esm2022/lib/services/api/warehouse.service.mjs +29 -0
- package/esm2022/lib/services/api/warranty.service.mjs +29 -0
- package/esm2022/lib/services/api/work-order.service.mjs +28 -0
- package/esm2022/lib/services/api/work-permit.service.mjs +17 -0
- package/esm2022/lib/services/api/workflow.service.mjs +86 -0
- package/esm2022/lib/services/auth/auth.service.mjs +97 -0
- package/esm2022/lib/services/auth/index.mjs +5 -0
- package/esm2022/lib/services/auth/platform-auth.service.mjs +39 -0
- package/esm2022/lib/services/auth/sso-auth.service.mjs +46 -0
- package/esm2022/lib/services/auth/totp.service.mjs +34 -0
- package/esm2022/lib/services/chat/chat-rest.service.mjs +104 -0
- package/esm2022/lib/services/chat/chat-websocket.service.mjs +70 -0
- package/esm2022/lib/services/chat/index.mjs +3 -0
- package/esm2022/lib/services/index.mjs +8 -0
- package/esm2022/lib/services/realtime/index.mjs +2 -0
- package/esm2022/lib/services/realtime/realtime-event.service.mjs +187 -0
- package/esm2022/lib/services/reservoir/index.mjs +2 -0
- package/esm2022/lib/services/reservoir/reservoir-websocket.service.mjs +105 -0
- package/esm2022/lib/services/video/index.mjs +3 -0
- package/esm2022/lib/services/video/video-call-rest.service.mjs +42 -0
- package/esm2022/lib/services/video/video-call-websocket.service.mjs +55 -0
- package/esm2022/lib/tgm-sdk.config.mjs +32 -0
- package/esm2022/lib/tgm-sdk.module.mjs +38 -0
- package/esm2022/public-api.mjs +52 -0
- package/fesm2022/en-solutions-tgm-client-sdk.mjs +11029 -0
- package/fesm2022/en-solutions-tgm-client-sdk.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/database-manager/database-manager/database-manager.component.d.ts +70 -0
- package/lib/components/database-manager/database-manager.module.d.ts +15 -0
- package/lib/components/database-manager/object-browser/object-browser.component.d.ts +35 -0
- package/lib/components/database-manager/query-editor/query-editor.component.d.ts +31 -0
- package/lib/components/database-manager/query-toolbar/query-toolbar.component.d.ts +23 -0
- package/lib/components/database-manager/record-detail/record-detail.component.d.ts +35 -0
- package/lib/components/database-manager/registry/entity-registry.d.ts +16 -0
- package/lib/components/database-manager/results-grid/results-grid.component.d.ts +62 -0
- package/lib/components/database-manager/services/entity-schema.service.d.ts +37 -0
- package/lib/components/database-manager/services/query-executor.service.d.ts +57 -0
- package/lib/components/database-manager/table-data-viewer/table-data-viewer.component.d.ts +54 -0
- package/lib/components/database-manager/table-structure/table-structure.component.d.ts +16 -0
- package/lib/components/database-manager/types/database-manager.types.d.ts +71 -0
- package/lib/components/reporting/export-button/export-button.component.d.ts +50 -0
- package/lib/components/reporting/generated-report-list/generated-report-list.component.d.ts +93 -0
- package/lib/components/reporting/report-definition-form/report-definition-form.component.d.ts +65 -0
- package/lib/components/reporting/report-definition-list/report-definition-list.component.d.ts +90 -0
- package/lib/components/reporting/report-generate-dialog/report-generate-dialog.component.d.ts +46 -0
- package/lib/components/reporting/report-stats/report-stats.component.d.ts +47 -0
- package/lib/components/reporting/report-template-list/report-template-list.component.d.ts +39 -0
- package/lib/components/reporting/reporting.module.d.ts +14 -0
- package/lib/components/video-call/incoming-call/incoming-call.component.d.ts +20 -0
- package/lib/components/video-call/services/livekit-room.service.d.ts +28 -0
- package/lib/components/video-call/services/video-call-signaling.service.d.ts +21 -0
- package/lib/components/video-call/services/video-call-state.service.d.ts +25 -0
- package/lib/components/video-call/types/video-call.types.d.ts +49 -0
- package/lib/components/video-call/video-call.module.d.ts +11 -0
- package/lib/components/video-call/video-controls/video-controls.component.d.ts +13 -0
- package/lib/components/video-call/video-participant/video-participant.component.d.ts +17 -0
- package/lib/components/video-call/video-room/video-room.component.d.ts +30 -0
- package/lib/core/auth-interceptor.d.ts +13 -0
- package/lib/core/client-interceptor.d.ts +14 -0
- package/lib/core/error-handler.d.ts +13 -0
- package/lib/core/http-client.service.d.ts +61 -0
- package/lib/core/websocket.service.d.ts +37 -0
- package/lib/models/admin/audit.models.d.ts +73 -0
- package/lib/models/admin/backup.models.d.ts +101 -0
- package/lib/models/admin/client.models.d.ts +99 -0
- package/lib/models/admin/email-provider.models.d.ts +56 -0
- package/lib/models/admin/erp.models.d.ts +188 -0
- package/lib/models/admin/identity-provider.models.d.ts +1 -0
- package/lib/models/admin/index.d.ts +13 -0
- package/lib/models/admin/messaging-provider.models.d.ts +49 -0
- package/lib/models/admin/platform-admin.models.d.ts +33 -0
- package/lib/models/admin/queue.models.d.ts +54 -0
- package/lib/models/admin/role.models.d.ts +50 -0
- package/lib/models/admin/sandbox.models.d.ts +54 -0
- package/lib/models/admin/ticket.models.d.ts +48 -0
- package/lib/models/admin/webhook.models.d.ts +65 -0
- package/lib/models/api/ai.models.d.ts +75 -0
- package/lib/models/api/aip.models.d.ts +545 -0
- package/lib/models/api/cat.models.d.ts +260 -0
- package/lib/models/api/company.models.d.ts +125 -0
- package/lib/models/api/compliance.models.d.ts +74 -0
- package/lib/models/api/component.models.d.ts +294 -0
- package/lib/models/api/cortex-edge.models.d.ts +14 -0
- package/lib/models/api/cortex-event.models.d.ts +12 -0
- package/lib/models/api/cortex-insight.models.d.ts +25 -0
- package/lib/models/api/cortex-node.models.d.ts +10 -0
- package/lib/models/api/custom-field.models.d.ts +37 -0
- package/lib/models/api/deferral.models.d.ts +81 -0
- package/lib/models/api/diagnostic-report.models.d.ts +29 -0
- package/lib/models/api/document.models.d.ts +95 -0
- package/lib/models/api/energy.models.d.ts +210 -0
- package/lib/models/api/failure.models.d.ts +171 -0
- package/lib/models/api/fleet.models.d.ts +193 -0
- package/lib/models/api/inspection.models.d.ts +110 -0
- package/lib/models/api/intervention.models.d.ts +254 -0
- package/lib/models/api/iot.models.d.ts +15 -0
- package/lib/models/api/knowledge.models.d.ts +340 -0
- package/lib/models/api/loto.models.d.ts +51 -0
- package/lib/models/api/maintenance-record.models.d.ts +100 -0
- package/lib/models/api/maintenance.models.d.ts +188 -0
- package/lib/models/api/material.models.d.ts +261 -0
- package/lib/models/api/media.models.d.ts +106 -0
- package/lib/models/api/misc.models.d.ts +929 -0
- package/lib/models/api/project.models.d.ts +118 -0
- package/lib/models/api/quality.models.d.ts +153 -0
- package/lib/models/api/reporting.models.d.ts +76 -0
- package/lib/models/api/reservoir-websocket.models.d.ts +48 -0
- package/lib/models/api/reservoir.models.d.ts +274 -0
- package/lib/models/api/search.models.d.ts +30 -0
- package/lib/models/api/sensor.models.d.ts +117 -0
- package/lib/models/api/unit.models.d.ts +82 -0
- package/lib/models/api/user.models.d.ts +253 -0
- package/lib/models/api/warranty.models.d.ts +51 -0
- package/lib/models/api/work-permit.models.d.ts +70 -0
- package/lib/models/api/workflow.models.d.ts +52 -0
- package/lib/models/auth/index.d.ts +3 -0
- package/lib/models/auth/login.models.d.ts +134 -0
- package/lib/models/auth/sso.models.d.ts +136 -0
- package/lib/models/auth/totp.models.d.ts +19 -0
- package/lib/models/base.models.d.ts +90 -0
- package/lib/models/chat/chat.models.d.ts +171 -0
- package/lib/models/enums/cat.enums.d.ts +114 -0
- package/lib/models/enums/energy.enums.d.ts +50 -0
- package/lib/models/enums/erp.enums.d.ts +49 -0
- package/lib/models/enums/index.d.ts +14 -0
- package/lib/models/enums/inspection.enums.d.ts +61 -0
- package/lib/models/enums/loto.enums.d.ts +41 -0
- package/lib/models/enums/misc.enums.d.ts +151 -0
- package/lib/models/enums/quality.enums.d.ts +25 -0
- package/lib/models/enums/reservoir.enums.d.ts +80 -0
- package/lib/models/enums/sso.enums.d.ts +15 -0
- package/lib/models/enums/status.enums.d.ts +296 -0
- package/lib/models/enums/time.enums.d.ts +51 -0
- package/lib/models/enums/type.enums.d.ts +324 -0
- package/lib/models/enums/user.enums.d.ts +31 -0
- package/lib/models/enums/work-permit.enums.d.ts +56 -0
- package/lib/models/index.d.ts +41 -0
- package/lib/models/realtime/realtime-event.models.d.ts +95 -0
- package/lib/models/video/video-call.models.d.ts +65 -0
- package/lib/services/admin/activity-log.service.d.ts +13 -0
- package/lib/services/admin/announcement.service.d.ts +17 -0
- package/lib/services/admin/article-admin.service.d.ts +17 -0
- package/lib/services/admin/audit-log.service.d.ts +22 -0
- package/lib/services/admin/backup.service.d.ts +15 -0
- package/lib/services/admin/cache-admin.service.d.ts +26 -0
- package/lib/services/admin/client-admin.service.d.ts +38 -0
- package/lib/services/admin/client-api-key.service.d.ts +15 -0
- package/lib/services/admin/client-ocr.service.d.ts +14 -0
- package/lib/services/admin/client-usage.service.d.ts +15 -0
- package/lib/services/admin/data-export.service.d.ts +10 -0
- package/lib/services/admin/document-admin.service.d.ts +18 -0
- package/lib/services/admin/email-admin.service.d.ts +14 -0
- package/lib/services/admin/email-provider.service.d.ts +25 -0
- package/lib/services/admin/erp-admin.service.d.ts +41 -0
- package/lib/services/admin/identity-provider.service.d.ts +21 -0
- package/lib/services/admin/impersonation.service.d.ts +11 -0
- package/lib/services/admin/index.d.ts +30 -0
- package/lib/services/admin/messaging-provider.service.d.ts +24 -0
- package/lib/services/admin/notification.service.d.ts +15 -0
- package/lib/services/admin/platform-admin.service.d.ts +17 -0
- package/lib/services/admin/platform-webhook.service.d.ts +16 -0
- package/lib/services/admin/queue-admin.service.d.ts +24 -0
- package/lib/services/admin/role-admin.service.d.ts +37 -0
- package/lib/services/admin/sandbox-admin.service.d.ts +17 -0
- package/lib/services/admin/scheduler-admin.service.d.ts +61 -0
- package/lib/services/admin/subscription.service.d.ts +15 -0
- package/lib/services/admin/system-health.service.d.ts +11 -0
- package/lib/services/admin/user-admin.service.d.ts +27 -0
- package/lib/services/admin/user-permission.service.d.ts +18 -0
- package/lib/services/admin/webhook-admin.service.d.ts +26 -0
- package/lib/services/api/agent.service.d.ts +16 -0
- package/lib/services/api/ai-feedback.service.d.ts +9 -0
- package/lib/services/api/ai.service.d.ts +36 -0
- package/lib/services/api/aip-analysis.service.d.ts +13 -0
- package/lib/services/api/aip-financial.service.d.ts +16 -0
- package/lib/services/api/aip-geographic.service.d.ts +16 -0
- package/lib/services/api/aip-network.service.d.ts +16 -0
- package/lib/services/api/aip-performance.service.d.ts +16 -0
- package/lib/services/api/aip-resource.service.d.ts +14 -0
- package/lib/services/api/aip-workflow.service.d.ts +24 -0
- package/lib/services/api/aip.service.d.ts +73 -0
- package/lib/services/api/alert.service.d.ts +15 -0
- package/lib/services/api/anomaly-detection.service.d.ts +26 -0
- package/lib/services/api/asset-lifecycle.service.d.ts +29 -0
- package/lib/services/api/audit-entry.service.d.ts +13 -0
- package/lib/services/api/base-crud.service.d.ts +18 -0
- package/lib/services/api/bid.service.d.ts +10 -0
- package/lib/services/api/budget.service.d.ts +10 -0
- package/lib/services/api/bulk-operation.service.d.ts +26 -0
- package/lib/services/api/capex-project.service.d.ts +10 -0
- package/lib/services/api/cat.service.d.ts +40 -0
- package/lib/services/api/client-article.service.d.ts +14 -0
- package/lib/services/api/community.service.d.ts +21 -0
- package/lib/services/api/company-material-type.service.d.ts +10 -0
- package/lib/services/api/company-material.service.d.ts +9 -0
- package/lib/services/api/company.service.d.ts +15 -0
- package/lib/services/api/compliance.service.d.ts +35 -0
- package/lib/services/api/component-info.service.d.ts +10 -0
- package/lib/services/api/component-location.service.d.ts +10 -0
- package/lib/services/api/component.service.d.ts +32 -0
- package/lib/services/api/cortex-event.service.d.ts +10 -0
- package/lib/services/api/cortex-insight.service.d.ts +14 -0
- package/lib/services/api/cortex-node.service.d.ts +10 -0
- package/lib/services/api/cortex.service.d.ts +15 -0
- package/lib/services/api/custom-field.service.d.ts +33 -0
- package/lib/services/api/custom.service.d.ts +23 -0
- package/lib/services/api/dashboard.service.d.ts +18 -0
- package/lib/services/api/deferral.service.d.ts +29 -0
- package/lib/services/api/department.service.d.ts +9 -0
- package/lib/services/api/device-gateway.service.d.ts +16 -0
- package/lib/services/api/diagnostic-report.service.d.ts +14 -0
- package/lib/services/api/digital-twin.service.d.ts +29 -0
- package/lib/services/api/document.service.d.ts +28 -0
- package/lib/services/api/dynamic-crud.service.d.ts +41 -0
- package/lib/services/api/energy-analytics.service.d.ts +16 -0
- package/lib/services/api/energy-production.service.d.ts +10 -0
- package/lib/services/api/energy.service.d.ts +46 -0
- package/lib/services/api/entity-comment.service.d.ts +16 -0
- package/lib/services/api/event.service.d.ts +10 -0
- package/lib/services/api/export.service.d.ts +48 -0
- package/lib/services/api/extension.service.d.ts +24 -0
- package/lib/services/api/failure.service.d.ts +28 -0
- package/lib/services/api/fleet.service.d.ts +71 -0
- package/lib/services/api/inactive-component.service.d.ts +10 -0
- package/lib/services/api/index.d.ts +101 -0
- package/lib/services/api/inspection.service.d.ts +16 -0
- package/lib/services/api/intervention-request.service.d.ts +10 -0
- package/lib/services/api/intervention.service.d.ts +10 -0
- package/lib/services/api/knowledge.service.d.ts +106 -0
- package/lib/services/api/license.service.d.ts +14 -0
- package/lib/services/api/location.service.d.ts +9 -0
- package/lib/services/api/log.service.d.ts +9 -0
- package/lib/services/api/login-history.service.d.ts +10 -0
- package/lib/services/api/maintenance-plan.service.d.ts +10 -0
- package/lib/services/api/maintenance-record.service.d.ts +10 -0
- package/lib/services/api/material-consumable.service.d.ts +22 -0
- package/lib/services/api/material-instrument.service.d.ts +16 -0
- package/lib/services/api/material-item.service.d.ts +28 -0
- package/lib/services/api/material-tooling.service.d.ts +22 -0
- package/lib/services/api/measurement-unit.service.d.ts +10 -0
- package/lib/services/api/misc-crud.service.d.ts +167 -0
- package/lib/services/api/note.service.d.ts +14 -0
- package/lib/services/api/outage-resource.service.d.ts +15 -0
- package/lib/services/api/plant-data.service.d.ts +14 -0
- package/lib/services/api/procurement.service.d.ts +27 -0
- package/lib/services/api/project.service.d.ts +10 -0
- package/lib/services/api/property-template.service.d.ts +10 -0
- package/lib/services/api/quality.service.d.ts +16 -0
- package/lib/services/api/recurring-event.service.d.ts +10 -0
- package/lib/services/api/reporting.service.d.ts +38 -0
- package/lib/services/api/reservoir-data.service.d.ts +10 -0
- package/lib/services/api/reservoir.service.d.ts +109 -0
- package/lib/services/api/room.service.d.ts +10 -0
- package/lib/services/api/sandbox.service.d.ts +26 -0
- package/lib/services/api/scheduled-report.service.d.ts +10 -0
- package/lib/services/api/search.service.d.ts +54 -0
- package/lib/services/api/sensor.service.d.ts +17 -0
- package/lib/services/api/sla-policy.service.d.ts +10 -0
- package/lib/services/api/sla.service.d.ts +10 -0
- package/lib/services/api/threshold-alert-rule.service.d.ts +10 -0
- package/lib/services/api/ticket.service.d.ts +60 -0
- package/lib/services/api/time-entry.service.d.ts +10 -0
- package/lib/services/api/todo.service.d.ts +10 -0
- package/lib/services/api/unit.service.d.ts +10 -0
- package/lib/services/api/upload.service.d.ts +50 -0
- package/lib/services/api/user.service.d.ts +59 -0
- package/lib/services/api/warehouse.service.d.ts +15 -0
- package/lib/services/api/warranty.service.d.ts +16 -0
- package/lib/services/api/work-order.service.d.ts +17 -0
- package/lib/services/api/work-permit.service.d.ts +10 -0
- package/lib/services/api/workflow.service.d.ts +33 -0
- package/lib/services/auth/auth.service.d.ts +33 -0
- package/lib/services/auth/index.d.ts +4 -0
- package/lib/services/auth/platform-auth.service.d.ts +16 -0
- package/lib/services/auth/sso-auth.service.d.ts +21 -0
- package/lib/services/auth/totp.service.d.ts +18 -0
- package/lib/services/chat/chat-rest.service.d.ts +40 -0
- package/lib/services/chat/chat-websocket.service.d.ts +34 -0
- package/lib/services/chat/index.d.ts +2 -0
- package/lib/services/index.d.ts +7 -0
- package/lib/services/realtime/index.d.ts +1 -0
- package/lib/services/realtime/realtime-event.service.d.ts +137 -0
- package/lib/services/reservoir/index.d.ts +1 -0
- package/lib/services/reservoir/reservoir-websocket.service.d.ts +47 -0
- package/lib/services/video/index.d.ts +2 -0
- package/lib/services/video/video-call-rest.service.d.ts +19 -0
- package/lib/services/video/video-call-websocket.service.d.ts +31 -0
- package/lib/tgm-sdk.config.d.ts +36 -0
- package/lib/tgm-sdk.module.d.ts +13 -0
- package/package.json +40 -0
- package/public-api.d.ts +42 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class ResultsGridComponent {
|
|
6
|
+
// ── Data ──
|
|
7
|
+
data = [];
|
|
8
|
+
columns = [];
|
|
9
|
+
total = 0;
|
|
10
|
+
page = 0;
|
|
11
|
+
pageSize = 25;
|
|
12
|
+
loading = false;
|
|
13
|
+
sortField;
|
|
14
|
+
sortOrder;
|
|
15
|
+
// ── Behavior ──
|
|
16
|
+
showPagination = true;
|
|
17
|
+
showExport = false;
|
|
18
|
+
// ── Labels ──
|
|
19
|
+
noResultsMessage = 'No results found.';
|
|
20
|
+
loadingMessage = 'Executing query...';
|
|
21
|
+
// ── CSS overrides ──
|
|
22
|
+
rowClass = '';
|
|
23
|
+
// ── Custom templates ──
|
|
24
|
+
cellTemplate;
|
|
25
|
+
headerTemplate;
|
|
26
|
+
emptyTemplate;
|
|
27
|
+
paginationTemplate;
|
|
28
|
+
// ── Events ──
|
|
29
|
+
sort = new EventEmitter();
|
|
30
|
+
pageChange = new EventEmitter();
|
|
31
|
+
rowClick = new EventEmitter();
|
|
32
|
+
rowDoubleClick = new EventEmitter();
|
|
33
|
+
cellClick = new EventEmitter();
|
|
34
|
+
exportData = new EventEmitter();
|
|
35
|
+
get visibleColumns() {
|
|
36
|
+
return this.columns.filter(c => !c.hidden);
|
|
37
|
+
}
|
|
38
|
+
get pageCount() {
|
|
39
|
+
return this.pageSize > 0 ? Math.ceil(this.total / this.pageSize) : 1;
|
|
40
|
+
}
|
|
41
|
+
get startRow() {
|
|
42
|
+
return this.page * this.pageSize + 1;
|
|
43
|
+
}
|
|
44
|
+
get endRow() {
|
|
45
|
+
return Math.min((this.page + 1) * this.pageSize, this.total);
|
|
46
|
+
}
|
|
47
|
+
onSort(field) {
|
|
48
|
+
const col = this.columns.find(c => c.name === field);
|
|
49
|
+
if (col?.sortable === false)
|
|
50
|
+
return;
|
|
51
|
+
let order = 'ASC';
|
|
52
|
+
if (this.sortField === field && this.sortOrder === 'ASC') {
|
|
53
|
+
order = 'DESC';
|
|
54
|
+
}
|
|
55
|
+
this.sortField = field;
|
|
56
|
+
this.sortOrder = order;
|
|
57
|
+
this.sort.emit({ field, order });
|
|
58
|
+
}
|
|
59
|
+
onRowClick(row) {
|
|
60
|
+
this.rowClick.emit(row);
|
|
61
|
+
}
|
|
62
|
+
onRowDoubleClick(row) {
|
|
63
|
+
this.rowDoubleClick.emit(row);
|
|
64
|
+
}
|
|
65
|
+
onCellClick(row, column) {
|
|
66
|
+
this.cellClick.emit({ row, column, value: row[column.name] });
|
|
67
|
+
}
|
|
68
|
+
prevPage() {
|
|
69
|
+
if (this.page > 0) {
|
|
70
|
+
this.page--;
|
|
71
|
+
this.pageChange.emit(this.page);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
nextPage() {
|
|
75
|
+
if (this.page < this.pageCount - 1) {
|
|
76
|
+
this.page++;
|
|
77
|
+
this.pageChange.emit(this.page);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
goToPage(p) {
|
|
81
|
+
if (p >= 0 && p < this.pageCount) {
|
|
82
|
+
this.page = p;
|
|
83
|
+
this.pageChange.emit(this.page);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
onExport() {
|
|
87
|
+
this.exportData.emit();
|
|
88
|
+
}
|
|
89
|
+
formatValue(value, col) {
|
|
90
|
+
if (value == null)
|
|
91
|
+
return '';
|
|
92
|
+
if (col.type === 'boolean')
|
|
93
|
+
return value ? 'Yes' : 'No';
|
|
94
|
+
if (col.type === 'date')
|
|
95
|
+
return String(value);
|
|
96
|
+
if (col.type === 'json' || col.type === 'array') {
|
|
97
|
+
try {
|
|
98
|
+
return JSON.stringify(value);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return String(value);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return String(value);
|
|
105
|
+
}
|
|
106
|
+
trackByName(_index, col) {
|
|
107
|
+
return col.name;
|
|
108
|
+
}
|
|
109
|
+
trackByIndex(index) {
|
|
110
|
+
return index;
|
|
111
|
+
}
|
|
112
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ResultsGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
113
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ResultsGridComponent, isStandalone: true, selector: "tgm-results-grid", inputs: { data: "data", columns: "columns", total: "total", page: "page", pageSize: "pageSize", loading: "loading", sortField: "sortField", sortOrder: "sortOrder", showPagination: "showPagination", showExport: "showExport", noResultsMessage: "noResultsMessage", loadingMessage: "loadingMessage", rowClass: "rowClass", cellTemplate: "cellTemplate", headerTemplate: "headerTemplate", emptyTemplate: "emptyTemplate", paginationTemplate: "paginationTemplate" }, outputs: { sort: "sort", pageChange: "pageChange", rowClick: "rowClick", rowDoubleClick: "rowDoubleClick", cellClick: "cellClick", exportData: "exportData" }, ngImport: i0, template: "<div class=\"tgm-results-grid\">\n <!-- Loading -->\n <div class=\"tgm-results-grid__loading\" *ngIf=\"loading\">\n <div class=\"tgm-db-spinner\"></div>\n <p>{{ loadingMessage }}</p>\n </div>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && data.length === 0\">\n <ng-container *ngIf=\"emptyTemplate; else defaultEmpty\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n </ng-container>\n <ng-template #defaultEmpty>\n <div class=\"tgm-results-grid__empty\">\n <p>{{ noResultsMessage }}</p>\n </div>\n </ng-template>\n </ng-container>\n\n <!-- Table -->\n <div class=\"tgm-results-grid__table-wrapper\" *ngIf=\"!loading && data.length > 0\">\n <table class=\"tgm-results-grid__table\">\n <thead>\n <tr>\n <th class=\"tgm-results-grid__th tgm-results-grid__th--row-num\">#</th>\n <th\n *ngFor=\"let col of visibleColumns; trackBy: trackByName\"\n class=\"tgm-results-grid__th\"\n [class.tgm-results-grid__th--sortable]=\"col.sortable !== false\"\n [class.tgm-results-grid__th--sorted]=\"sortField === col.name\"\n (click)=\"onSort(col.name)\"\n >\n <ng-container *ngIf=\"headerTemplate; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <span>{{ col.label }}</span>\n <span class=\"tgm-results-grid__sort-icon\" *ngIf=\"sortField === col.name\">\n {{ sortOrder === 'ASC' ? '▲' : '▼' }}\n </span>\n </ng-template>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let row of data; let i = index; trackBy: trackByIndex\"\n class=\"tgm-results-grid__tr\"\n [ngClass]=\"rowClass\"\n (click)=\"onRowClick(row)\"\n (dblclick)=\"onRowDoubleClick(row)\"\n >\n <td class=\"tgm-results-grid__td tgm-results-grid__td--row-num\">{{ startRow + i }}</td>\n <td\n *ngFor=\"let col of visibleColumns; trackBy: trackByName\"\n class=\"tgm-results-grid__td\"\n (click)=\"onCellClick(row, col)\"\n >\n <ng-container *ngIf=\"cellTemplate; else defaultCell\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row[col.name], column: col, row: row }\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <span class=\"tgm-results-grid__cell-value\" [title]=\"formatValue(row[col.name], col)\">\n {{ formatValue(row[col.name], col) }}\n </span>\n </ng-template>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n <div class=\"tgm-results-grid__footer\" *ngIf=\"!loading && data.length > 0 && showPagination\">\n <ng-container *ngIf=\"paginationTemplate; else defaultPagination\">\n <ng-container *ngTemplateOutlet=\"paginationTemplate; context: { page: page, pageSize: pageSize, total: total }\"></ng-container>\n </ng-container>\n <ng-template #defaultPagination>\n <div class=\"tgm-results-grid__pagination\">\n <span class=\"tgm-results-grid__info\">\n Rows {{ startRow }}-{{ endRow }} of {{ total }}\n </span>\n <div class=\"tgm-results-grid__page-controls\">\n <button\n class=\"tgm-db-btn tgm-db-btn--ghost tgm-db-btn--sm\"\n [disabled]=\"page === 0\"\n (click)=\"prevPage()\"\n >◀</button>\n <span class=\"tgm-results-grid__page-info\">\n Page {{ page + 1 }} of {{ pageCount }}\n </span>\n <button\n class=\"tgm-db-btn tgm-db-btn--ghost tgm-db-btn--sm\"\n [disabled]=\"page >= pageCount - 1\"\n (click)=\"nextPage()\"\n >▶</button>\n </div>\n <button\n *ngIf=\"showExport\"\n class=\"tgm-db-btn tgm-db-btn--ghost tgm-db-btn--sm\"\n (click)=\"onExport()\"\n >Export</button>\n </div>\n </ng-template>\n </div>\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden}.tgm-results-grid{display:flex;flex-direction:column;height:100%}.tgm-results-grid__loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 0;color:var(--tgm-db-text-secondary, #9ca3af)}.tgm-results-grid__loading p{margin:12px 0 0}.tgm-results-grid__empty{display:flex;align-items:center;justify-content:center;padding:48px 0;color:var(--tgm-db-text-muted, #6b7280)}.tgm-results-grid__empty p{margin:0}.tgm-results-grid__table-wrapper{flex:1;overflow:auto}.tgm-results-grid__table{width:100%;border-collapse:collapse;font-size:13px}.tgm-results-grid__th{position:sticky;top:0;padding:8px 12px;text-align:left;font-weight:600;font-size:12px;color:var(--tgm-db-text-secondary, #9ca3af);background:var(--tgm-db-bg-secondary, rgba(255, 255, 255, .05));border-bottom:1px solid var(--tgm-db-border, rgba(255, 255, 255, .1));white-space:nowrap;-webkit-user-select:none;user-select:none;z-index:1}.tgm-results-grid__th--sortable{cursor:pointer}.tgm-results-grid__th--sortable:hover{color:var(--tgm-db-text, #e5e7eb)}.tgm-results-grid__th--sorted{color:var(--tgm-db-primary, #3b82f6)}.tgm-results-grid__th--row-num{width:50px;text-align:center;color:var(--tgm-db-text-muted, #6b7280)}.tgm-results-grid__sort-icon{margin-left:4px;font-size:9px}.tgm-results-grid__tr{cursor:pointer;transition:background .1s}.tgm-results-grid__tr:hover{background:var(--tgm-db-bg-hover, rgba(255, 255, 255, .08))}.tgm-results-grid__tr:nth-child(2n){background:#ffffff05}.tgm-results-grid__tr:nth-child(2n):hover{background:var(--tgm-db-bg-hover, rgba(255, 255, 255, .08))}.tgm-results-grid__td{padding:6px 12px;border-bottom:1px solid rgba(255,255,255,.04);color:var(--tgm-db-text, #e5e7eb)}.tgm-results-grid__td--row-num{text-align:center;color:var(--tgm-db-text-muted, #6b7280);font-size:12px}.tgm-results-grid__cell-value{display:inline-block;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tgm-results-grid__footer{border-top:1px solid var(--tgm-db-border, rgba(255, 255, 255, .1));background:var(--tgm-db-bg-secondary, rgba(255, 255, 255, .05))}.tgm-results-grid__pagination{display:flex;align-items:center;justify-content:space-between;padding:6px var(--tgm-db-spacing-sm, 8px);font-size:12px;color:var(--tgm-db-text-secondary, #9ca3af)}.tgm-results-grid__info{white-space:nowrap}.tgm-results-grid__page-controls{display:flex;align-items:center;gap:6px}.tgm-results-grid__page-info{white-space:nowrap}.tgm-db-btn--sm{padding:3px 8px;font-size:12px}.tgm-db-btn--ghost{background:transparent;border:none;color:var(--tgm-db-text-secondary, #9ca3af);cursor:pointer;border-radius:var(--tgm-db-radius-sm, 4px);font-family:var(--tgm-db-font-family, inherit);transition:background .15s}.tgm-db-btn--ghost:hover:not(:disabled){background:var(--tgm-db-bg-hover, rgba(255, 255, 255, .08));color:var(--tgm-db-text, #e5e7eb)}.tgm-db-btn--ghost:disabled{opacity:.4;cursor:not-allowed}.tgm-db-spinner{width:32px;height:32px;border:3px solid var(--tgm-db-border, rgba(255, 255, 255, .1));border-top-color:var(--tgm-db-primary, #3b82f6);border-radius:50%;animation:tgm-db-spin .8s linear infinite}@keyframes tgm-db-spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
114
|
+
}
|
|
115
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ResultsGridComponent, decorators: [{
|
|
116
|
+
type: Component,
|
|
117
|
+
args: [{ selector: 'tgm-results-grid', standalone: true, imports: [CommonModule], template: "<div class=\"tgm-results-grid\">\n <!-- Loading -->\n <div class=\"tgm-results-grid__loading\" *ngIf=\"loading\">\n <div class=\"tgm-db-spinner\"></div>\n <p>{{ loadingMessage }}</p>\n </div>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && data.length === 0\">\n <ng-container *ngIf=\"emptyTemplate; else defaultEmpty\">\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n </ng-container>\n <ng-template #defaultEmpty>\n <div class=\"tgm-results-grid__empty\">\n <p>{{ noResultsMessage }}</p>\n </div>\n </ng-template>\n </ng-container>\n\n <!-- Table -->\n <div class=\"tgm-results-grid__table-wrapper\" *ngIf=\"!loading && data.length > 0\">\n <table class=\"tgm-results-grid__table\">\n <thead>\n <tr>\n <th class=\"tgm-results-grid__th tgm-results-grid__th--row-num\">#</th>\n <th\n *ngFor=\"let col of visibleColumns; trackBy: trackByName\"\n class=\"tgm-results-grid__th\"\n [class.tgm-results-grid__th--sortable]=\"col.sortable !== false\"\n [class.tgm-results-grid__th--sorted]=\"sortField === col.name\"\n (click)=\"onSort(col.name)\"\n >\n <ng-container *ngIf=\"headerTemplate; else defaultHeader\">\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: { $implicit: col }\"></ng-container>\n </ng-container>\n <ng-template #defaultHeader>\n <span>{{ col.label }}</span>\n <span class=\"tgm-results-grid__sort-icon\" *ngIf=\"sortField === col.name\">\n {{ sortOrder === 'ASC' ? '▲' : '▼' }}\n </span>\n </ng-template>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"let row of data; let i = index; trackBy: trackByIndex\"\n class=\"tgm-results-grid__tr\"\n [ngClass]=\"rowClass\"\n (click)=\"onRowClick(row)\"\n (dblclick)=\"onRowDoubleClick(row)\"\n >\n <td class=\"tgm-results-grid__td tgm-results-grid__td--row-num\">{{ startRow + i }}</td>\n <td\n *ngFor=\"let col of visibleColumns; trackBy: trackByName\"\n class=\"tgm-results-grid__td\"\n (click)=\"onCellClick(row, col)\"\n >\n <ng-container *ngIf=\"cellTemplate; else defaultCell\">\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row[col.name], column: col, row: row }\"></ng-container>\n </ng-container>\n <ng-template #defaultCell>\n <span class=\"tgm-results-grid__cell-value\" [title]=\"formatValue(row[col.name], col)\">\n {{ formatValue(row[col.name], col) }}\n </span>\n </ng-template>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Pagination -->\n <div class=\"tgm-results-grid__footer\" *ngIf=\"!loading && data.length > 0 && showPagination\">\n <ng-container *ngIf=\"paginationTemplate; else defaultPagination\">\n <ng-container *ngTemplateOutlet=\"paginationTemplate; context: { page: page, pageSize: pageSize, total: total }\"></ng-container>\n </ng-container>\n <ng-template #defaultPagination>\n <div class=\"tgm-results-grid__pagination\">\n <span class=\"tgm-results-grid__info\">\n Rows {{ startRow }}-{{ endRow }} of {{ total }}\n </span>\n <div class=\"tgm-results-grid__page-controls\">\n <button\n class=\"tgm-db-btn tgm-db-btn--ghost tgm-db-btn--sm\"\n [disabled]=\"page === 0\"\n (click)=\"prevPage()\"\n >◀</button>\n <span class=\"tgm-results-grid__page-info\">\n Page {{ page + 1 }} of {{ pageCount }}\n </span>\n <button\n class=\"tgm-db-btn tgm-db-btn--ghost tgm-db-btn--sm\"\n [disabled]=\"page >= pageCount - 1\"\n (click)=\"nextPage()\"\n >▶</button>\n </div>\n <button\n *ngIf=\"showExport\"\n class=\"tgm-db-btn tgm-db-btn--ghost tgm-db-btn--sm\"\n (click)=\"onExport()\"\n >Export</button>\n </div>\n </ng-template>\n </div>\n</div>\n", styles: [":host{display:block;height:100%;overflow:hidden}.tgm-results-grid{display:flex;flex-direction:column;height:100%}.tgm-results-grid__loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 0;color:var(--tgm-db-text-secondary, #9ca3af)}.tgm-results-grid__loading p{margin:12px 0 0}.tgm-results-grid__empty{display:flex;align-items:center;justify-content:center;padding:48px 0;color:var(--tgm-db-text-muted, #6b7280)}.tgm-results-grid__empty p{margin:0}.tgm-results-grid__table-wrapper{flex:1;overflow:auto}.tgm-results-grid__table{width:100%;border-collapse:collapse;font-size:13px}.tgm-results-grid__th{position:sticky;top:0;padding:8px 12px;text-align:left;font-weight:600;font-size:12px;color:var(--tgm-db-text-secondary, #9ca3af);background:var(--tgm-db-bg-secondary, rgba(255, 255, 255, .05));border-bottom:1px solid var(--tgm-db-border, rgba(255, 255, 255, .1));white-space:nowrap;-webkit-user-select:none;user-select:none;z-index:1}.tgm-results-grid__th--sortable{cursor:pointer}.tgm-results-grid__th--sortable:hover{color:var(--tgm-db-text, #e5e7eb)}.tgm-results-grid__th--sorted{color:var(--tgm-db-primary, #3b82f6)}.tgm-results-grid__th--row-num{width:50px;text-align:center;color:var(--tgm-db-text-muted, #6b7280)}.tgm-results-grid__sort-icon{margin-left:4px;font-size:9px}.tgm-results-grid__tr{cursor:pointer;transition:background .1s}.tgm-results-grid__tr:hover{background:var(--tgm-db-bg-hover, rgba(255, 255, 255, .08))}.tgm-results-grid__tr:nth-child(2n){background:#ffffff05}.tgm-results-grid__tr:nth-child(2n):hover{background:var(--tgm-db-bg-hover, rgba(255, 255, 255, .08))}.tgm-results-grid__td{padding:6px 12px;border-bottom:1px solid rgba(255,255,255,.04);color:var(--tgm-db-text, #e5e7eb)}.tgm-results-grid__td--row-num{text-align:center;color:var(--tgm-db-text-muted, #6b7280);font-size:12px}.tgm-results-grid__cell-value{display:inline-block;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tgm-results-grid__footer{border-top:1px solid var(--tgm-db-border, rgba(255, 255, 255, .1));background:var(--tgm-db-bg-secondary, rgba(255, 255, 255, .05))}.tgm-results-grid__pagination{display:flex;align-items:center;justify-content:space-between;padding:6px var(--tgm-db-spacing-sm, 8px);font-size:12px;color:var(--tgm-db-text-secondary, #9ca3af)}.tgm-results-grid__info{white-space:nowrap}.tgm-results-grid__page-controls{display:flex;align-items:center;gap:6px}.tgm-results-grid__page-info{white-space:nowrap}.tgm-db-btn--sm{padding:3px 8px;font-size:12px}.tgm-db-btn--ghost{background:transparent;border:none;color:var(--tgm-db-text-secondary, #9ca3af);cursor:pointer;border-radius:var(--tgm-db-radius-sm, 4px);font-family:var(--tgm-db-font-family, inherit);transition:background .15s}.tgm-db-btn--ghost:hover:not(:disabled){background:var(--tgm-db-bg-hover, rgba(255, 255, 255, .08));color:var(--tgm-db-text, #e5e7eb)}.tgm-db-btn--ghost:disabled{opacity:.4;cursor:not-allowed}.tgm-db-spinner{width:32px;height:32px;border:3px solid var(--tgm-db-border, rgba(255, 255, 255, .1));border-top-color:var(--tgm-db-primary, #3b82f6);border-radius:50%;animation:tgm-db-spin .8s linear infinite}@keyframes tgm-db-spin{to{transform:rotate(360deg)}}\n"] }]
|
|
118
|
+
}], propDecorators: { data: [{
|
|
119
|
+
type: Input
|
|
120
|
+
}], columns: [{
|
|
121
|
+
type: Input
|
|
122
|
+
}], total: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], page: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], pageSize: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], loading: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], sortField: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], sortOrder: [{
|
|
133
|
+
type: Input
|
|
134
|
+
}], showPagination: [{
|
|
135
|
+
type: Input
|
|
136
|
+
}], showExport: [{
|
|
137
|
+
type: Input
|
|
138
|
+
}], noResultsMessage: [{
|
|
139
|
+
type: Input
|
|
140
|
+
}], loadingMessage: [{
|
|
141
|
+
type: Input
|
|
142
|
+
}], rowClass: [{
|
|
143
|
+
type: Input
|
|
144
|
+
}], cellTemplate: [{
|
|
145
|
+
type: Input
|
|
146
|
+
}], headerTemplate: [{
|
|
147
|
+
type: Input
|
|
148
|
+
}], emptyTemplate: [{
|
|
149
|
+
type: Input
|
|
150
|
+
}], paginationTemplate: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], sort: [{
|
|
153
|
+
type: Output
|
|
154
|
+
}], pageChange: [{
|
|
155
|
+
type: Output
|
|
156
|
+
}], rowClick: [{
|
|
157
|
+
type: Output
|
|
158
|
+
}], rowDoubleClick: [{
|
|
159
|
+
type: Output
|
|
160
|
+
}], cellClick: [{
|
|
161
|
+
type: Output
|
|
162
|
+
}], exportData: [{
|
|
163
|
+
type: Output
|
|
164
|
+
}] } });
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0cy1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kYXRhYmFzZS1tYW5hZ2VyL3Jlc3VsdHMtZ3JpZC9yZXN1bHRzLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2RhdGFiYXNlLW1hbmFnZXIvcmVzdWx0cy1ncmlkL3Jlc3VsdHMtZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBVS9DLE1BQU0sT0FBTyxvQkFBb0I7SUFDL0IsYUFBYTtJQUNKLElBQUksR0FBVSxFQUFFLENBQUM7SUFDakIsT0FBTyxHQUFzQixFQUFFLENBQUM7SUFDaEMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNWLElBQUksR0FBRyxDQUFDLENBQUM7SUFDVCxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixTQUFTLENBQVU7SUFDbkIsU0FBUyxDQUFrQjtJQUVwQyxpQkFBaUI7SUFDUixjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFFNUIsZUFBZTtJQUNOLGdCQUFnQixHQUFHLG1CQUFtQixDQUFDO0lBQ3ZDLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztJQUUvQyxzQkFBc0I7SUFDYixRQUFRLEdBQUcsRUFBRSxDQUFDO0lBRXZCLHlCQUF5QjtJQUNoQixZQUFZLENBQXNFO0lBQ2xGLGNBQWMsQ0FBK0M7SUFDN0QsYUFBYSxDQUFxQjtJQUNsQyxrQkFBa0IsQ0FBa0U7SUFFN0YsZUFBZTtJQUNMLElBQUks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bEIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzt3R0F0SFUsb0JBQW9COzRGQUFwQixvQkFBb0IscXJCQ2pCakMsMnNJQTBHQSxzdEdEN0ZZLFlBQVk7OzRGQUlYLG9CQUFvQjtrQkFQaEMsU0FBUzsrQkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDOzhCQU1kLElBQUk7c0JBQVosS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUdJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVudGl0eUZpZWxkTWV0YSB9IGZyb20gJy4uL3R5cGVzL2RhdGFiYXNlLW1hbmFnZXIudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0Z20tcmVzdWx0cy1ncmlkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN1bHRzLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXN1bHRzLWdyaWQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVzdWx0c0dyaWRDb21wb25lbnQge1xuICAvLyDilIDilIAgRGF0YSDilIDilIBcbiAgQElucHV0KCkgZGF0YTogYW55W10gPSBbXTtcbiAgQElucHV0KCkgY29sdW1uczogRW50aXR5RmllbGRNZXRhW10gPSBbXTtcbiAgQElucHV0KCkgdG90YWwgPSAwO1xuICBASW5wdXQoKSBwYWdlID0gMDtcbiAgQElucHV0KCkgcGFnZVNpemUgPSAyNTtcbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBzb3J0RmllbGQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNvcnRPcmRlcj86ICdBU0MnIHwgJ0RFU0MnO1xuXG4gIC8vIOKUgOKUgCBCZWhhdmlvciDilIDilIBcbiAgQElucHV0KCkgc2hvd1BhZ2luYXRpb24gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RXhwb3J0ID0gZmFsc2U7XG5cbiAgLy8g4pSA4pSAIExhYmVscyDilIDilIBcbiAgQElucHV0KCkgbm9SZXN1bHRzTWVzc2FnZSA9ICdObyByZXN1bHRzIGZvdW5kLic7XG4gIEBJbnB1dCgpIGxvYWRpbmdNZXNzYWdlID0gJ0V4ZWN1dGluZyBxdWVyeS4uLic7XG5cbiAgLy8g4pSA4pSAIENTUyBvdmVycmlkZXMg4pSA4pSAXG4gIEBJbnB1dCgpIHJvd0NsYXNzID0gJyc7XG5cbiAgLy8g4pSA4pSAIEN1c3RvbSB0ZW1wbGF0ZXMg4pSA4pSAXG4gIEBJbnB1dCgpIGNlbGxUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHsgJGltcGxpY2l0OiBhbnk7IGNvbHVtbjogRW50aXR5RmllbGRNZXRhOyByb3c6IGFueSB9PjtcbiAgQElucHV0KCkgaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7ICRpbXBsaWNpdDogRW50aXR5RmllbGRNZXRhIH0+O1xuICBASW5wdXQoKSBlbXB0eVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpIHBhZ2luYXRpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHsgcGFnZTogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyOyB0b3RhbDogbnVtYmVyIH0+O1xuXG4gIC8vIOKUgOKUgCBFdmVudHMg4pSA4pSAXG4gIEBPdXRwdXQoKSBzb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZpZWxkOiBzdHJpbmc7IG9yZGVyOiAnQVNDJyB8ICdERVNDJyB9PigpO1xuICBAT3V0cHV0KCkgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHJvd0RvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBjZWxsQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcm93OiBhbnk7IGNvbHVtbjogRW50aXR5RmllbGRNZXRhOyB2YWx1ZTogYW55IH0+KCk7XG4gIEBPdXRwdXQoKSBleHBvcnREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGdldCB2aXNpYmxlQ29sdW1ucygpOiBFbnRpdHlGaWVsZE1ldGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiAhYy5oaWRkZW4pO1xuICB9XG5cbiAgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhZ2VTaXplID4gMCA/IE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gdGhpcy5wYWdlU2l6ZSkgOiAxO1xuICB9XG5cbiAgZ2V0IHN0YXJ0Um93KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnZSAqIHRoaXMucGFnZVNpemUgKyAxO1xuICB9XG5cbiAgZ2V0IGVuZFJvdygpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbigodGhpcy5wYWdlICsgMSkgKiB0aGlzLnBhZ2VTaXplLCB0aGlzLnRvdGFsKTtcbiAgfVxuXG4gIG9uU29ydChmaWVsZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29sID0gdGhpcy5jb2x1bW5zLmZpbmQoYyA9PiBjLm5hbWUgPT09IGZpZWxkKTtcbiAgICBpZiAoY29sPy5zb3J0YWJsZSA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgIGxldCBvcmRlcjogJ0FTQycgfCAnREVTQycgPSAnQVNDJztcbiAgICBpZiAodGhpcy5zb3J0RmllbGQgPT09IGZpZWxkICYmIHRoaXMuc29ydE9yZGVyID09PSAnQVNDJykge1xuICAgICAgb3JkZXIgPSAnREVTQyc7XG4gICAgfVxuICAgIHRoaXMuc29ydEZpZWxkID0gZmllbGQ7XG4gICAgdGhpcy5zb3J0T3JkZXIgPSBvcmRlcjtcbiAgICB0aGlzLnNvcnQuZW1pdCh7IGZpZWxkLCBvcmRlciB9KTtcbiAgfVxuXG4gIG9uUm93Q2xpY2socm93OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQocm93KTtcbiAgfVxuXG4gIG9uUm93RG91YmxlQ2xpY2socm93OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnJvd0RvdWJsZUNsaWNrLmVtaXQocm93KTtcbiAgfVxuXG4gIG9uQ2VsbENsaWNrKHJvdzogYW55LCBjb2x1bW46IEVudGl0eUZpZWxkTWV0YSk6IHZvaWQge1xuICAgIHRoaXMuY2VsbENsaWNrLmVtaXQoeyByb3csIGNvbHVtbiwgdmFsdWU6IHJvd1tjb2x1bW4ubmFtZV0gfSk7XG4gIH1cblxuICBwcmV2UGFnZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYWdlID4gMCkge1xuICAgICAgdGhpcy5wYWdlLS07XG4gICAgICB0aGlzLnBhZ2VDaGFuZ2UuZW1pdCh0aGlzLnBhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRQYWdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2UgPCB0aGlzLnBhZ2VDb3VudCAtIDEpIHtcbiAgICAgIHRoaXMucGFnZSsrO1xuICAgICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQodGhpcy5wYWdlKTtcbiAgICB9XG4gIH1cblxuICBnb1RvUGFnZShwOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAocCA+PSAwICYmIHAgPCB0aGlzLnBhZ2VDb3VudCkge1xuICAgICAgdGhpcy5wYWdlID0gcDtcbiAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMucGFnZSk7XG4gICAgfVxuICB9XG5cbiAgb25FeHBvcnQoKTogdm9pZCB7XG4gICAgdGhpcy5leHBvcnREYXRhLmVtaXQoKTtcbiAgfVxuXG4gIGZvcm1hdFZhbHVlKHZhbHVlOiBhbnksIGNvbDogRW50aXR5RmllbGRNZXRhKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuICcnO1xuICAgIGlmIChjb2wudHlwZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWUgPyAnWWVzJyA6ICdObyc7XG4gICAgaWYgKGNvbC50eXBlID09PSAnZGF0ZScpIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIGlmIChjb2wudHlwZSA9PT0gJ2pzb24nIHx8IGNvbC50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICB0cnkgeyByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOyB9IGNhdGNoIHsgcmV0dXJuIFN0cmluZyh2YWx1ZSk7IH1cbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICB0cmFja0J5TmFtZShfaW5kZXg6IG51bWJlciwgY29sOiBFbnRpdHlGaWVsZE1ldGEpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2wubmFtZTtcbiAgfVxuXG4gIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0Z20tcmVzdWx0cy1ncmlkXCI+XG4gIDwhLS0gTG9hZGluZyAtLT5cbiAgPGRpdiBjbGFzcz1cInRnbS1yZXN1bHRzLWdyaWRfX2xvYWRpbmdcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGdtLWRiLXNwaW5uZXJcIj48L2Rpdj5cbiAgICA8cD57eyBsb2FkaW5nTWVzc2FnZSB9fTwvcD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBFbXB0eSAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nICYmIGRhdGEubGVuZ3RoID09PSAwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVtcHR5VGVtcGxhdGU7IGVsc2UgZGVmYXVsdEVtcHR5XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEVtcHR5PlxuICAgICAgPGRpdiBjbGFzcz1cInRnbS1yZXN1bHRzLWdyaWRfX2VtcHR5XCI+XG4gICAgICAgIDxwPnt7IG5vUmVzdWx0c01lc3NhZ2UgfX08L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIFRhYmxlIC0tPlxuICA8ZGl2IGNsYXNzPVwidGdtLXJlc3VsdHMtZ3JpZF9fdGFibGUtd3JhcHBlclwiICpuZ0lmPVwiIWxvYWRpbmcgJiYgZGF0YS5sZW5ndGggPiAwXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwidGdtLXJlc3VsdHMtZ3JpZF9fdGFibGVcIj5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInRnbS1yZXN1bHRzLWdyaWRfX3RoIHRnbS1yZXN1bHRzLWdyaWRfX3RoLS1yb3ctbnVtXCI+IzwvdGg+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIHZpc2libGVDb2x1bW5zOyB0cmFja0J5OiB0cmFja0J5TmFtZVwiXG4gICAgICAgICAgICBjbGFzcz1cInRnbS1yZXN1bHRzLWdyaWRfX3RoXCJcbiAgICAgICAgICAgIFtjbGFzcy50Z20tcmVzdWx0cy1ncmlkX190aC0tc29ydGFibGVdPVwiY29sLnNvcnRhYmxlICE9PSBmYWxzZVwiXG4gICAgICAgICAgICBbY2xhc3MudGdtLXJlc3VsdHMtZ3JpZF9fdGgtLXNvcnRlZF09XCJzb3J0RmllbGQgPT09IGNvbC5uYW1lXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNvcnQoY29sLm5hbWUpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyVGVtcGxhdGU7IGVsc2UgZGVmYXVsdEhlYWRlclwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjb2wgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRIZWFkZXI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGNvbC5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0Z20tcmVzdWx0cy1ncmlkX19zb3J0LWljb25cIiAqbmdJZj1cInNvcnRGaWVsZCA9PT0gY29sLm5hbWVcIj5cbiAgICAgICAgICAgICAgICB7eyBzb3J0T3JkZXIgPT09ICdBU0MnID8gJyYjOTY1MDsnIDogJyYjOTY2MDsnIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgICA8dGJvZHk+XG4gICAgICAgIDx0clxuICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2YgZGF0YTsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgICBjbGFzcz1cInRnbS1yZXN1bHRzLWdyaWRfX3RyXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJyb3dDbGFzc1wiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2xpY2socm93KVwiXG4gICAgICAgICAgKGRibGNsaWNrKT1cIm9uUm93RG91YmxlQ2xpY2socm93KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJ0Z20tcmVzdWx0cy1ncmlkX190ZCB0Z20tcmVzdWx0cy1ncmlkX190ZC0tcm93LW51bVwiPnt7IHN0YXJ0Um93ICsgaSB9fTwvdGQ+XG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sIG9mIHZpc2libGVDb2x1bW5zOyB0cmFja0J5OiB0cmFja0J5TmFtZVwiXG4gICAgICAgICAgICBjbGFzcz1cInRnbS1yZXN1bHRzLWdyaWRfX3RkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNlbGxDbGljayhyb3csIGNvbClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjZWxsVGVtcGxhdGU7IGVsc2UgZGVmYXVsdENlbGxcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJvd1tjb2wubmFtZV0sIGNvbHVtbjogY29sLCByb3c6IHJvdyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENlbGw+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGdtLXJlc3VsdHMtZ3JpZF9fY2VsbC12YWx1ZVwiIFt0aXRsZV09XCJmb3JtYXRWYWx1ZShyb3dbY29sLm5hbWVdLCBjb2wpXCI+XG4gICAgICAgICAgICAgICAge3sgZm9ybWF0VmFsdWUocm93W2NvbC5uYW1lXSwgY29sKSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PlxuXG4gIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgPGRpdiBjbGFzcz1cInRnbS1yZXN1bHRzLWdyaWRfX2Zvb3RlclwiICpuZ0lmPVwiIWxvYWRpbmcgJiYgZGF0YS5sZW5ndGggPiAwICYmIHNob3dQYWdpbmF0aW9uXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhZ2luYXRpb25UZW1wbGF0ZTsgZWxzZSBkZWZhdWx0UGFnaW5hdGlvblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBhZ2luYXRpb25UZW1wbGF0ZTsgY29udGV4dDogeyBwYWdlOiBwYWdlLCBwYWdlU2l6ZTogcGFnZVNpemUsIHRvdGFsOiB0b3RhbCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0UGFnaW5hdGlvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0Z20tcmVzdWx0cy1ncmlkX19wYWdpbmF0aW9uXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGdtLXJlc3VsdHMtZ3JpZF9faW5mb1wiPlxuICAgICAgICAgIFJvd3Mge3sgc3RhcnRSb3cgfX0te3sgZW5kUm93IH19IG9mIHt7IHRvdGFsIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRnbS1yZXN1bHRzLWdyaWRfX3BhZ2UtY29udHJvbHNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cInRnbS1kYi1idG4gdGdtLWRiLWJ0bi0tZ2hvc3QgdGdtLWRiLWJ0bi0tc21cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInBhZ2UgPT09IDBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInByZXZQYWdlKClcIlxuICAgICAgICAgID4mIzk2NjQ7PC9idXR0b24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0Z20tcmVzdWx0cy1ncmlkX19wYWdlLWluZm9cIj5cbiAgICAgICAgICAgIFBhZ2Uge3sgcGFnZSArIDEgfX0gb2Yge3sgcGFnZUNvdW50IH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwidGdtLWRiLWJ0biB0Z20tZGItYnRuLS1naG9zdCB0Z20tZGItYnRuLS1zbVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicGFnZSA+PSBwYWdlQ291bnQgLSAxXCJcbiAgICAgICAgICAgIChjbGljayk9XCJuZXh0UGFnZSgpXCJcbiAgICAgICAgICA+JiM5NjU0OzwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0V4cG9ydFwiXG4gICAgICAgICAgY2xhc3M9XCJ0Z20tZGItYnRuIHRnbS1kYi1idG4tLWdob3N0IHRnbS1kYi1idG4tLXNtXCJcbiAgICAgICAgICAoY2xpY2spPVwib25FeHBvcnQoKVwiXG4gICAgICAgID5FeHBvcnQ8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { ENTITY_REGISTRY, DEFAULT_EXCLUDED_ENTITIES, MODULE_LABELS } from '../registry/entity-registry';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Provides filtered entity metadata based on the DatabaseManagerConfig.
|
|
6
|
+
* Filters by enabled modules and excluded entities, and groups entities by module.
|
|
7
|
+
*/
|
|
8
|
+
export class EntitySchemaService {
|
|
9
|
+
cachedEntities = null;
|
|
10
|
+
cachedGroups = null;
|
|
11
|
+
currentConfig = null;
|
|
12
|
+
/**
|
|
13
|
+
* Returns all entity definitions filtered by the given config.
|
|
14
|
+
*/
|
|
15
|
+
getEntities(config) {
|
|
16
|
+
if (this.cachedEntities && this.currentConfig === config) {
|
|
17
|
+
return this.cachedEntities;
|
|
18
|
+
}
|
|
19
|
+
this.currentConfig = config ?? null;
|
|
20
|
+
const enabledModules = config?.enabledModules;
|
|
21
|
+
const excludedEntities = config?.excludedEntities ?? DEFAULT_EXCLUDED_ENTITIES;
|
|
22
|
+
let entities = ENTITY_REGISTRY;
|
|
23
|
+
if (enabledModules && enabledModules.length > 0) {
|
|
24
|
+
const moduleSet = new Set(enabledModules.map(m => m.toUpperCase()));
|
|
25
|
+
entities = entities.filter(e => moduleSet.has(e.module));
|
|
26
|
+
}
|
|
27
|
+
if (excludedEntities.length > 0) {
|
|
28
|
+
const excludeSet = new Set(excludedEntities);
|
|
29
|
+
entities = entities.filter(e => !excludeSet.has(e.key));
|
|
30
|
+
}
|
|
31
|
+
this.cachedEntities = entities;
|
|
32
|
+
this.cachedGroups = null; // invalidate group cache
|
|
33
|
+
return entities;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Returns entities grouped by module, with human-readable labels.
|
|
37
|
+
*/
|
|
38
|
+
getEntityGroups(config, customLabels) {
|
|
39
|
+
if (this.cachedGroups && this.currentConfig === config) {
|
|
40
|
+
return this.cachedGroups;
|
|
41
|
+
}
|
|
42
|
+
const entities = this.getEntities(config);
|
|
43
|
+
const labels = { ...MODULE_LABELS, ...customLabels };
|
|
44
|
+
const groupMap = new Map();
|
|
45
|
+
for (const entity of entities) {
|
|
46
|
+
const arr = groupMap.get(entity.module) ?? [];
|
|
47
|
+
arr.push(entity);
|
|
48
|
+
groupMap.set(entity.module, arr);
|
|
49
|
+
}
|
|
50
|
+
this.cachedGroups = Array.from(groupMap.entries()).map(([code, ents]) => ({
|
|
51
|
+
code,
|
|
52
|
+
label: labels[code] ?? code,
|
|
53
|
+
entities: ents,
|
|
54
|
+
expanded: false,
|
|
55
|
+
}));
|
|
56
|
+
return this.cachedGroups;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Find a single entity by its key.
|
|
60
|
+
*/
|
|
61
|
+
getEntityByKey(key, config) {
|
|
62
|
+
return this.getEntities(config).find(e => e.key === key);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns entity keys that are visible (not excluded, module enabled).
|
|
66
|
+
*/
|
|
67
|
+
getVisibleEntityKeys(config) {
|
|
68
|
+
return this.getEntities(config).map(e => e.key);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check whether an entity key is accessible under the current config.
|
|
72
|
+
*/
|
|
73
|
+
isEntityVisible(key, config) {
|
|
74
|
+
return this.getVisibleEntityKeys(config).includes(key);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Invalidate cached data (call when config changes).
|
|
78
|
+
*/
|
|
79
|
+
invalidateCache() {
|
|
80
|
+
this.cachedEntities = null;
|
|
81
|
+
this.cachedGroups = null;
|
|
82
|
+
this.currentConfig = null;
|
|
83
|
+
}
|
|
84
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntitySchemaService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
85
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntitySchemaService, providedIn: 'root' });
|
|
86
|
+
}
|
|
87
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntitySchemaService, decorators: [{
|
|
88
|
+
type: Injectable,
|
|
89
|
+
args: [{ providedIn: 'root' }]
|
|
90
|
+
}] });
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXNjaGVtYS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2RhdGFiYXNlLW1hbmFnZXIvc2VydmljZXMvZW50aXR5LXNjaGVtYS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFeEc7OztHQUdHO0FBRUgsTUFBTSxPQUFPLG1CQUFtQjtJQUN0QixjQUFjLEdBQWlDLElBQUksQ0FBQztJQUNwRCxZQUFZLEdBQStCLElBQUksQ0FBQztJQUNoRCxhQUFhLEdBQWlDLElBQUksQ0FBQztJQUUzRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxNQUE4QjtRQUN4QyxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN6RCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQztRQUNwQyxNQUFNLGNBQWMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxFQUFFLGdCQUFnQixJQUFJLHlCQUF5QixDQUFDO1FBRS9FLElBQUksUUFBUSxHQUFHLGVBQWUsQ0FBQztRQUUvQixJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLFFB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SSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzVCLENBQUM7d0dBekZVLG1CQUFtQjs0R0FBbkIsbUJBQW1CLGNBRE4sTUFBTTs7NEZBQ25CLG1CQUFtQjtrQkFEL0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbnRpdHlSZWdpc3RyeUVudHJ5LCBFbnRpdHlNb2R1bGVHcm91cCwgRGF0YWJhc2VNYW5hZ2VyQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvZGF0YWJhc2UtbWFuYWdlci50eXBlcyc7XG5pbXBvcnQgeyBFTlRJVFlfUkVHSVNUUlksIERFRkFVTFRfRVhDTFVERURfRU5USVRJRVMsIE1PRFVMRV9MQUJFTFMgfSBmcm9tICcuLi9yZWdpc3RyeS9lbnRpdHktcmVnaXN0cnknO1xuXG4vKipcbiAqIFByb3ZpZGVzIGZpbHRlcmVkIGVudGl0eSBtZXRhZGF0YSBiYXNlZCBvbiB0aGUgRGF0YWJhc2VNYW5hZ2VyQ29uZmlnLlxuICogRmlsdGVycyBieSBlbmFibGVkIG1vZHVsZXMgYW5kIGV4Y2x1ZGVkIGVudGl0aWVzLCBhbmQgZ3JvdXBzIGVudGl0aWVzIGJ5IG1vZHVsZS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBFbnRpdHlTY2hlbWFTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYWNoZWRFbnRpdGllczogRW50aXR5UmVnaXN0cnlFbnRyeVtdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkR3JvdXBzOiBFbnRpdHlNb2R1bGVHcm91cFtdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY3VycmVudENvbmZpZzogRGF0YWJhc2VNYW5hZ2VyQ29uZmlnIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGVudGl0eSBkZWZpbml0aW9ucyBmaWx0ZXJlZCBieSB0aGUgZ2l2ZW4gY29uZmlnLlxuICAgKi9cbiAgZ2V0RW50aXRpZXMoY29uZmlnPzogRGF0YWJhc2VNYW5hZ2VyQ29uZmlnKTogRW50aXR5UmVnaXN0cnlFbnRyeVtdIHtcbiAgICBpZiAodGhpcy5jYWNoZWRFbnRpdGllcyAmJiB0aGlzLmN1cnJlbnRDb25maWcgPT09IGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkRW50aXRpZXM7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudENvbmZpZyA9IGNvbmZpZyA/PyBudWxsO1xuICAgIGNvbnN0IGVuYWJsZWRNb2R1bGVzID0gY29uZmlnPy5lbmFibGVkTW9kdWxlcztcbiAgICBjb25zdCBleGNsdWRlZEVudGl0aWVzID0gY29uZmlnPy5leGNsdWRlZEVudGl0aWVzID8/IERFRkFVTFRfRVhDTFVERURfRU5USVRJRVM7XG5cbiAgICBsZXQgZW50aXRpZXMgPSBFTlRJVFlfUkVHSVNUUlk7XG5cbiAgICBpZiAoZW5hYmxlZE1vZHVsZXMgJiYgZW5hYmxlZE1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbW9kdWxlU2V0ID0gbmV3IFNldChlbmFibGVkTW9kdWxlcy5tYXAobSA9PiBtLnRvVXBwZXJDYXNlKCkpKTtcbiAgICAgIGVudGl0aWVzID0gZW50aXRpZXMuZmlsdGVyKGUgPT4gbW9kdWxlU2V0LmhhcyhlLm1vZHVsZSkpO1xuICAgIH1cblxuICAgIGlmIChleGNsdWRlZEVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4Y2x1ZGVTZXQgPSBuZXcgU2V0KGV4Y2x1ZGVkRW50aXRpZXMpO1xuICAgICAgZW50aXRpZXMgPSBlbnRpdGllcy5maWx0ZXIoZSA9PiAhZXhjbHVkZVNldC5oYXMoZS5rZXkpKTtcbiAgICB9XG5cbiAgICB0aGlzLmNhY2hlZEVudGl0aWVzID0gZW50aXRpZXM7XG4gICAgdGhpcy5jYWNoZWRHcm91cHMgPSBudWxsOyAvLyBpbnZhbGlkYXRlIGdyb3VwIGNhY2hlXG4gICAgcmV0dXJuIGVudGl0aWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZW50aXRpZXMgZ3JvdXBlZCBieSBtb2R1bGUsIHdpdGggaHVtYW4tcmVhZGFibGUgbGFiZWxzLlxuICAgKi9cbiAgZ2V0RW50aXR5R3JvdXBzKGNvbmZpZz86IERhdGFiYXNlTWFuYWdlckNvbmZpZywgY3VzdG9tTGFiZWxzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IEVudGl0eU1vZHVsZUdyb3VwW10ge1xuICAgIGlmICh0aGlzLmNhY2hlZEdyb3VwcyAmJiB0aGlzLmN1cnJlbnRDb25maWcgPT09IGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkR3JvdXBzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5nZXRFbnRpdGllcyhjb25maWcpO1xuICAgIGNvbnN0IGxhYmVscyA9IHsgLi4uTU9EVUxFX0xBQkVMUywgLi4uY3VzdG9tTGFiZWxzIH07XG4gICAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwPHN0cmluZywgRW50aXR5UmVnaXN0cnlFbnRyeVtdPigpO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgIGNvbnN0IGFyciA9IGdyb3VwTWFwLmdldChlbnRpdHkubW9kdWxlKSA/PyBbXTtcbiAgICAgIGFyci5wdXNoKGVudGl0eSk7XG4gICAgICBncm91cE1hcC5zZXQoZW50aXR5Lm1vZHVsZSwgYXJyKTtcbiAgICB9XG5cbiAgICB0aGlzLmNhY2hlZEdyb3VwcyA9IEFycmF5LmZyb20oZ3JvdXBNYXAuZW50cmllcygpKS5tYXAoKFtjb2RlLCBlbnRzXSkgPT4gKHtcbiAgICAgIGNvZGUsXG4gICAgICBsYWJlbDogbGFiZWxzW2NvZGVdID8/IGNvZGUsXG4gICAgICBlbnRpdGllczogZW50cyxcbiAgICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRHcm91cHM7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHNpbmdsZSBlbnRpdHkgYnkgaXRzIGtleS5cbiAgICovXG4gIGdldEVudGl0eUJ5S2V5KGtleTogc3RyaW5nLCBjb25maWc/OiBEYXRhYmFzZU1hbmFnZXJDb25maWcpOiBFbnRpdHlSZWdpc3RyeUVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRFbnRpdGllcyhjb25maWcpLmZpbmQoZSA9PiBlLmtleSA9PT0ga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGVudGl0eSBrZXlzIHRoYXQgYXJlIHZpc2libGUgKG5vdCBleGNsdWRlZCwgbW9kdWxlIGVuYWJsZWQpLlxuICAgKi9cbiAgZ2V0VmlzaWJsZUVudGl0eUtleXMoY29uZmlnPzogRGF0YWJhc2VNYW5hZ2VyQ29uZmlnKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmdldEVudGl0aWVzKGNvbmZpZykubWFwKGUgPT4gZS5rZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgYW4gZW50aXR5IGtleSBpcyBhY2Nlc3NpYmxlIHVuZGVyIHRoZSBjdXJyZW50IGNvbmZpZy5cbiAgICovXG4gIGlzRW50aXR5VmlzaWJsZShrZXk6IHN0cmluZywgY29uZmlnPzogRGF0YWJhc2VNYW5hZ2VyQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmlzaWJsZUVudGl0eUtleXMoY29uZmlnKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludmFsaWRhdGUgY2FjaGVkIGRhdGEgKGNhbGwgd2hlbiBjb25maWcgY2hhbmdlcykuXG4gICAqL1xuICBpbnZhbGlkYXRlQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZWRFbnRpdGllcyA9IG51bGw7XG4gICAgdGhpcy5jYWNoZWRHcm91cHMgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudENvbmZpZyA9IG51bGw7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { throwError } from 'rxjs';
|
|
3
|
+
import { map, catchError } from 'rxjs/operators';
|
|
4
|
+
import { ENTITY_SERVICE_MAP } from '../registry/entity-registry';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./entity-schema.service";
|
|
7
|
+
/**
|
|
8
|
+
* Translates a QueryModel (JSON from the editor) into BaseCrudService.getAll() calls
|
|
9
|
+
* and returns a QueryResult.
|
|
10
|
+
*/
|
|
11
|
+
export class QueryExecutorService {
|
|
12
|
+
injector;
|
|
13
|
+
entitySchema;
|
|
14
|
+
/** Cache of resolved service instances keyed by entity key */
|
|
15
|
+
serviceCache = new Map();
|
|
16
|
+
constructor(injector, entitySchema) {
|
|
17
|
+
this.injector = injector;
|
|
18
|
+
this.entitySchema = entitySchema;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Execute a query model against the entity's CRUD service.
|
|
22
|
+
*/
|
|
23
|
+
execute(query, config) {
|
|
24
|
+
const startTime = performance.now();
|
|
25
|
+
// Validate entity
|
|
26
|
+
if (!query.entity) {
|
|
27
|
+
return throwError(() => new Error('Query must specify an entity.'));
|
|
28
|
+
}
|
|
29
|
+
if (!this.entitySchema.isEntityVisible(query.entity, config)) {
|
|
30
|
+
return throwError(() => new Error(`Entity "${query.entity}" is not accessible or does not exist.`));
|
|
31
|
+
}
|
|
32
|
+
// Resolve service
|
|
33
|
+
const service = this.resolveService(query.entity);
|
|
34
|
+
if (!service) {
|
|
35
|
+
return throwError(() => new Error(`No service registered for entity "${query.entity}".`));
|
|
36
|
+
}
|
|
37
|
+
// Build params
|
|
38
|
+
const params = {
|
|
39
|
+
...(query.filters ?? {}),
|
|
40
|
+
page: query.page ?? 0,
|
|
41
|
+
pageSize: Math.min(query.pageSize ?? config?.defaultPageSize ?? 25, config?.maxPageSize ?? 100),
|
|
42
|
+
};
|
|
43
|
+
if (query.sort) {
|
|
44
|
+
params['sort'] = query.sort;
|
|
45
|
+
}
|
|
46
|
+
if (query.order) {
|
|
47
|
+
params['order'] = query.order;
|
|
48
|
+
}
|
|
49
|
+
return service.getAll(params).pipe(map((response) => {
|
|
50
|
+
const executionTime = Math.round(performance.now() - startTime);
|
|
51
|
+
const data = response?.data ?? [];
|
|
52
|
+
const total = response?.meta?.pagination?.total ?? data.length;
|
|
53
|
+
const page = response?.meta?.pagination?.page ?? params['page'];
|
|
54
|
+
const pageSize = response?.meta?.pagination?.pageSize ?? params['pageSize'];
|
|
55
|
+
// If select is specified, project only those fields
|
|
56
|
+
const projected = query.select && query.select.length > 0
|
|
57
|
+
? data.map((row) => {
|
|
58
|
+
const out = {};
|
|
59
|
+
for (const field of query.select) {
|
|
60
|
+
if (field in row) {
|
|
61
|
+
out[field] = row[field];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
})
|
|
66
|
+
: data;
|
|
67
|
+
return {
|
|
68
|
+
data: projected,
|
|
69
|
+
total,
|
|
70
|
+
page,
|
|
71
|
+
pageSize,
|
|
72
|
+
executionTime,
|
|
73
|
+
entity: query.entity,
|
|
74
|
+
};
|
|
75
|
+
}), catchError(err => {
|
|
76
|
+
const executionTime = Math.round(performance.now() - startTime);
|
|
77
|
+
return throwError(() => ({
|
|
78
|
+
message: err?.message ?? 'Query execution failed.',
|
|
79
|
+
executionTime,
|
|
80
|
+
entity: query.entity,
|
|
81
|
+
originalError: err,
|
|
82
|
+
}));
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse raw JSON string into a QueryModel, with validation.
|
|
87
|
+
*/
|
|
88
|
+
parseQuery(raw) {
|
|
89
|
+
let parsed;
|
|
90
|
+
try {
|
|
91
|
+
parsed = JSON.parse(raw);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
throw new Error('Invalid JSON. Please check your query syntax.');
|
|
95
|
+
}
|
|
96
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
97
|
+
throw new Error('Query must be a JSON object.');
|
|
98
|
+
}
|
|
99
|
+
if (!parsed.entity || typeof parsed.entity !== 'string') {
|
|
100
|
+
throw new Error('Query must include an "entity" field (string).');
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
entity: parsed.entity,
|
|
104
|
+
select: Array.isArray(parsed.select) ? parsed.select : undefined,
|
|
105
|
+
filters: parsed.filters && typeof parsed.filters === 'object' ? parsed.filters : undefined,
|
|
106
|
+
sort: typeof parsed.sort === 'string' ? parsed.sort : undefined,
|
|
107
|
+
order: parsed.order === 'ASC' || parsed.order === 'DESC' ? parsed.order : undefined,
|
|
108
|
+
page: typeof parsed.page === 'number' ? parsed.page : undefined,
|
|
109
|
+
pageSize: typeof parsed.pageSize === 'number' ? parsed.pageSize : undefined,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Format a QueryModel into a pretty-printed JSON string.
|
|
114
|
+
*/
|
|
115
|
+
formatQuery(query) {
|
|
116
|
+
return JSON.stringify(query, null, 2);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a default query for an entity key.
|
|
120
|
+
*/
|
|
121
|
+
defaultQuery(entityKey, pageSize = 25) {
|
|
122
|
+
return {
|
|
123
|
+
entity: entityKey,
|
|
124
|
+
sort: 'id',
|
|
125
|
+
order: 'DESC',
|
|
126
|
+
page: 0,
|
|
127
|
+
pageSize,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Resolve a BaseCrudService instance for an entity key.
|
|
132
|
+
*/
|
|
133
|
+
resolveService(entityKey) {
|
|
134
|
+
if (this.serviceCache.has(entityKey)) {
|
|
135
|
+
return this.serviceCache.get(entityKey);
|
|
136
|
+
}
|
|
137
|
+
const serviceClassName = ENTITY_SERVICE_MAP[entityKey];
|
|
138
|
+
if (!serviceClassName) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
// Attempt to inject the service by iterating known service tokens.
|
|
142
|
+
// Since Angular's Injector.get() requires a token (class reference),
|
|
143
|
+
// we use a dynamic approach: try to get it by any known service references.
|
|
144
|
+
try {
|
|
145
|
+
// The SDK registers all services with `providedIn: 'root'`,
|
|
146
|
+
// so they are available in the root injector.
|
|
147
|
+
// We must find the actual class reference — this approach uses
|
|
148
|
+
// the resource path convention: /api/{entity-key}
|
|
149
|
+
const resourcePath = `/api/${entityKey}`;
|
|
150
|
+
const service = this.findServiceByResourcePath(resourcePath);
|
|
151
|
+
if (service) {
|
|
152
|
+
this.serviceCache.set(entityKey, service);
|
|
153
|
+
return service;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Service not available
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Try to find an already-injected BaseCrudService by its resource path.
|
|
163
|
+
* This iterates the known service class names and tries to inject them.
|
|
164
|
+
*/
|
|
165
|
+
findServiceByResourcePath(resourcePath) {
|
|
166
|
+
// We'll use a brute-force approach: import all known service classes
|
|
167
|
+
// from the SDK and try to inject them. Since we can't dynamically
|
|
168
|
+
// import by name at runtime, we iterate through the injector.
|
|
169
|
+
// The consumer must have TgmSdkModule imported (which provides all services).
|
|
170
|
+
// Try injecting using the well-known service map approach:
|
|
171
|
+
// Each service is `providedIn: 'root'`, so Injector.get() should work
|
|
172
|
+
// if the service class is referenced somewhere in the app.
|
|
173
|
+
// We'll try a simpler approach: get ALL services and match by resourcePath.
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Register a service instance for an entity key.
|
|
178
|
+
* This allows the consuming app to provide service references explicitly.
|
|
179
|
+
*/
|
|
180
|
+
registerService(entityKey, service) {
|
|
181
|
+
this.serviceCache.set(entityKey, service);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Register multiple services at once.
|
|
185
|
+
*/
|
|
186
|
+
registerServices(services) {
|
|
187
|
+
for (const [key, service] of Object.entries(services)) {
|
|
188
|
+
this.serviceCache.set(key, service);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Clear the service cache.
|
|
193
|
+
*/
|
|
194
|
+
clearServiceCache() {
|
|
195
|
+
this.serviceCache.clear();
|
|
196
|
+
}
|
|
197
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: QueryExecutorService, deps: [{ token: i0.Injector }, { token: i1.EntitySchemaService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
198
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: QueryExecutorService, providedIn: 'root' });
|
|
199
|
+
}
|
|
200
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: QueryExecutorService, decorators: [{
|
|
201
|
+
type: Injectable,
|
|
202
|
+
args: [{ providedIn: 'root' }]
|
|
203
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.EntitySchemaService }] });
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZXhlY3V0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9kYXRhYmFzZS1tYW5hZ2VyL3NlcnZpY2VzL3F1ZXJ5LWV4ZWN1dG9yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQWtCLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFHakU7OztHQUdHO0FBRUgsTUFBTSxPQUFPLG9CQUFvQjtJQUtyQjtJQUNBO0lBTFYsOERBQThEO0lBQ3RELFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBZ0MsQ0FBQztJQUUvRCxZQUNVLFFBQWtCLEVBQ2xCLFlBQWlDO1FBRGpDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsaUJBQVksR0FBWixZQUFZLENBQXFCO0lBQ3hDLENBQUM7SUFFSjs7T0FFRztJQUNILE9BQU8sQ0FBQyxLQUFpQixFQUFFLE1BQThCO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVwQyxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDN0QsT0FBTyxVQUFVLENBQUMsR0FBRyxF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QUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxpQkFBaUI7UUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBaE5VLG9CQUFvQjs0R0FBcEIsb0JBQW9CLGNBRFAsTUFBTTs7NEZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFF1ZXJ5TW9kZWwsIFF1ZXJ5UmVzdWx0LCBEYXRhYmFzZU1hbmFnZXJDb25maWcgfSBmcm9tICcuLi90eXBlcy9kYXRhYmFzZS1tYW5hZ2VyLnR5cGVzJztcbmltcG9ydCB7IEVudGl0eVNjaGVtYVNlcnZpY2UgfSBmcm9tICcuL2VudGl0eS1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBFTlRJVFlfU0VSVklDRV9NQVAgfSBmcm9tICcuLi9yZWdpc3RyeS9lbnRpdHktcmVnaXN0cnknO1xuaW1wb3J0IHsgQmFzZUNydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXBpL2Jhc2UtY3J1ZC5zZXJ2aWNlJztcblxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgUXVlcnlNb2RlbCAoSlNPTiBmcm9tIHRoZSBlZGl0b3IpIGludG8gQmFzZUNydWRTZXJ2aWNlLmdldEFsbCgpIGNhbGxzXG4gKiBhbmQgcmV0dXJucyBhIFF1ZXJ5UmVzdWx0LlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFF1ZXJ5RXhlY3V0b3JTZXJ2aWNlIHtcbiAgLyoqIENhY2hlIG9mIHJlc29sdmVkIHNlcnZpY2UgaW5zdGFuY2VzIGtleWVkIGJ5IGVudGl0eSBrZXkgKi9cbiAgcHJpdmF0ZSBzZXJ2aWNlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQmFzZUNydWRTZXJ2aWNlPGFueT4+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBlbnRpdHlTY2hlbWE6IEVudGl0eVNjaGVtYVNlcnZpY2UsXG4gICkge31cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHF1ZXJ5IG1vZGVsIGFnYWluc3QgdGhlIGVudGl0eSdzIENSVUQgc2VydmljZS5cbiAgICovXG4gIGV4ZWN1dGUocXVlcnk6IFF1ZXJ5TW9kZWwsIGNvbmZpZz86IERhdGFiYXNlTWFuYWdlckNvbmZpZyk6IE9ic2VydmFibGU8UXVlcnlSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIFZhbGlkYXRlIGVudGl0eVxuICAgIGlmICghcXVlcnkuZW50aXR5KSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ1F1ZXJ5IG11c3Qgc3BlY2lmeSBhbiBlbnRpdHkuJykpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5lbnRpdHlTY2hlbWEuaXNFbnRpdHlWaXNpYmxlKHF1ZXJ5LmVudGl0eSwgY29uZmlnKSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGBFbnRpdHkgXCIke3F1ZXJ5LmVudGl0eX1cIiBpcyBub3QgYWNjZXNzaWJsZSBvciBkb2VzIG5vdCBleGlzdC5gKSk7XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBzZXJ2aWNlXG4gICAgY29uc3Qgc2VydmljZSA9IHRoaXMucmVzb2x2ZVNlcnZpY2UocXVlcnkuZW50aXR5KTtcbiAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihgTm8gc2VydmljZSByZWdpc3RlcmVkIGZvciBlbnRpdHkgXCIke3F1ZXJ5LmVudGl0eX1cIi5gKSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgcGFyYW1zXG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgLi4uKHF1ZXJ5LmZpbHRlcnMgPz8ge30pLFxuICAgICAgcGFnZTogcXVlcnkucGFnZSA/PyAwLFxuICAgICAgcGFnZVNpemU6IE1hdGgubWluKHF1ZXJ5LnBhZ2VTaXplID8/IGNvbmZpZz8uZGVmYXVsdFBhZ2VTaXplID8/IDI1LCBjb25maWc/Lm1heFBhZ2VTaXplID8/IDEwMCksXG4gICAgfTtcbiAgICBpZiAocXVlcnkuc29ydCkge1xuICAgICAgcGFyYW1zWydzb3J0J10gPSBxdWVyeS5zb3J0O1xuICAgIH1cbiAgICBpZiAocXVlcnkub3JkZXIpIHtcbiAgICAgIHBhcmFtc1snb3JkZXInXSA9IHF1ZXJ5Lm9yZGVyO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2aWNlLmdldEFsbChwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZXhlY3V0aW9uVGltZSA9IE1hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWUpO1xuICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGEgPz8gW107XG4gICAgICAgIGNvbnN0IHRvdGFsID0gcmVzcG9uc2U/Lm1ldGE/LnBhZ2luYXRpb24/LnRvdGFsID8/IGRhdGEubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYWdlID0gcmVzcG9uc2U/Lm1ldGE/LnBhZ2luYXRpb24/LnBhZ2UgPz8gcGFyYW1zWydwYWdlJ107XG4gICAgICAgIGNvbnN0IHBhZ2VTaXplID0gcmVzcG9uc2U/Lm1ldGE/LnBhZ2luYXRpb24/LnBhZ2VTaXplID8/IHBhcmFtc1sncGFnZVNpemUnXTtcblxuICAgICAgICAvLyBJZiBzZWxlY3QgaXMgc3BlY2lmaWVkLCBwcm9qZWN0IG9ubHkgdGhvc2UgZmllbGRzXG4gICAgICAgIGNvbnN0IHByb2plY3RlZCA9IHF1ZXJ5LnNlbGVjdCAmJiBxdWVyeS5zZWxlY3QubGVuZ3RoID4gMFxuICAgICAgICAgID8gZGF0YS5tYXAoKHJvdzogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHF1ZXJ5LnNlbGVjdCEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW4gcm93KSB7XG4gICAgICAgICAgICAgICAgICBvdXRbZmllbGRdID0gcm93W2ZpZWxkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBkYXRhO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogcHJvamVjdGVkLFxuICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgZXhlY3V0aW9uVGltZSxcbiAgICAgICAgICBlbnRpdHk6IHF1ZXJ5LmVudGl0eSxcbiAgICAgICAgfSBhcyBRdWVyeVJlc3VsdDtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICBjb25zdCBleGVjdXRpb25UaW1lID0gTWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XG4gICAgICAgICAgbWVzc2FnZTogZXJyPy5tZXNzYWdlID8/ICdRdWVyeSBleGVjdXRpb24gZmFpbGVkLicsXG4gICAgICAgICAgZXhlY3V0aW9uVGltZSxcbiAgICAgICAgICBlbnRpdHk6IHF1ZXJ5LmVudGl0eSxcbiAgICAgICAgICBvcmlnaW5hbEVycm9yOiBlcnIsXG4gICAgICAgIH0pKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcmF3IEpTT04gc3RyaW5nIGludG8gYSBRdWVyeU1vZGVsLCB3aXRoIHZhbGlkYXRpb24uXG4gICAqL1xuICBwYXJzZVF1ZXJ5KHJhdzogc3RyaW5nKTogUXVlcnlNb2RlbCB7XG4gICAgbGV0IHBhcnNlZDogYW55O1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSlNPTi4gUGxlYXNlIGNoZWNrIHlvdXIgcXVlcnkgc3ludGF4LicpO1xuICAgIH1cblxuICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IG11c3QgYmUgYSBKU09OIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcnNlZC5lbnRpdHkgfHwgdHlwZW9mIHBhcnNlZC5lbnRpdHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IG11c3QgaW5jbHVkZSBhbiBcImVudGl0eVwiIGZpZWxkIChzdHJpbmcpLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlbnRpdHk6IHBhcnNlZC5lbnRpdHksXG4gICAgICBzZWxlY3Q6IEFycmF5LmlzQXJyYXkocGFyc2VkLnNlbGVjdCkgPyBwYXJzZWQuc2VsZWN0IDogdW5kZWZpbmVkLFxuICAgICAgZmlsdGVyczogcGFyc2VkLmZpbHRlcnMgJiYgdHlwZW9mIHBhcnNlZC5maWx0ZXJzID09PSAnb2JqZWN0JyA/IHBhcnNlZC5maWx0ZXJzIDogdW5kZWZpbmVkLFxuICAgICAgc29ydDogdHlwZW9mIHBhcnNlZC5zb3J0ID09PSAnc3RyaW5nJyA/IHBhcnNlZC5zb3J0IDogdW5kZWZpbmVkLFxuICAgICAgb3JkZXI6IHBhcnNlZC5vcmRlciA9PT0gJ0FTQycgfHwgcGFyc2VkLm9yZGVyID09PSAnREVTQycgPyBwYXJzZWQub3JkZXIgOiB1bmRlZmluZWQsXG4gICAgICBwYWdlOiB0eXBlb2YgcGFyc2VkLnBhZ2UgPT09ICdudW1iZXInID8gcGFyc2VkLnBhZ2UgOiB1bmRlZmluZWQsXG4gICAgICBwYWdlU2l6ZTogdHlwZW9mIHBhcnNlZC5wYWdlU2l6ZSA9PT0gJ251bWJlcicgPyBwYXJzZWQucGFnZVNpemUgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBRdWVyeU1vZGVsIGludG8gYSBwcmV0dHktcHJpbnRlZCBKU09OIHN0cmluZy5cbiAgICovXG4gIGZvcm1hdFF1ZXJ5KHF1ZXJ5OiBRdWVyeU1vZGVsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocXVlcnksIG51bGwsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGRlZmF1bHQgcXVlcnkgZm9yIGFuIGVudGl0eSBrZXkuXG4gICAqL1xuICBkZWZhdWx0UXVlcnkoZW50aXR5S2V5OiBzdHJpbmcsIHBhZ2VTaXplID0gMjUpOiBRdWVyeU1vZGVsIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5OiBlbnRpdHlLZXksXG4gICAgICBzb3J0OiAnaWQnLFxuICAgICAgb3JkZXI6ICdERVNDJyxcbiAgICAgIHBhZ2U6IDAsXG4gICAgICBwYWdlU2l6ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBCYXNlQ3J1ZFNlcnZpY2UgaW5zdGFuY2UgZm9yIGFuIGVudGl0eSBrZXkuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVTZXJ2aWNlKGVudGl0eUtleTogc3RyaW5nKTogQmFzZUNydWRTZXJ2aWNlPGFueT4gfCBudWxsIHtcbiAgICBpZiAodGhpcy5zZXJ2aWNlQ2FjaGUuaGFzKGVudGl0eUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VDYWNoZS5nZXQoZW50aXR5S2V5KSE7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZUNsYXNzTmFtZSA9IEVOVElUWV9TRVJWSUNFX01BUFtlbnRpdHlLZXldO1xuICAgIGlmICghc2VydmljZUNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQXR0ZW1wdCB0byBpbmplY3QgdGhlIHNlcnZpY2UgYnkgaXRlcmF0aW5nIGtub3duIHNlcnZpY2UgdG9rZW5zLlxuICAgIC8vIFNpbmNlIEFuZ3VsYXIncyBJbmplY3Rvci5nZXQoKSByZXF1aXJlcyBhIHRva2VuIChjbGFzcyByZWZlcmVuY2UpLFxuICAgIC8vIHdlIHVzZSBhIGR5bmFtaWMgYXBwcm9hY2g6IHRyeSB0byBnZXQgaXQgYnkgYW55IGtub3duIHNlcnZpY2UgcmVmZXJlbmNlcy5cbiAgICB0cnkge1xuICAgICAgLy8gVGhlIFNESyByZWdpc3RlcnMgYWxsIHNlcnZpY2VzIHdpdGggYHByb3ZpZGVkSW46ICdyb290J2AsXG4gICAgICAvLyBzbyB0aGV5IGFyZSBhdmFpbGFibGUgaW4gdGhlIHJvb3QgaW5qZWN0b3IuXG4gICAgICAvLyBXZSBtdXN0IGZpbmQgdGhlIGFjdHVhbCBjbGFzcyByZWZlcmVuY2Ug4oCUIHRoaXMgYXBwcm9hY2ggdXNlc1xuICAgICAgLy8gdGhlIHJlc291cmNlIHBhdGggY29udmVudGlvbjogL2FwaS97ZW50aXR5LWtleX1cbiAgICAgIGNvbnN0IHJlc291cmNlUGF0aCA9IGAvYXBpLyR7ZW50aXR5S2V5fWA7XG4gICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5maW5kU2VydmljZUJ5UmVzb3VyY2VQYXRoKHJlc291cmNlUGF0aCk7XG4gICAgICBpZiAoc2VydmljZSkge1xuICAgICAgICB0aGlzLnNlcnZpY2VDYWNoZS5zZXQoZW50aXR5S2V5LCBzZXJ2aWNlKTtcbiAgICAgICAgcmV0dXJuIHNlcnZpY2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTZXJ2aWNlIG5vdCBhdmFpbGFibGVcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gZmluZCBhbiBhbHJlYWR5LWluamVjdGVkIEJhc2VDcnVkU2VydmljZSBieSBpdHMgcmVzb3VyY2UgcGF0aC5cbiAgICogVGhpcyBpdGVyYXRlcyB0aGUga25vd24gc2VydmljZSBjbGFzcyBuYW1lcyBhbmQgdHJpZXMgdG8gaW5qZWN0IHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGZpbmRTZXJ2aWNlQnlSZXNvdXJjZVBhdGgocmVzb3VyY2VQYXRoOiBzdHJpbmcpOiBCYXNlQ3J1ZFNlcnZpY2U8YW55PiB8IG51bGwge1xuICAgIC8vIFdlJ2xsIHVzZSBhIGJydXRlLWZvcmNlIGFwcHJvYWNoOiBpbXBvcnQgYWxsIGtub3duIHNlcnZpY2UgY2xhc3Nlc1xuICAgIC8vIGZyb20gdGhlIFNESyBhbmQgdHJ5IHRvIGluamVjdCB0aGVtLiBTaW5jZSB3ZSBjYW4ndCBkeW5hbWljYWxseVxuICAgIC8vIGltcG9ydCBieSBuYW1lIGF0IHJ1bnRpbWUsIHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgaW5qZWN0b3IuXG4gICAgLy8gVGhlIGNvbnN1bWVyIG11c3QgaGF2ZSBUZ21TZGtNb2R1bGUgaW1wb3J0ZWQgKHdoaWNoIHByb3ZpZGVzIGFsbCBzZXJ2aWNlcykuXG5cbiAgICAvLyBUcnkgaW5qZWN0aW5nIHVzaW5nIHRoZSB3ZWxsLWtub3duIHNlcnZpY2UgbWFwIGFwcHJvYWNoOlxuICAgIC8vIEVhY2ggc2VydmljZSBpcyBgcHJvdmlkZWRJbjogJ3Jvb3QnYCwgc28gSW5qZWN0b3IuZ2V0KCkgc2hvdWxkIHdvcmtcbiAgICAvLyBpZiB0aGUgc2VydmljZSBjbGFzcyBpcyByZWZlcmVuY2VkIHNvbWV3aGVyZSBpbiB0aGUgYXBwLlxuICAgIC8vIFdlJ2xsIHRyeSBhIHNpbXBsZXIgYXBwcm9hY2g6IGdldCBBTEwgc2VydmljZXMgYW5kIG1hdGNoIGJ5IHJlc291cmNlUGF0aC5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHNlcnZpY2UgaW5zdGFuY2UgZm9yIGFuIGVudGl0eSBrZXkuXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBjb25zdW1pbmcgYXBwIHRvIHByb3ZpZGUgc2VydmljZSByZWZlcmVuY2VzIGV4cGxpY2l0bHkuXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2UoZW50aXR5S2V5OiBzdHJpbmcsIHNlcnZpY2U6IEJhc2VDcnVkU2VydmljZTxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5zZXJ2aWNlQ2FjaGUuc2V0KGVudGl0eUtleSwgc2VydmljZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgbXVsdGlwbGUgc2VydmljZXMgYXQgb25jZS5cbiAgICovXG4gIHJlZ2lzdGVyU2VydmljZXMoc2VydmljZXM6IFJlY29yZDxzdHJpbmcsIEJhc2VDcnVkU2VydmljZTxhbnk+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2tleSwgc2VydmljZV0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZXMpKSB7XG4gICAgICB0aGlzLnNlcnZpY2VDYWNoZS5zZXQoa2V5LCBzZXJ2aWNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIHNlcnZpY2UgY2FjaGUuXG4gICAqL1xuICBjbGVhclNlcnZpY2VDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2VDYWNoZS5jbGVhcigpO1xuICB9XG59XG4iXX0=
|