@mintplayer/ng-spark 0.1.2 → 0.2.0

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.
Files changed (40) hide show
  1. package/fesm2022/mintplayer-ng-spark-icon.mjs +35 -0
  2. package/fesm2022/mintplayer-ng-spark-icon.mjs.map +1 -0
  3. package/fesm2022/mintplayer-ng-spark-models.mjs +48 -0
  4. package/fesm2022/mintplayer-ng-spark-models.mjs.map +1 -0
  5. package/fesm2022/mintplayer-ng-spark-pipes.mjs +427 -0
  6. package/fesm2022/mintplayer-ng-spark-pipes.mjs.map +1 -0
  7. package/fesm2022/mintplayer-ng-spark-po-create.mjs +121 -0
  8. package/fesm2022/mintplayer-ng-spark-po-create.mjs.map +1 -0
  9. package/fesm2022/mintplayer-ng-spark-po-detail.mjs +368 -0
  10. package/fesm2022/mintplayer-ng-spark-po-detail.mjs.map +1 -0
  11. package/fesm2022/mintplayer-ng-spark-po-edit.mjs +139 -0
  12. package/fesm2022/mintplayer-ng-spark-po-edit.mjs.map +1 -0
  13. package/fesm2022/mintplayer-ng-spark-po-form.mjs +393 -0
  14. package/fesm2022/mintplayer-ng-spark-po-form.mjs.map +1 -0
  15. package/fesm2022/mintplayer-ng-spark-query-list.mjs +392 -0
  16. package/fesm2022/mintplayer-ng-spark-query-list.mjs.map +1 -0
  17. package/fesm2022/mintplayer-ng-spark-renderers.mjs +25 -0
  18. package/fesm2022/mintplayer-ng-spark-renderers.mjs.map +1 -0
  19. package/fesm2022/mintplayer-ng-spark-retry-action-modal.mjs +87 -0
  20. package/fesm2022/mintplayer-ng-spark-retry-action-modal.mjs.map +1 -0
  21. package/fesm2022/mintplayer-ng-spark-routes.mjs +31 -0
  22. package/fesm2022/mintplayer-ng-spark-routes.mjs.map +1 -0
  23. package/fesm2022/mintplayer-ng-spark-services.mjs +348 -0
  24. package/fesm2022/mintplayer-ng-spark-services.mjs.map +1 -0
  25. package/fesm2022/mintplayer-ng-spark.mjs +17 -2262
  26. package/fesm2022/mintplayer-ng-spark.mjs.map +1 -1
  27. package/package.json +49 -1
  28. package/types/mintplayer-ng-spark-icon.d.ts +13 -0
  29. package/types/mintplayer-ng-spark-models.d.ts +275 -0
  30. package/types/mintplayer-ng-spark-pipes.d.ts +143 -0
  31. package/types/mintplayer-ng-spark-po-create.d.ts +29 -0
  32. package/types/mintplayer-ng-spark-po-detail.d.ts +88 -0
  33. package/types/mintplayer-ng-spark-po-edit.d.ts +31 -0
  34. package/types/mintplayer-ng-spark-po-form.d.ts +84 -0
  35. package/types/mintplayer-ng-spark-query-list.d.ts +60 -0
  36. package/types/mintplayer-ng-spark-renderers.d.ts +68 -0
  37. package/types/mintplayer-ng-spark-retry-action-modal.d.ts +14 -0
  38. package/types/mintplayer-ng-spark-routes.d.ts +12 -0
  39. package/types/mintplayer-ng-spark-services.d.ts +100 -0
  40. package/types/mintplayer-ng-spark.d.ts +3 -855
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mintplayer-ng-spark-query-list.mjs","sources":["../../query-list/src/spark-query-list.component.ts","../../query-list/src/spark-query-list.component.html","../../query-list/mintplayer-ng-spark-query-list.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, DestroyRef, inject, input, output, signal, TemplateRef, Type } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Subscription } from 'rxjs';\nimport { CommonModule, NgTemplateOutlet, NgComponentOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsAlertComponent } from '@mintplayer/ng-bootstrap/alert';\nimport { BsDatatableComponent, BsDatatableColumnDirective, BsRowTemplateDirective, DatatableSettings } from '@mintplayer/ng-bootstrap/datatable';\nimport { BsVirtualDatatableComponent, BsVirtualRowTemplateDirective, VirtualDatatableDataSource } from '@mintplayer/ng-bootstrap/virtual-datatable';\nimport { BsFormComponent, BsFormControlDirective } from '@mintplayer/ng-bootstrap/form';\nimport { BsContainerComponent } from '@mintplayer/ng-bootstrap/container';\nimport { BsGridComponent, BsGridRowDirective, BsGridColumnDirective } from '@mintplayer/ng-bootstrap/grid';\nimport { BsInputGroupComponent } from '@mintplayer/ng-bootstrap/input-group';\nimport { BsSpinnerComponent } from '@mintplayer/ng-bootstrap/spinner';\nimport { PaginationResponse, SortColumn } from '@mintplayer/pagination';\nimport { SparkService, SparkStreamingService } from '@mintplayer/ng-spark/services';\nimport {\n TranslateKeyPipe,\n ResolveTranslationPipe,\n AttributeValuePipe,\n} from '@mintplayer/ng-spark/pipes';\nimport { SparkIconComponent } from '@mintplayer/ng-spark/icon';\nimport { SPARK_ATTRIBUTE_RENDERERS } from '@mintplayer/ng-spark/renderers';\nimport {\n StreamingMessage,\n EntityType,\n EntityAttributeDefinition,\n LookupReference,\n PersistentObject,\n SparkQuery,\n ShowedOn,\n hasShowedOnFlag,\n} from '@mintplayer/ng-spark/models';\n\n@Component({\n selector: 'spark-query-list',\n imports: [CommonModule, NgTemplateOutlet, NgComponentOutlet, FormsModule, RouterModule, BsAlertComponent, BsContainerComponent, BsDatatableComponent, BsDatatableColumnDirective, BsRowTemplateDirective, BsVirtualDatatableComponent, BsVirtualRowTemplateDirective, BsFormComponent, BsFormControlDirective, BsGridComponent, BsGridRowDirective, BsGridColumnDirective, BsInputGroupComponent, BsSpinnerComponent, SparkIconComponent, ResolveTranslationPipe, TranslateKeyPipe, AttributeValuePipe],\n templateUrl: './spark-query-list.component.html',\n styleUrl: './spark-query-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.virtual-scrolling]': 'isVirtualScrolling()'\n }\n})\nexport class SparkQueryListComponent {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly sparkService = inject(SparkService);\n private readonly streamingService = inject(SparkStreamingService);\n private readonly rendererRegistry = inject(SPARK_ATTRIBUTE_RENDERERS);\n private readonly destroyRef = inject(DestroyRef);\n\n extraActionsTemplate = input<TemplateRef<void> | null>(null);\n\n rowClicked = output<PersistentObject>();\n createClicked = output<void>();\n\n colors = Color;\n errorMessage = signal<string | null>(null);\n query = signal<SparkQuery | null>(null);\n entityType = signal<EntityType | null>(null);\n allEntityTypes = signal<EntityType[]>([]);\n lookupReferenceOptions = signal<Record<string, LookupReference>>({});\n paginationData = signal<PaginationResponse<PersistentObject> | undefined>(undefined);\n searchTerm: string = '';\n canRead = signal(false);\n canCreate = signal(false);\n isStreaming = signal(false);\n private streamingSub: Subscription | null = null;\n private allItems = signal<PersistentObject[]>([]);\n private filteredItems: PersistentObject[] = [];\n settings = signal(new DatatableSettings({\n perPage: { values: [10, 25, 50], selected: 10 },\n page: { values: [1], selected: 1 },\n sortColumns: []\n }));\n virtualDataSource = signal<VirtualDatatableDataSource<PersistentObject> | null>(null);\n virtualSettings = signal(new DatatableSettings({\n sortColumns: []\n }));\n\n constructor() {\n this.route.paramMap.pipe(takeUntilDestroyed()).subscribe(params => this.onParamsChange(params));\n this.destroyRef.onDestroy(() => this.disconnectStreaming());\n }\n\n private async onParamsChange(params: any): Promise<void> {\n const queryId = params.get('queryId');\n const typeParam = params.get('type');\n\n let resolvedQuery: SparkQuery | null = null;\n let resolvedEntityType: EntityType | null = null;\n let resolvedEntityTypes: EntityType[] = [];\n\n if (queryId) {\n resolvedQuery = await this.sparkService.getQuery(queryId);\n if (resolvedQuery) {\n const result = await this.resolveEntityTypeForQuery(resolvedQuery);\n resolvedEntityType = result.entityType;\n resolvedEntityTypes = result.entityTypes;\n }\n } else if (typeParam) {\n resolvedEntityTypes = await this.sparkService.getEntityTypes();\n resolvedEntityType = resolvedEntityTypes.find(t =>\n t.id === typeParam || t.alias === typeParam\n ) || null;\n\n if (resolvedEntityType) {\n const queries = await this.sparkService.getQueries();\n const singularName = resolvedEntityType.name;\n resolvedQuery = queries.find(q => {\n // Match by explicit entityType\n if (q.entityType === singularName) return true;\n // Match by source name\n const sourceName = this.extractSourceName(q.source);\n const sourceSingular = this.singularize(sourceName);\n return sourceName === singularName ||\n sourceSingular === singularName ||\n sourceName === singularName + 's';\n }) || null;\n }\n }\n\n if (resolvedQuery) this.query.set(resolvedQuery);\n\n if (resolvedEntityType) {\n this.entityType.set(resolvedEntityType);\n this.allEntityTypes.set(resolvedEntityTypes);\n\n const initialSortColumns: SortColumn[] = (resolvedQuery?.sortColumns || []).map(sc => ({\n property: sc.property,\n direction: sc.direction === 'desc' ? 'descending' as const : 'ascending' as const\n }));\n\n if (resolvedQuery?.renderMode === 'VirtualScrolling') {\n this.virtualSettings.set(new DatatableSettings({ sortColumns: initialSortColumns }));\n if (resolvedQuery?.isStreamingQuery) {\n // Streaming + VirtualScrolling: create a stable client-side data source, then connect WebSocket\n this.virtualDataSource.set(new VirtualDatatableDataSource<PersistentObject>(\n (skip, take) => Promise.resolve({\n data: this.filteredItems.slice(skip, skip + take),\n totalRecords: this.filteredItems.length\n }),\n 50\n ));\n this.connectStreaming(resolvedQuery.id);\n } else {\n this.initVirtualDataSource();\n }\n } else {\n this.settings.set(new DatatableSettings({\n perPage: { values: [10, 25, 50], selected: 10 },\n page: { values: [1], selected: 1 },\n sortColumns: initialSortColumns\n }));\n await this.loadItems();\n }\n\n this.loadLookupReferenceOptions();\n const permissions = await this.sparkService.getPermissions(resolvedEntityType.id);\n this.canRead.set(permissions.canRead);\n this.canCreate.set(permissions.canCreate);\n }\n }\n\n private async resolveEntityTypeForQuery(query: SparkQuery): Promise<{ entityType: EntityType | null; entityTypes: EntityType[] }> {\n const entityTypes = await this.sparkService.getEntityTypes();\n\n // If entityType is explicitly set on the query, use it directly\n if (query.entityType) {\n const type = entityTypes.find(t =>\n t.name === query.entityType || t.alias === query.entityType?.toLowerCase()\n );\n return { entityType: type || null, entityTypes };\n }\n\n // For Database.X sources, extract the property name and try to match\n const sourceName = this.extractSourceName(query.source);\n const singularName = this.singularize(sourceName);\n const type = entityTypes.find(t =>\n t.name === sourceName ||\n t.name === singularName ||\n t.clrType.endsWith(singularName)\n );\n return { entityType: type || null, entityTypes };\n }\n\n private extractSourceName(source: string): string {\n const dotIndex = source.indexOf('.');\n return dotIndex >= 0 ? source.substring(dotIndex + 1) : source;\n }\n\n private singularize(plural: string): string {\n const irregulars: { [key: string]: string } = {\n 'People': 'Person',\n 'Children': 'Child',\n 'Men': 'Men',\n 'Women': 'Woman'\n };\n if (irregulars[plural]) return irregulars[plural];\n\n if (plural.endsWith('ies')) {\n return plural.slice(0, -3) + 'y';\n }\n if (plural.endsWith('es')) {\n return plural.slice(0, -2);\n }\n if (plural.endsWith('s')) {\n return plural.slice(0, -1);\n }\n return plural;\n }\n\n private initVirtualDataSource(): void {\n const currentQuery = this.query();\n if (!currentQuery) return;\n this.virtualDataSource.set(new VirtualDatatableDataSource<PersistentObject>(\n (skip, take) => this.sparkService.executeQuery(currentQuery.id, {\n sortColumns: this.virtualSettings().sortColumns,\n skip, take,\n search: this.searchTerm || undefined,\n }).then(r => ({ data: r.data, totalRecords: r.totalRecords })),\n 50\n ));\n }\n\n async loadItems(): Promise<void> {\n const currentQuery = this.query();\n if (!currentQuery) return;\n\n // Streaming queries use WebSocket instead of HTTP\n if (currentQuery.isStreamingQuery) {\n this.connectStreaming(currentQuery.id);\n return;\n }\n\n // Non-streaming: disconnect any previous streaming connection\n this.disconnectStreaming();\n\n try {\n const s = this.settings();\n const result = await this.sparkService.executeQuery(currentQuery.id, {\n sortColumns: s.sortColumns,\n skip: (s.page.selected - 1) * s.perPage.selected,\n take: s.perPage.selected,\n search: this.searchTerm || undefined,\n });\n this.errorMessage.set(null);\n\n const totalPages = Math.ceil(result.totalRecords / s.perPage.selected) || 1;\n this.paginationData.set({\n data: result.data,\n totalRecords: result.totalRecords,\n totalPages: totalPages,\n perPage: s.perPage.selected,\n page: s.page.selected\n });\n s.page.values = Array.from({ length: totalPages }, (_, i) => i + 1);\n } catch (e: any) {\n this.errorMessage.set(e.error?.error || e.message || 'An unexpected error occurred');\n this.paginationData.set(undefined);\n }\n }\n\n onSettingsChange(): void {\n if (this.isStreaming()) {\n // Streaming: sort/filter is client-side only\n this.applyFilter();\n return;\n }\n\n if (this.query()?.renderMode === 'VirtualScrolling') {\n this.virtualDataSource()?.reset();\n this.initVirtualDataSource();\n } else {\n this.loadItems();\n }\n }\n\n onSearchChange(): void {\n if (this.isStreaming()) {\n this.applyFilter();\n return;\n }\n\n if (this.query()?.renderMode === 'VirtualScrolling') {\n this.virtualDataSource()?.reset();\n this.initVirtualDataSource();\n } else {\n this.settings().page.selected = 1;\n this.loadItems();\n }\n }\n\n clearSearch(): void {\n this.searchTerm = '';\n this.onSearchChange();\n }\n\n isVirtualScrolling = computed(() => this.query()?.renderMode === 'VirtualScrolling');\n\n visibleAttributes = computed(() => {\n return this.entityType()?.attributes\n .filter(a => a.isVisible && hasShowedOnFlag(a.showedOn, ShowedOn.Query))\n .sort((a, b) => a.order - b.order) || [];\n });\n\n getColumnRendererComponent(attr: EntityAttributeDefinition): Type<any> | null {\n if (!attr.renderer) return null;\n return this.rendererRegistry.find(r => r.name === attr.renderer)?.columnComponent ?? null;\n }\n\n getColumnRendererInputs(item: PersistentObject, attr: EntityAttributeDefinition): Record<string, any> {\n const itemAttr = item.attributes.find(a => a.name === attr.name);\n return {\n value: itemAttr?.value,\n attribute: attr,\n options: attr.rendererOptions,\n };\n }\n\n private async loadLookupReferenceOptions(): Promise<void> {\n const lookupAttrs = this.visibleAttributes().filter(a => a.lookupReferenceType);\n if (lookupAttrs.length === 0) return;\n\n const lookupNames = [...new Set(lookupAttrs.map(a => a.lookupReferenceType!))];\n const entries = await Promise.all(\n lookupNames.map(async name => {\n const result = await this.sparkService.getLookupReference(name);\n return [name, result] as const;\n })\n );\n this.lookupReferenceOptions.set(entries.reduce((acc, [k, v]) => ({ ...acc, [k]: v }), {} as Record<string, LookupReference>));\n }\n\n onCreate(): void {\n this.createClicked.emit();\n const et = this.entityType();\n if (et) {\n this.router.navigate(['/po', et.alias || et.id, 'new']);\n }\n }\n\n private connectStreaming(queryId: string): void {\n this.disconnectStreaming();\n this.isStreaming.set(true);\n\n this.streamingSub = this.streamingService.connectToStreamingQuery(queryId).subscribe({\n next: (message) => this.handleStreamingMessage(message),\n error: (err) => {\n this.errorMessage.set(err?.message || 'Streaming connection failed');\n this.isStreaming.set(false);\n },\n complete: () => {\n this.isStreaming.set(false);\n }\n });\n }\n\n private disconnectStreaming(): void {\n if (this.streamingSub) {\n this.streamingSub.unsubscribe();\n this.streamingSub = null;\n }\n this.isStreaming.set(false);\n }\n\n private handleStreamingMessage(message: StreamingMessage): void {\n switch (message.type) {\n case 'snapshot':\n this.errorMessage.set(null);\n this.allItems.set(message.data);\n this.applyFilter();\n break;\n\n case 'patch':\n if (message.updated.length > 0) {\n const currentItems = this.allItems();\n const updatedItems = currentItems.map(item => {\n const patch = message.updated.find(u => u.id === item.id);\n if (!patch) return item;\n\n // Clone the item and update only changed attribute values\n const updatedAttributes = item.attributes.map(attr => {\n if (attr.name in patch.attributes) {\n return { ...attr, value: patch.attributes[attr.name] };\n }\n return attr;\n });\n\n return { ...item, attributes: updatedAttributes };\n });\n\n this.allItems.set(updatedItems);\n this.applyFilter();\n }\n break;\n\n case 'error':\n this.errorMessage.set(message.message);\n break;\n }\n }\n\n private applyFilter(): void {\n let items = this.allItems();\n\n // Apply search filter\n if (this.searchTerm) {\n const term = this.searchTerm.toLowerCase();\n items = items.filter(item =>\n item.attributes.some(a => String(a.value ?? '').toLowerCase().includes(term))\n );\n }\n\n // Apply sorting\n const isVirtual = this.query()?.renderMode === 'VirtualScrolling';\n const sortCols = isVirtual ? this.virtualSettings().sortColumns : this.settings().sortColumns;\n if (sortCols.length > 0) {\n items = [...items].sort((a, b) => {\n for (const col of sortCols) {\n const aVal = a.attributes.find(attr => attr.name === col.property)?.value ?? '';\n const bVal = b.attributes.find(attr => attr.name === col.property)?.value ?? '';\n const cmp = String(aVal).localeCompare(String(bVal));\n if (cmp !== 0) return col.direction === 'descending' ? -cmp : cmp;\n }\n return 0;\n });\n }\n\n if (isVirtual) {\n // Update the mutable filtered items array.\n // The stable data source's fetchFn closure reads from this.filteredItems,\n // so clearing its cache and emitting empty triggers the CDK viewport to re-fetch.\n this.filteredItems = items;\n this.virtualDataSource()?.reset();\n } else {\n this.paginationData.set({\n data: items,\n totalRecords: items.length,\n totalPages: 1,\n perPage: items.length,\n page: 1\n });\n }\n }\n}\n","<div class=\"d-flex flex-column h-100\">\n <!-- Title + Actions row -->\n <div class=\"d-flex justify-content-between align-items-center mb-4 flex-shrink-0\" [class.px-4]=\"isVirtualScrolling()\">\n <h2>\n {{ (query()?.description | resolveTranslation) || query()?.name || ('common.loading' | t) }}\n @if (isStreaming()) {\n <span class=\"badge bg-success ms-2\" style=\"font-size: 0.5em; vertical-align: middle;\">LIVE</span>\n }\n </h2>\n <div class=\"d-flex gap-2\">\n @if (extraActionsTemplate(); as extraActionsTpl) {\n <ng-container *ngTemplateOutlet=\"extraActionsTpl\"></ng-container>\n }\n @if (canCreate()) {\n <button class=\"btn btn-primary\" (click)=\"onCreate()\">\n <spark-icon name=\"plus-lg\" /> {{ 'common.new' | t }}\n </button>\n }\n </div>\n </div>\n\n @if (entityType()) {\n <!-- Search box -->\n <div class=\"flex-shrink-0\" [class.px-4]=\"isVirtualScrolling()\">\n <bs-form>\n <bs-grid>\n <div bsRow class=\"mb-3\">\n <div [md]=\"4\">\n <bs-input-group>\n <span class=\"input-group-text\">\n <spark-icon name=\"search\" />\n </span>\n <input\n type=\"text\"\n [placeholder]=\"'common.search' | t\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"onSearchChange()\">\n @if (searchTerm) {\n <button\n type=\"button\"\n class=\"btn btn-outline-secondary\"\n (click)=\"clearSearch()\">\n <spark-icon name=\"x-lg\" />\n </button>\n }\n </bs-input-group>\n </div>\n <div [md]=\"8\" class=\"text-end\">\n @if (searchTerm && paginationData()) {\n <span class=\"text-muted\">\n {{ paginationData()!.totalRecords }} {{ paginationData()!.totalRecords === 1 ? ('common.resultFound' | t) : ('common.resultsFound' | t) }}\n </span>\n }\n </div>\n </div>\n </bs-grid>\n </bs-form>\n\n @if (errorMessage(); as err) {\n <bs-alert [type]=\"colors.danger\" class=\"mb-3\">\n {{ err }}\n </bs-alert>\n }\n </div>\n\n @if (query()?.renderMode === 'VirtualScrolling') {\n @if (virtualDataSource(); as vds) {\n <bs-virtual-datatable class=\"flex-grow-1 overflow-hidden\"\n [(settings)]=\"virtualSettings\"\n [dataSource]=\"vds\"\n [isResponsive]=\"true\"\n (settingsChange)=\"onSettingsChange()\">\n @for (attr of visibleAttributes(); track attr.id) {\n <div *bsDatatableColumn=\"attr.name; sortable: true\">\n {{ (attr.label | resolveTranslation) || attr.name }}\n </div>\n }\n\n <ng-template bsVirtualRowTemplate let-item>\n @for (attr of visibleAttributes(); track attr.id; let first = $first) {\n <td>\n @if (item) {\n @if (first && canRead()) {\n <a [routerLink]=\"['/po', entityType()!.alias || entityType()!.id, item.id]\" (click)=\"rowClicked.emit(item)\">\n <ng-container *ngTemplateOutlet=\"cellContent; context: { $implicit: item, attr: attr }\"></ng-container>\n </a>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent; context: { $implicit: item, attr: attr }\"></ng-container>\n }\n } @else {\n &nbsp;\n }\n </td>\n }\n </ng-template>\n </bs-virtual-datatable>\n }\n } @else {\n <bs-datatable class=\"flex-grow-1\" [(settings)]=\"settings\" (settingsChange)=\"onSettingsChange()\">\n @for (attr of visibleAttributes(); track attr.id) {\n <div *bsDatatableColumn=\"attr.name; sortable: true\">\n {{ (attr.label | resolveTranslation) || attr.name }}\n </div>\n }\n\n <tr *bsRowTemplate=\"let item of paginationData()\">\n @for (attr of visibleAttributes(); track attr.id; let first = $first) {\n <td>\n @if (first && canRead()) {\n <a [routerLink]=\"['/po', entityType()!.alias || entityType()!.id, item.id]\" (click)=\"rowClicked.emit(item)\">\n <ng-container *ngTemplateOutlet=\"cellContent; context: { $implicit: item, attr: attr }\"></ng-container>\n </a>\n } @else {\n <ng-container *ngTemplateOutlet=\"cellContent; context: { $implicit: item, attr: attr }\"></ng-container>\n }\n </td>\n }\n </tr>\n </bs-datatable>\n }\n } @else {\n <div class=\"text-center p-5\">\n <bs-spinner />\n </div>\n }\n</div>\n\n<ng-template #cellContent let-item let-attr=\"attr\">\n @if (getColumnRendererComponent(attr); as rendererType) {\n <ng-container *ngComponentOutlet=\"rendererType; inputs: getColumnRendererInputs(item, attr)\"></ng-container>\n } @else if (attr.dataType === 'boolean') {\n <input type=\"checkbox\"\n [checked]=\"(attr.name | attributeValue:item:entityType():lookupReferenceOptions():allEntityTypes()) === true\"\n [indeterminate]=\"(attr.name | attributeValue:item:entityType():lookupReferenceOptions():allEntityTypes()) == null\"\n disabled\n onclick=\"return false;\">\n } @else if (attr.dataType === 'color') {\n @let colorVal = (attr.name | attributeValue:item:entityType():lookupReferenceOptions():allEntityTypes());\n @if (colorVal) {\n <span class=\"d-inline-block align-middle border rounded\" [style.background-color]=\"colorVal\" style=\"width: 1.5em; height: 1.5em;\"></span>\n }\n } @else {\n {{ (attr.name | attributeValue:item:entityType():lookupReferenceOptions():allEntityTypes()) }}\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { InjectionToken } from '@angular/core';
2
+
3
+ const SPARK_ATTRIBUTE_RENDERERS = new InjectionToken('SparkAttributeRenderers', { factory: () => [] });
4
+ /**
5
+ * Register custom attribute renderers globally.
6
+ *
7
+ * @example
8
+ * provideSparkAttributeRenderers([
9
+ * { name: 'video-player', detailComponent: VideoDetailComponent, columnComponent: VideoColumnComponent },
10
+ * { name: 'color-swatch', detailComponent: ColorDetailComponent, columnComponent: ColorColumnComponent },
11
+ * ])
12
+ */
13
+ function provideSparkAttributeRenderers(renderers) {
14
+ return {
15
+ provide: SPARK_ATTRIBUTE_RENDERERS,
16
+ useValue: renderers,
17
+ };
18
+ }
19
+
20
+ /**
21
+ * Generated bundle index. Do not edit.
22
+ */
23
+
24
+ export { SPARK_ATTRIBUTE_RENDERERS, provideSparkAttributeRenderers };
25
+ //# sourceMappingURL=mintplayer-ng-spark-renderers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mintplayer-ng-spark-renderers.mjs","sources":["../../renderers/src/spark-attribute-renderer-registry.ts","../../renderers/mintplayer-ng-spark-renderers.ts"],"sourcesContent":["import { InjectionToken, Provider, Type } from '@angular/core';\n\nexport interface SparkAttributeRendererRegistration {\n /** The renderer name (must match attr.renderer in model JSON) */\n name: string;\n /** Component for the PO detail page. Must implement SparkAttributeDetailRenderer. */\n detailComponent: Type<any>;\n /** Component for query-list column cells. Must implement SparkAttributeColumnRenderer. */\n columnComponent: Type<any>;\n /** Optional component for create/edit forms. Must implement SparkAttributeEditRenderer. When omitted, the default input is used. */\n editComponent?: Type<any>;\n}\n\nexport const SPARK_ATTRIBUTE_RENDERERS = new InjectionToken<SparkAttributeRendererRegistration[]>(\n 'SparkAttributeRenderers',\n { factory: () => [] }\n);\n\n/**\n * Register custom attribute renderers globally.\n *\n * @example\n * provideSparkAttributeRenderers([\n * { name: 'video-player', detailComponent: VideoDetailComponent, columnComponent: VideoColumnComponent },\n * { name: 'color-swatch', detailComponent: ColorDetailComponent, columnComponent: ColorColumnComponent },\n * ])\n */\nexport function provideSparkAttributeRenderers(\n renderers: SparkAttributeRendererRegistration[]\n): Provider {\n return {\n provide: SPARK_ATTRIBUTE_RENDERERS,\n useValue: renderers,\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;AAaO,MAAM,yBAAyB,GAAG,IAAI,cAAc,CACzD,yBAAyB,EACzB,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;AAGvB;;;;;;;;AAQG;AACG,SAAU,8BAA8B,CAC5C,SAA+C,EAAA;IAE/C,OAAO;AACL,QAAA,OAAO,EAAE,yBAAyB;AAClC,QAAA,QAAQ,EAAE,SAAS;KACpB;AACH;;AClCA;;AAEG;;;;"}
@@ -0,0 +1,87 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import { Color } from '@mintplayer/ng-bootstrap';
5
+ import { BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective } from '@mintplayer/ng-bootstrap/modal';
6
+ import { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';
7
+ import { RetryActionService } from '@mintplayer/ng-spark/services';
8
+
9
+ class SparkRetryActionModalComponent {
10
+ retryActionService = inject(RetryActionService);
11
+ colors = Color;
12
+ isOpen = computed(() => this.retryActionService.payload() !== null, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
13
+ onOption(option) {
14
+ const payload = this.retryActionService.payload();
15
+ if (!payload)
16
+ return;
17
+ this.retryActionService.respond({
18
+ step: payload.step,
19
+ option,
20
+ persistentObject: payload.persistentObject
21
+ });
22
+ }
23
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkRetryActionModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
24
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.6", type: SparkRetryActionModalComponent, isStandalone: true, selector: "spark-retry-action-modal", ngImport: i0, template: `
25
+ <bs-modal [isOpen]="isOpen()" (isOpenChange)="!$event && onOption('Cancel')">
26
+ <div *bsModal>
27
+ <div bsModalHeader>
28
+ <h5 class="modal-title">{{ retryActionService.payload()?.title }}</h5>
29
+ </div>
30
+ @if (retryActionService.payload()?.message; as message) {
31
+ <div bsModalBody>
32
+ <p>{{ message }}</p>
33
+ </div>
34
+ }
35
+ <div bsModalFooter>
36
+ @for (option of retryActionService.payload()?.options; track option) {
37
+ <button
38
+ type="button"
39
+ [color]="option === 'Cancel' ? colors.secondary : colors.primary"
40
+ (click)="onOption(option)">
41
+ {{ option }}
42
+ </button>
43
+ }
44
+ </div>
45
+ </div>
46
+ </bs-modal>
47
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: BsModalHostComponent, selector: "bs-modal", inputs: ["isOpen", "closeOnEscape"], outputs: ["isOpenChange"] }, { kind: "directive", type: BsModalDirective, selector: "[bsModal]" }, { kind: "directive", type: BsModalHeaderDirective, selector: "[bsModalHeader]" }, { kind: "directive", type: BsModalBodyDirective, selector: "[bsModalBody]" }, { kind: "directive", type: BsModalFooterDirective, selector: "[bsModalFooter]" }, { kind: "directive", type: BsButtonTypeDirective, selector: "button[color],input[type=\"button\"][color],input[type=\"submit\"][color],a[color]", inputs: ["color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkRetryActionModalComponent, decorators: [{
50
+ type: Component,
51
+ args: [{
52
+ selector: 'spark-retry-action-modal',
53
+ imports: [CommonModule, BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective, BsButtonTypeDirective],
54
+ template: `
55
+ <bs-modal [isOpen]="isOpen()" (isOpenChange)="!$event && onOption('Cancel')">
56
+ <div *bsModal>
57
+ <div bsModalHeader>
58
+ <h5 class="modal-title">{{ retryActionService.payload()?.title }}</h5>
59
+ </div>
60
+ @if (retryActionService.payload()?.message; as message) {
61
+ <div bsModalBody>
62
+ <p>{{ message }}</p>
63
+ </div>
64
+ }
65
+ <div bsModalFooter>
66
+ @for (option of retryActionService.payload()?.options; track option) {
67
+ <button
68
+ type="button"
69
+ [color]="option === 'Cancel' ? colors.secondary : colors.primary"
70
+ (click)="onOption(option)">
71
+ {{ option }}
72
+ </button>
73
+ }
74
+ </div>
75
+ </div>
76
+ </bs-modal>
77
+ `,
78
+ changeDetection: ChangeDetectionStrategy.OnPush
79
+ }]
80
+ }] });
81
+
82
+ /**
83
+ * Generated bundle index. Do not edit.
84
+ */
85
+
86
+ export { SparkRetryActionModalComponent };
87
+ //# sourceMappingURL=mintplayer-ng-spark-retry-action-modal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mintplayer-ng-spark-retry-action-modal.mjs","sources":["../../retry-action-modal/src/spark-retry-action-modal.component.ts","../../retry-action-modal/mintplayer-ng-spark-retry-action-modal.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Color } from '@mintplayer/ng-bootstrap';\nimport { BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective } from '@mintplayer/ng-bootstrap/modal';\nimport { BsButtonTypeDirective } from '@mintplayer/ng-bootstrap/button-type';\nimport { RetryActionService } from '@mintplayer/ng-spark/services';\n\n@Component({\n selector: 'spark-retry-action-modal',\n imports: [CommonModule, BsModalHostComponent, BsModalDirective, BsModalHeaderDirective, BsModalBodyDirective, BsModalFooterDirective, BsButtonTypeDirective],\n template: `\n <bs-modal [isOpen]=\"isOpen()\" (isOpenChange)=\"!$event && onOption('Cancel')\">\n <div *bsModal>\n <div bsModalHeader>\n <h5 class=\"modal-title\">{{ retryActionService.payload()?.title }}</h5>\n </div>\n @if (retryActionService.payload()?.message; as message) {\n <div bsModalBody>\n <p>{{ message }}</p>\n </div>\n }\n <div bsModalFooter>\n @for (option of retryActionService.payload()?.options; track option) {\n <button\n type=\"button\"\n [color]=\"option === 'Cancel' ? colors.secondary : colors.primary\"\n (click)=\"onOption(option)\">\n {{ option }}\n </button>\n }\n </div>\n </div>\n </bs-modal>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SparkRetryActionModalComponent {\n protected readonly retryActionService = inject(RetryActionService);\n\n colors = Color;\n isOpen = computed(() => this.retryActionService.payload() !== null);\n\n onOption(option: string): void {\n const payload = this.retryActionService.payload();\n if (!payload) return;\n this.retryActionService.respond({\n step: payload.step,\n option,\n persistentObject: payload.persistentObject\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;MAoCa,8BAA8B,CAAA;AACtB,IAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAElE,MAAM,GAAG,KAAK;AACd,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,IAAI,kDAAC;AAEnE,IAAA,QAAQ,CAAC,MAAc,EAAA;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;AACjD,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM;YACN,gBAAgB,EAAE,OAAO,CAAC;AAC3B,SAAA,CAAC;IACJ;uGAdW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA9B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1B/B;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAxBS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,oFAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FA2BhJ,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBA7B1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,0BAA0B;AACpC,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,qBAAqB,CAAC;AAC5J,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC;AAC1C,iBAAA;;;ACnCD;;AAEG;;;;"}
@@ -0,0 +1,31 @@
1
+ function sparkRoutes(config) {
2
+ return [
3
+ {
4
+ path: 'query/:queryId',
5
+ loadComponent: config?.queryList ?? (() => import('@mintplayer/ng-spark/query-list').then(m => m.SparkQueryListComponent))
6
+ },
7
+ {
8
+ path: 'po/:type/new',
9
+ loadComponent: config?.poCreate ?? (() => import('@mintplayer/ng-spark/po-create').then(m => m.SparkPoCreateComponent))
10
+ },
11
+ {
12
+ path: 'po/:type/:id/edit',
13
+ loadComponent: config?.poEdit ?? (() => import('@mintplayer/ng-spark/po-edit').then(m => m.SparkPoEditComponent))
14
+ },
15
+ {
16
+ path: 'po/:type/:id',
17
+ loadComponent: config?.poDetail ?? (() => import('@mintplayer/ng-spark/po-detail').then(m => m.SparkPoDetailComponent))
18
+ },
19
+ {
20
+ path: 'po/:type',
21
+ loadComponent: config?.queryList ?? (() => import('@mintplayer/ng-spark/query-list').then(m => m.SparkQueryListComponent))
22
+ }
23
+ ];
24
+ }
25
+
26
+ /**
27
+ * Generated bundle index. Do not edit.
28
+ */
29
+
30
+ export { sparkRoutes };
31
+ //# sourceMappingURL=mintplayer-ng-spark-routes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mintplayer-ng-spark-routes.mjs","sources":["../../routes/src/spark-routes.ts","../../routes/mintplayer-ng-spark-routes.ts"],"sourcesContent":["import { Routes, Route } from '@angular/router';\n\nexport interface SparkRouteConfig {\n queryList?: Route['loadComponent'];\n poCreate?: Route['loadComponent'];\n poEdit?: Route['loadComponent'];\n poDetail?: Route['loadComponent'];\n}\n\nexport function sparkRoutes(config?: SparkRouteConfig): Routes {\n return [\n {\n path: 'query/:queryId',\n loadComponent: config?.queryList ?? (() => import('@mintplayer/ng-spark/query-list').then(m => m.SparkQueryListComponent))\n },\n {\n path: 'po/:type/new',\n loadComponent: config?.poCreate ?? (() => import('@mintplayer/ng-spark/po-create').then(m => m.SparkPoCreateComponent))\n },\n {\n path: 'po/:type/:id/edit',\n loadComponent: config?.poEdit ?? (() => import('@mintplayer/ng-spark/po-edit').then(m => m.SparkPoEditComponent))\n },\n {\n path: 'po/:type/:id',\n loadComponent: config?.poDetail ?? (() => import('@mintplayer/ng-spark/po-detail').then(m => m.SparkPoDetailComponent))\n },\n {\n path: 'po/:type',\n loadComponent: config?.queryList ?? (() => import('@mintplayer/ng-spark/query-list').then(m => m.SparkQueryListComponent))\n }\n ];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AASM,SAAU,WAAW,CAAC,MAAyB,EAAA;IACnD,OAAO;AACL,QAAA;AACE,YAAA,IAAI,EAAE,gBAAgB;YACtB,aAAa,EAAE,MAAM,EAAE,SAAS,KAAK,MAAM,OAAO,iCAAiC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,uBAAuB,CAAC;AAC1H,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,cAAc;YACpB,aAAa,EAAE,MAAM,EAAE,QAAQ,KAAK,MAAM,OAAO,gCAAgC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC;AACvH,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,mBAAmB;YACzB,aAAa,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,OAAO,8BAA8B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC;AACjH,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,cAAc;YACpB,aAAa,EAAE,MAAM,EAAE,QAAQ,KAAK,MAAM,OAAO,gCAAgC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC;AACvH,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,UAAU;YAChB,aAAa,EAAE,MAAM,EAAE,SAAS,KAAK,MAAM,OAAO,iCAAiC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,uBAAuB,CAAC;AAC1H;KACF;AACH;;AChCA;;AAEG;;;;"}
@@ -0,0 +1,348 @@
1
+ import * as i0 from '@angular/core';
2
+ import { signal, Injectable, inject, NgZone } from '@angular/core';
3
+ import { HttpClient, HttpParams } from '@angular/common/http';
4
+ import { firstValueFrom, Observable } from 'rxjs';
5
+ import { currentLanguage } from '@mintplayer/ng-spark/models';
6
+ import { SPARK_CONFIG } from '@mintplayer/ng-spark';
7
+ import { DomSanitizer } from '@angular/platform-browser';
8
+
9
+ class RetryActionService {
10
+ resolveRetry = null;
11
+ payload = signal(null, ...(ngDevMode ? [{ debugName: "payload" }] : []));
12
+ show(payload) {
13
+ this.payload.set(payload);
14
+ return new Promise(resolve => { this.resolveRetry = resolve; });
15
+ }
16
+ respond(result) {
17
+ this.payload.set(null);
18
+ this.resolveRetry?.(result);
19
+ this.resolveRetry = null;
20
+ }
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: RetryActionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
22
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: RetryActionService, providedIn: 'root' });
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: RetryActionService, decorators: [{
25
+ type: Injectable,
26
+ args: [{ providedIn: 'root' }]
27
+ }] });
28
+
29
+ class SparkLanguageService {
30
+ http = inject(HttpClient);
31
+ config = inject(SPARK_CONFIG, { optional: true });
32
+ baseUrl = this.config?.baseUrl ?? '/spark';
33
+ currentLang = signal('en', ...(ngDevMode ? [{ debugName: "currentLang" }] : []));
34
+ translationsMap = signal({}, ...(ngDevMode ? [{ debugName: "translationsMap" }] : []));
35
+ language = this.currentLang.asReadonly();
36
+ languages = signal({}, ...(ngDevMode ? [{ debugName: "languages" }] : []));
37
+ constructor() {
38
+ this.loadCulture();
39
+ this.loadTranslations();
40
+ }
41
+ async loadCulture() {
42
+ const config = await firstValueFrom(this.http.get(`${this.baseUrl}/culture`));
43
+ this.languages.set(config.languages);
44
+ const saved = localStorage.getItem('spark-lang');
45
+ const lang = saved ?? config.defaultLanguage;
46
+ this.currentLang.set(lang);
47
+ currentLanguage.set(lang);
48
+ }
49
+ async loadTranslations() {
50
+ const t = await firstValueFrom(this.http.get(`${this.baseUrl}/translations`));
51
+ this.translationsMap.set(t);
52
+ }
53
+ setLanguage(lang) {
54
+ this.currentLang.set(lang);
55
+ currentLanguage.set(lang);
56
+ localStorage.setItem('spark-lang', lang);
57
+ }
58
+ resolve(ts) {
59
+ if (!ts)
60
+ return '';
61
+ const lang = this.currentLang();
62
+ return ts[lang] ?? ts['en'] ?? Object.values(ts)[0] ?? '';
63
+ }
64
+ t(key) {
65
+ const ts = this.translationsMap()[key];
66
+ return this.resolve(ts) || key;
67
+ }
68
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkLanguageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
69
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkLanguageService, providedIn: 'root' });
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkLanguageService, decorators: [{
72
+ type: Injectable,
73
+ args: [{ providedIn: 'root' }]
74
+ }], ctorParameters: () => [] });
75
+
76
+ class SparkStreamingService {
77
+ config = inject(SPARK_CONFIG, { optional: true });
78
+ baseUrl = this.config?.baseUrl ?? '/spark';
79
+ ngZone = inject(NgZone);
80
+ connectToStreamingQuery(queryId) {
81
+ return new Observable(subscriber => {
82
+ let ws = null;
83
+ let retryCount = 0;
84
+ let retryTimeout = null;
85
+ let closed = false;
86
+ const maxRetries = 10;
87
+ const maxDelay = 30000;
88
+ const connect = () => {
89
+ if (closed)
90
+ return;
91
+ const url = this.buildWebSocketUrl(queryId);
92
+ ws = new WebSocket(url);
93
+ ws.onopen = () => {
94
+ retryCount = 0; // Reset on successful connect
95
+ };
96
+ ws.onmessage = (event) => {
97
+ try {
98
+ const message = JSON.parse(event.data);
99
+ this.ngZone.run(() => subscriber.next(message));
100
+ }
101
+ catch {
102
+ // Ignore malformed messages
103
+ }
104
+ };
105
+ ws.onerror = () => {
106
+ // Error will trigger onclose
107
+ };
108
+ ws.onclose = (event) => {
109
+ if (closed)
110
+ return;
111
+ // Don't reconnect on normal closure
112
+ if (event.code === 1000) {
113
+ this.ngZone.run(() => subscriber.complete());
114
+ return;
115
+ }
116
+ // Reconnect with exponential backoff
117
+ if (retryCount < maxRetries) {
118
+ const delay = Math.min(1000 * Math.pow(2, retryCount), maxDelay);
119
+ retryCount++;
120
+ retryTimeout = setTimeout(() => connect(), delay);
121
+ }
122
+ else {
123
+ this.ngZone.run(() => subscriber.error(new Error('WebSocket connection failed after maximum retries')));
124
+ }
125
+ };
126
+ };
127
+ connect();
128
+ // Teardown: close WebSocket on unsubscribe
129
+ return () => {
130
+ closed = true;
131
+ if (retryTimeout) {
132
+ clearTimeout(retryTimeout);
133
+ }
134
+ if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {
135
+ ws.close(1000, 'Client unsubscribed');
136
+ }
137
+ };
138
+ });
139
+ }
140
+ buildWebSocketUrl(queryId) {
141
+ const encodedId = encodeURIComponent(queryId);
142
+ const path = `${this.baseUrl}/queries/${encodedId}/stream`;
143
+ // If baseUrl is absolute (starts with http/https), replace protocol
144
+ if (this.baseUrl.startsWith('http://')) {
145
+ return path.replace(/^http:\/\//, 'ws://');
146
+ }
147
+ if (this.baseUrl.startsWith('https://')) {
148
+ return path.replace(/^https:\/\//, 'wss://');
149
+ }
150
+ // Relative URL — construct from window.location
151
+ const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
152
+ return `${protocol}//${window.location.host}${path}`;
153
+ }
154
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkStreamingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
155
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkStreamingService, providedIn: 'root' });
156
+ }
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkStreamingService, decorators: [{
158
+ type: Injectable,
159
+ args: [{ providedIn: 'root' }]
160
+ }] });
161
+
162
+ class SparkService {
163
+ config = inject(SPARK_CONFIG, { optional: true });
164
+ baseUrl = this.config?.baseUrl ?? '/spark';
165
+ http = inject(HttpClient);
166
+ retryActionService = inject(RetryActionService);
167
+ // Entity Types
168
+ async getEntityTypes() {
169
+ return firstValueFrom(this.http.get(`${this.baseUrl}/types`));
170
+ }
171
+ async getEntityType(id) {
172
+ return firstValueFrom(this.http.get(`${this.baseUrl}/types/${encodeURIComponent(id)}`));
173
+ }
174
+ async getEntityTypeByClrType(clrType) {
175
+ const types = await this.getEntityTypes();
176
+ return types.find(t => t.clrType === clrType);
177
+ }
178
+ // Permissions
179
+ async getPermissions(entityTypeId) {
180
+ return firstValueFrom(this.http.get(`${this.baseUrl}/permissions/${encodeURIComponent(entityTypeId)}`));
181
+ }
182
+ // Queries
183
+ async getQueries() {
184
+ return firstValueFrom(this.http.get(`${this.baseUrl}/queries`));
185
+ }
186
+ async getQuery(id) {
187
+ return firstValueFrom(this.http.get(`${this.baseUrl}/queries/${encodeURIComponent(id)}`));
188
+ }
189
+ async getQueryByName(name) {
190
+ const queries = await this.getQueries();
191
+ return queries.find(q => q.name === name);
192
+ }
193
+ async executeQuery(queryId, options) {
194
+ let params = new HttpParams();
195
+ if (options?.sortColumns?.length) {
196
+ params = params.set('sortColumns', options.sortColumns.map(c => `${c.property}:${c.direction === 'descending' ? 'desc' : 'asc'}`).join(','));
197
+ }
198
+ if (options?.parentId)
199
+ params = params.set('parentId', options.parentId);
200
+ if (options?.parentType)
201
+ params = params.set('parentType', options.parentType);
202
+ if (options?.skip != null)
203
+ params = params.set('skip', options.skip);
204
+ if (options?.take != null)
205
+ params = params.set('take', options.take);
206
+ if (options?.search)
207
+ params = params.set('search', options.search);
208
+ return firstValueFrom(this.http.get(`${this.baseUrl}/queries/${encodeURIComponent(queryId)}/execute`, { params }));
209
+ }
210
+ async executeQueryByName(queryName, options) {
211
+ const query = await this.getQueryByName(queryName);
212
+ return query ? this.executeQuery(query.id, { parentId: options?.parentId, parentType: options?.parentType }) : { data: [], totalRecords: 0, skip: 0, take: 50 };
213
+ }
214
+ // Program Units
215
+ async getProgramUnits() {
216
+ return firstValueFrom(this.http.get(`${this.baseUrl}/program-units`));
217
+ }
218
+ // Persistent Objects
219
+ async list(type) {
220
+ return firstValueFrom(this.http.get(`${this.baseUrl}/po/${encodeURIComponent(type)}`));
221
+ }
222
+ async get(type, id) {
223
+ return firstValueFrom(this.http.get(`${this.baseUrl}/po/${encodeURIComponent(type)}/${encodeURIComponent(id)}`));
224
+ }
225
+ async create(type, data) {
226
+ return this.postWithRetry(`${this.baseUrl}/po/${encodeURIComponent(type)}`, { persistentObject: data });
227
+ }
228
+ async update(type, id, data) {
229
+ return this.putWithRetry(`${this.baseUrl}/po/${encodeURIComponent(type)}/${encodeURIComponent(id)}`, { persistentObject: data });
230
+ }
231
+ async delete(type, id) {
232
+ return this.deleteWithRetry(`${this.baseUrl}/po/${encodeURIComponent(type)}/${encodeURIComponent(id)}`, {});
233
+ }
234
+ // Custom Actions
235
+ async getCustomActions(objectTypeId) {
236
+ return firstValueFrom(this.http.get(`${this.baseUrl}/actions/${encodeURIComponent(objectTypeId)}`));
237
+ }
238
+ async executeCustomAction(objectTypeId, actionName, parent, selectedItems) {
239
+ const body = { parent, selectedItems };
240
+ return this.postWithRetry(`${this.baseUrl}/actions/${encodeURIComponent(objectTypeId)}/${encodeURIComponent(actionName)}`, body);
241
+ }
242
+ // LookupReferences
243
+ async getLookupReferences() {
244
+ return firstValueFrom(this.http.get(`${this.baseUrl}/lookupref`));
245
+ }
246
+ async getLookupReference(name) {
247
+ return firstValueFrom(this.http.get(`${this.baseUrl}/lookupref/${encodeURIComponent(name)}`));
248
+ }
249
+ async addLookupReferenceValue(name, value) {
250
+ return firstValueFrom(this.http.post(`${this.baseUrl}/lookupref/${encodeURIComponent(name)}`, value));
251
+ }
252
+ async updateLookupReferenceValue(name, key, value) {
253
+ return firstValueFrom(this.http.put(`${this.baseUrl}/lookupref/${encodeURIComponent(name)}/${encodeURIComponent(key)}`, value));
254
+ }
255
+ async deleteLookupReferenceValue(name, key) {
256
+ return firstValueFrom(this.http.delete(`${this.baseUrl}/lookupref/${encodeURIComponent(name)}/${encodeURIComponent(key)}`));
257
+ }
258
+ // Retry Action helpers
259
+ async postWithRetry(url, body) {
260
+ try {
261
+ return await firstValueFrom(this.http.post(url, body));
262
+ }
263
+ catch (error) {
264
+ return this.handleRetryError(error, () => this.postWithRetry(url, body), body);
265
+ }
266
+ }
267
+ async putWithRetry(url, body) {
268
+ try {
269
+ return await firstValueFrom(this.http.put(url, body));
270
+ }
271
+ catch (error) {
272
+ return this.handleRetryError(error, () => this.putWithRetry(url, body), body);
273
+ }
274
+ }
275
+ async deleteWithRetry(url, body) {
276
+ try {
277
+ const hasRetry = body.retryResults && body.retryResults.length > 0;
278
+ return await firstValueFrom(hasRetry
279
+ ? this.http.delete(url, { body })
280
+ : this.http.delete(url));
281
+ }
282
+ catch (error) {
283
+ return this.handleRetryError(error, () => this.deleteWithRetry(url, body), body);
284
+ }
285
+ }
286
+ async handleRetryError(error, retryFn, body) {
287
+ if (error.status !== 449 || error.error?.type !== 'retry-action') {
288
+ throw error;
289
+ }
290
+ const payload = error.error;
291
+ const result = await this.retryActionService.show(payload);
292
+ // Modal dismissed (Escape/X) - Cancel was not an explicit developer option
293
+ if (result.option === 'Cancel' && !payload.options.includes('Cancel')) {
294
+ throw error;
295
+ }
296
+ body.retryResults = [...(body.retryResults || []), result];
297
+ return retryFn();
298
+ }
299
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
300
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkService, providedIn: 'root' });
301
+ }
302
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkService, decorators: [{
303
+ type: Injectable,
304
+ args: [{ providedIn: 'root' }]
305
+ }] });
306
+
307
+ /** Built-in SVG icons used by ng-spark library templates. */
308
+ const SPARK_BUILT_IN_ICONS = {
309
+ 'arrow-left': '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-left" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M15 8a.5.5 0 0 0-.5-.5H2.707l3.147-3.146a.5.5 0 1 0-.708-.708l-4 4a.5.5 0 0 0 0 .708l4 4a.5.5 0 0 0 .708-.708L2.707 8.5H14.5A.5.5 0 0 0 15 8"/></svg>',
310
+ 'pencil': '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-pencil" viewBox="0 0 16 16"><path d="M12.146.146a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1 0 .708l-10 10a.5.5 0 0 1-.168.11l-5 2a.5.5 0 0 1-.65-.65l2-5a.5.5 0 0 1 .11-.168zM11.207 2.5 13.5 4.793 14.793 3.5 12.5 1.207zm1.586 3L10.5 3.207 4 9.707V10h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.293zm-9.761 5.175-.106.106-1.528 3.821 3.821-1.528.106-.106A.5.5 0 0 1 5 12.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.468-.325"/></svg>',
311
+ 'plus': '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus" viewBox="0 0 16 16"><path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4"/></svg>',
312
+ 'plus-lg': '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-plus-lg" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8 2a.5.5 0 0 1 .5.5v5h5a.5.5 0 0 1 0 1h-5v5a.5.5 0 0 1-1 0v-5h-5a.5.5 0 0 1 0-1h5v-5A.5.5 0 0 1 8 2"/></svg>',
313
+ 'search': '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-search" viewBox="0 0 16 16"><path d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001q.044.06.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1 1 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0"/></svg>',
314
+ 'trash': '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-trash" viewBox="0 0 16 16"><path d="M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5m2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5m3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0z"/><path d="M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1zM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4zM2.5 3h11V2h-11z"/></svg>',
315
+ 'x-lg': '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-x-lg" viewBox="0 0 16 16"><path d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z"/></svg>',
316
+ };
317
+
318
+ class SparkIconRegistry {
319
+ sanitizer = inject(DomSanitizer);
320
+ icons = new Map();
321
+ constructor() {
322
+ for (const [name, svg] of Object.entries(SPARK_BUILT_IN_ICONS)) {
323
+ this.icons.set(name, this.sanitizer.bypassSecurityTrustHtml(svg));
324
+ }
325
+ }
326
+ register(name, svg) {
327
+ this.icons.set(name, this.sanitizer.bypassSecurityTrustHtml(svg));
328
+ }
329
+ get(name) {
330
+ return this.icons.get(name);
331
+ }
332
+ has(name) {
333
+ return this.icons.has(name);
334
+ }
335
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkIconRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
336
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkIconRegistry, providedIn: 'root' });
337
+ }
338
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SparkIconRegistry, decorators: [{
339
+ type: Injectable,
340
+ args: [{ providedIn: 'root' }]
341
+ }], ctorParameters: () => [] });
342
+
343
+ /**
344
+ * Generated bundle index. Do not edit.
345
+ */
346
+
347
+ export { RetryActionService, SparkIconRegistry, SparkLanguageService, SparkService, SparkStreamingService };
348
+ //# sourceMappingURL=mintplayer-ng-spark-services.mjs.map