@slotted/angular 0.1.0-beta.1 → 0.1.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/README.md +4 -0
  2. package/docs/AGENTS.snippet.md +10 -0
  3. package/docs/app-shell.json +1 -1
  4. package/docs/button-group.json +1 -0
  5. package/docs/button-group.md +1 -1
  6. package/docs/button.json +45 -11
  7. package/docs/button.md +10 -6
  8. package/docs/chart.json +7 -0
  9. package/docs/chart.md +1 -0
  10. package/docs/checkbox.json +7 -0
  11. package/docs/checkbox.md +1 -0
  12. package/docs/currency-field.json +32 -1
  13. package/docs/currency-field.md +4 -1
  14. package/docs/dialog.examples.md +20 -0
  15. package/docs/dialog.json +14 -2
  16. package/docs/dialog.md +1 -1
  17. package/docs/event-calendar.json +7 -0
  18. package/docs/event-calendar.md +1 -0
  19. package/docs/guidelines/README.md +27 -0
  20. package/docs/guidelines/async-feedback.md +108 -0
  21. package/docs/guidelines/browsing.md +74 -0
  22. package/docs/guidelines/builders.md +97 -0
  23. package/docs/guidelines/composition.md +129 -0
  24. package/docs/guidelines/conversations.md +59 -0
  25. package/docs/guidelines/errors-and-conflicts.md +71 -0
  26. package/docs/guidelines/forms.md +192 -0
  27. package/docs/guidelines/index.md +121 -0
  28. package/docs/guidelines/layout-alignment.md +95 -0
  29. package/docs/guidelines/ledgers.md +45 -0
  30. package/docs/guidelines/list-pages.md +165 -0
  31. package/docs/guidelines/overviews.md +66 -0
  32. package/docs/guidelines/own-elements.md +115 -0
  33. package/docs/guidelines/reading-permissions.md +55 -0
  34. package/docs/guidelines/record-pages.md +178 -0
  35. package/docs/guidelines/reports.md +123 -0
  36. package/docs/guidelines/shell-composition.md +94 -0
  37. package/docs/guidelines/workspaces.md +46 -0
  38. package/docs/index.md +12 -0
  39. package/docs/list.json +19 -1
  40. package/docs/list.md +3 -1
  41. package/docs/popover.json +1 -1
  42. package/docs/progress-indicator.json +1 -2
  43. package/docs/progress-indicator.md +2 -2
  44. package/docs/segmented-control.json +29 -1
  45. package/docs/segmented-control.md +17 -1
  46. package/docs/skills/build-own-element/SKILL.md +90 -0
  47. package/docs/skills/compose-screen/SKILL.md +76 -0
  48. package/docs/skills/index.md +9 -0
  49. package/docs/skills/review-screen/SKILL.md +70 -0
  50. package/docs/skills/theme-app/SKILL.md +79 -0
  51. package/docs/skills/waiting-states/SKILL.md +139 -0
  52. package/docs/split-button.json +1 -0
  53. package/docs/split-button.md +1 -1
  54. package/docs/stat-card.json +2 -0
  55. package/docs/stat-card.md +1 -1
  56. package/docs/table.examples.md +1 -1
  57. package/docs/table.json +70 -1
  58. package/docs/table.md +10 -1
  59. package/docs/tabs.json +1 -4
  60. package/docs/tabs.md +1 -1
  61. package/docs/toggle-group.json +14 -3
  62. package/docs/toggle-group.md +3 -3
  63. package/docs/toggle.json +12 -3
  64. package/docs/toggle.md +3 -3
  65. package/docs/tokens.md +448 -0
  66. package/docs/tour.json +1 -1
  67. package/fesm2022/slotted-angular-app-shell.mjs +48 -16
  68. package/fesm2022/slotted-angular-app-shell.mjs.map +1 -1
  69. package/fesm2022/slotted-angular-button-group.mjs +4 -4
  70. package/fesm2022/slotted-angular-button-group.mjs.map +1 -1
  71. package/fesm2022/slotted-angular-button.mjs +51 -19
  72. package/fesm2022/slotted-angular-button.mjs.map +1 -1
  73. package/fesm2022/slotted-angular-cascader.mjs +1 -1
  74. package/fesm2022/slotted-angular-cascader.mjs.map +1 -1
  75. package/fesm2022/slotted-angular-chart.mjs +41 -20
  76. package/fesm2022/slotted-angular-chart.mjs.map +1 -1
  77. package/fesm2022/slotted-angular-checkbox.mjs +11 -2
  78. package/fesm2022/slotted-angular-checkbox.mjs.map +1 -1
  79. package/fesm2022/slotted-angular-column-manager.mjs +1 -1
  80. package/fesm2022/slotted-angular-column-manager.mjs.map +1 -1
  81. package/fesm2022/slotted-angular-combobox.mjs +12 -6
  82. package/fesm2022/slotted-angular-combobox.mjs.map +1 -1
  83. package/fesm2022/slotted-angular-currency-field.mjs +59 -8
  84. package/fesm2022/slotted-angular-currency-field.mjs.map +1 -1
  85. package/fesm2022/slotted-angular-dashboard-grid.mjs +18 -22
  86. package/fesm2022/slotted-angular-dashboard-grid.mjs.map +1 -1
  87. package/fesm2022/slotted-angular-data-grid.mjs +7 -3
  88. package/fesm2022/slotted-angular-data-grid.mjs.map +1 -1
  89. package/fesm2022/slotted-angular-data-list.mjs +2 -2
  90. package/fesm2022/slotted-angular-data-list.mjs.map +1 -1
  91. package/fesm2022/slotted-angular-dialog.mjs +4 -4
  92. package/fesm2022/slotted-angular-dialog.mjs.map +1 -1
  93. package/fesm2022/slotted-angular-drawer.mjs +5 -1
  94. package/fesm2022/slotted-angular-drawer.mjs.map +1 -1
  95. package/fesm2022/slotted-angular-event-calendar.mjs +18 -8
  96. package/fesm2022/slotted-angular-event-calendar.mjs.map +1 -1
  97. package/fesm2022/slotted-angular-filter-bar.mjs +8 -8
  98. package/fesm2022/slotted-angular-filter-bar.mjs.map +1 -1
  99. package/fesm2022/slotted-angular-import-export-center.mjs +1 -1
  100. package/fesm2022/slotted-angular-import-export-center.mjs.map +1 -1
  101. package/fesm2022/slotted-angular-list.mjs +28 -17
  102. package/fesm2022/slotted-angular-list.mjs.map +1 -1
  103. package/fesm2022/slotted-angular-loading-overlay.mjs +2 -2
  104. package/fesm2022/slotted-angular-markdown.mjs +1 -1
  105. package/fesm2022/slotted-angular-markdown.mjs.map +1 -1
  106. package/fesm2022/slotted-angular-multi-select.mjs +32 -27
  107. package/fesm2022/slotted-angular-multi-select.mjs.map +1 -1
  108. package/fesm2022/slotted-angular-notification-center.mjs +1 -1
  109. package/fesm2022/slotted-angular-notification-center.mjs.map +1 -1
  110. package/fesm2022/slotted-angular-number-field.mjs +2 -2
  111. package/fesm2022/slotted-angular-number-field.mjs.map +1 -1
  112. package/fesm2022/slotted-angular-progress-indicator.mjs +6 -6
  113. package/fesm2022/slotted-angular-saved-views.mjs +1 -1
  114. package/fesm2022/slotted-angular-saved-views.mjs.map +1 -1
  115. package/fesm2022/slotted-angular-segmented-control.mjs +25 -5
  116. package/fesm2022/slotted-angular-segmented-control.mjs.map +1 -1
  117. package/fesm2022/slotted-angular-select.mjs +1 -25
  118. package/fesm2022/slotted-angular-select.mjs.map +1 -1
  119. package/fesm2022/slotted-angular-split-button.mjs +4 -4
  120. package/fesm2022/slotted-angular-split-button.mjs.map +1 -1
  121. package/fesm2022/slotted-angular-stat-card.mjs +2 -2
  122. package/fesm2022/slotted-angular-stat-card.mjs.map +1 -1
  123. package/fesm2022/slotted-angular-table.mjs +97 -10
  124. package/fesm2022/slotted-angular-table.mjs.map +1 -1
  125. package/fesm2022/slotted-angular-tabs.mjs +2 -2
  126. package/fesm2022/slotted-angular-tabs.mjs.map +1 -1
  127. package/fesm2022/slotted-angular-toggle-group.mjs +17 -4
  128. package/fesm2022/slotted-angular-toggle-group.mjs.map +1 -1
  129. package/fesm2022/slotted-angular-toggle.mjs +2 -2
  130. package/fesm2022/slotted-angular-toggle.mjs.map +1 -1
  131. package/fesm2022/slotted-angular-tour.mjs +1 -1
  132. package/fesm2022/slotted-angular-tour.mjs.map +1 -1
  133. package/fesm2022/slotted-angular-transfer.mjs +1 -1
  134. package/fesm2022/slotted-angular-transfer.mjs.map +1 -1
  135. package/fesm2022/slotted-angular-upload.mjs +2 -2
  136. package/fesm2022/slotted-angular-wizard.mjs +1 -1
  137. package/fesm2022/slotted-angular-wizard.mjs.map +1 -1
  138. package/package.json +3 -3
  139. package/types/slotted-angular-app-shell.d.ts +6 -0
  140. package/types/slotted-angular-app-shell.d.ts.map +1 -1
  141. package/types/slotted-angular-button-group.d.ts +1 -1
  142. package/types/slotted-angular-button.d.ts +33 -13
  143. package/types/slotted-angular-button.d.ts.map +1 -1
  144. package/types/slotted-angular-chart.d.ts +9 -0
  145. package/types/slotted-angular-chart.d.ts.map +1 -1
  146. package/types/slotted-angular-checkbox.d.ts +7 -1
  147. package/types/slotted-angular-checkbox.d.ts.map +1 -1
  148. package/types/slotted-angular-combobox.d.ts.map +1 -1
  149. package/types/slotted-angular-currency-field.d.ts +25 -3
  150. package/types/slotted-angular-currency-field.d.ts.map +1 -1
  151. package/types/slotted-angular-dashboard-grid.d.ts.map +1 -1
  152. package/types/slotted-angular-data-grid.d.ts.map +1 -1
  153. package/types/slotted-angular-drawer.d.ts.map +1 -1
  154. package/types/slotted-angular-event-calendar.d.ts +9 -2
  155. package/types/slotted-angular-event-calendar.d.ts.map +1 -1
  156. package/types/slotted-angular-list.d.ts +42 -27
  157. package/types/slotted-angular-list.d.ts.map +1 -1
  158. package/types/slotted-angular-multi-select.d.ts +10 -0
  159. package/types/slotted-angular-multi-select.d.ts.map +1 -1
  160. package/types/slotted-angular-segmented-control.d.ts +15 -2
  161. package/types/slotted-angular-segmented-control.d.ts.map +1 -1
  162. package/types/slotted-angular-select.d.ts.map +1 -1
  163. package/types/slotted-angular-split-button.d.ts +2 -2
  164. package/types/slotted-angular-table.d.ts +43 -3
  165. package/types/slotted-angular-table.d.ts.map +1 -1
  166. package/types/slotted-angular-toggle-group.d.ts +8 -2
  167. package/types/slotted-angular-toggle-group.d.ts.map +1 -1
  168. package/types/slotted-angular-toggle.d.ts +1 -1
  169. package/types/slotted-angular-toggle.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"slotted-angular-import-export-center.mjs","sources":["../../import-export-center/src/import-export-center-defaults.ts","../../import-export-center/src/import-export-control.ts","../../import-export-center/src/import-export-center.ts","../../import-export-center/src/job-toasts.ts","../../import-export-center/src/slotted-angular-import-export-center.ts"],"sourcesContent":["import { inject, Injectable, InjectionToken } from '@angular/core';\nimport type { JobFileRole } from '@slotted/core/import-export-center';\n\nexport type ImportExportCenterSize = 'sm' | 'md';\n\nexport type ImportExportCenterLevel = '2' | '3' | '4';\n\nexport type ImportExportCenterGrowing = 'none' | 'button';\n\nexport type ImportExportCenterTimeFormat = 'relative' | 'absolute';\n\nexport type ImportExportCenterStatus = 'ready' | 'error';\n\n/** A press on one of the family's own controls: a pointer, or a key on a focused control. */\nexport type ImportExportPressReason = 'pointer' | 'keyboard';\n\nexport type ImportExportRemoveReason = ImportExportPressReason | 'clear';\n\n/**\n * A request over one of the consumer's facts, carrying the reason and the\n * originating event; `cancel()` refuses it, and a cancelled download or open\n * does not navigate.\n */\nexport interface ImportExportRequest<Reason extends string> {\n readonly reason: Reason;\n readonly event?: Event | undefined;\n readonly cancelled: boolean;\n cancel(): void;\n}\n\nexport interface ImportExportJobRequest extends ImportExportRequest<ImportExportPressReason> {\n readonly key: string;\n}\n\nexport interface ImportExportRemoveRequest extends ImportExportRequest<ImportExportRemoveReason> {\n readonly keys: readonly string[];\n}\n\nexport interface ImportExportDownloadRequest extends ImportExportRequest<ImportExportPressReason> {\n readonly key: string;\n /** Which of the job's files: the original, the result, or the report of failed rows. */\n readonly file: JobFileRole;\n}\n\nexport interface ImportExportView {\n readonly value: string;\n readonly label: string;\n}\n\nexport interface ImportExportCenterDefaults {\n growing: ImportExportCenterGrowing;\n level: ImportExportCenterLevel;\n size: ImportExportCenterSize;\n timeFormat: ImportExportCenterTimeFormat;\n timeZone?: string | undefined;\n}\n\nconst FALLBACK: ImportExportCenterDefaults = {\n growing: 'none',\n level: '2',\n size: 'md',\n timeFormat: 'relative',\n};\n\nexport const IMPORT_EXPORT_CENTER_DEFAULTS = new InjectionToken<ImportExportCenterDefaults>(\n 'slotted import-export-center defaults',\n { providedIn: 'root', factory: () => FALLBACK },\n);\n\n/**\n * An application decides once how its job centre reads — the size, the rank,\n * how history loads, how time is written and in which zone. A centre that\n * states any of them still wins. Its words and the locale come from the\n * language in force (`provideSlotted`).\n */\nexport function provideImportExportCenterDefaults(defaults: Partial<ImportExportCenterDefaults>) {\n return {\n provide: IMPORT_EXPORT_CENTER_DEFAULTS,\n useFactory: (): ImportExportCenterDefaults => ({ ...FALLBACK, ...defaults }),\n };\n}\n\nexport function injectImportExportCenterDefaults(): ImportExportCenterDefaults {\n return inject(IMPORT_EXPORT_CENTER_DEFAULTS);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SlImportExportCenterIdFactory {\n private count = 0;\n\n next() {\n this.count += 1;\n return `slotted-import-export-center-${this.count}`;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n provideTooltipDefaults,\n SlTooltip,\n SlTooltipContent,\n SlTooltipLayer,\n} from '@slotted/angular/tooltip';\n\n/**\n * The family's one icon control, named by a tooltip with the words its\n * accessible name carries: a cross with no words beside it is a control\n * nobody can tell apart until it is named. The job's title describes it, and\n * the tooltip's own content joins that description while it is open.\n */\n@Component({\n selector: 'button[slImportExportControl]',\n standalone: true,\n imports: [SlTooltipLayer, SlTooltipContent],\n template: `<ng-content /><ng-template slTooltipLayer>\n <div slTooltipContent>{{ text() }}</div>\n </ng-template>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n hostDirectives: [SlTooltip],\n providers: [provideTooltipDefaults({ openOn: 'hover', side: 'bottom' })],\n host: {\n type: 'button',\n '[attr.aria-label]': 'text()',\n '[attr.aria-describedby]': 'describedByValue()',\n '(pointerenter)': 'onPointerEnter($event)',\n '(pointerleave)': 'onPointerLeave($event)',\n '(pointerdown)': 'onPointerDown($event)',\n '(pointerup)': 'onPointerUp()',\n '(pointercancel)': 'onPointerUp()',\n '(focus)': 'onFocus($event)',\n '(blur)': 'onBlur($event)',\n },\n})\nexport class SlImportExportControl {\n readonly text = input.required<string>();\n /** The id of the element that says which job the control acts on. */\n readonly describedBy = input<string | undefined>(undefined);\n\n private readonly tooltip = inject(SlTooltip);\n private readonly native: HTMLElement = inject(ElementRef).nativeElement;\n\n constructor() {\n this.tooltip.triggerNode.set(this.native);\n inject(DestroyRef).onDestroy(() => this.tooltip.triggerNode.set(null));\n }\n\n protected readonly describedByValue = computed(() => {\n const ids = [this.describedBy(), this.tooltip.isOpen() ? this.tooltip.contentId : undefined];\n const joined = ids.filter((id): id is string => id !== undefined).join(' ');\n return joined === '' ? null : joined;\n });\n\n protected onPointerEnter(event: PointerEvent) {\n if (event.pointerType === 'touch') return;\n this.tooltip.openAfterDelay(event);\n }\n\n protected onPointerLeave(event: PointerEvent) {\n this.tooltip.closeAfterDelay(event);\n }\n\n protected onPointerDown(event: PointerEvent) {\n if (event.pointerType === 'touch') this.tooltip.pressAndHold(event);\n else if (this.tooltip.isOpen()) this.tooltip.toggle(false, 'pointer', event);\n }\n\n protected onPointerUp() {\n this.tooltip.cancelPending();\n }\n\n protected onFocus(event: FocusEvent) {\n if (!this.native.matches(':focus-visible')) return;\n this.tooltip.toggle(true, 'keyboard', event);\n }\n\n protected onBlur(event: FocusEvent) {\n if (this.tooltip.isOpen()) this.tooltip.toggle(false, 'blur', event);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n effect,\n ElementRef,\n HostAttributeToken,\n inject,\n input,\n model,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { SlButton, SlButtonEnd, SlButtonLink } from '@slotted/angular/button';\nimport { injectLocale, injectMessages } from '@slotted/angular/i18n';\nimport { SlGlyph, SlIcon } from '@slotted/angular/icon';\nimport type { GlyphName } from '@slotted/angular/icon';\nimport { SlProgressBar } from '@slotted/angular/progress-indicator';\nimport {\n SlResultState,\n SlResultStateActions,\n SlResultStateContent,\n SlResultStateDescription,\n SlResultStateTitle,\n} from '@slotted/angular/result-state';\nimport { SlSkeleton, SlSkeletonText } from '@slotted/angular/skeleton';\nimport {\n SlTable,\n SlTableBody,\n SlTableCaption,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n} from '@slotted/angular/table';\nimport { SlTab, SlTabList, SlTabs } from '@slotted/angular/tabs';\nimport {\n activeJobCount,\n fileAvailability,\n filterJobs,\n focusDestination,\n hasDetails,\n isFinishedJob,\n jobAnnouncement,\n jobControls,\n jobGlyph,\n jobOutcome,\n jobProgressText,\n jobStatusText,\n jobSummaryText,\n jobTransition,\n remainingSeconds,\n} from '@slotted/core/import-export-center';\nimport type {\n FocusableJob,\n FocusMemory,\n ImportExportJob,\n JobControls,\n JobCounts,\n JobFile,\n JobFileRole,\n ProgressSample,\n} from '@slotted/core/import-export-center';\nimport {\n importExportCenterMessages,\n type ImportExportCenterMessages,\n type PartialMessages,\n} from '@slotted/core/i18n';\nimport { getLiveAnnouncer } from '@slotted/core/live-announcer';\nimport { createControllable } from '@slotted/core/state';\nimport type { ChangeReason, ChangeRequest } from '@slotted/core/state';\nimport { formatTimestamp } from '@slotted/core/timeline';\nimport type { FormattedTimestamp, TimestampValue } from '@slotted/core/timeline';\nimport { fileKind, formatBytes, splitName } from '@slotted/core/upload';\nimport type { FileKind } from '@slotted/core/upload';\n\nimport {\n injectImportExportCenterDefaults,\n SlImportExportCenterIdFactory,\n type ImportExportCenterGrowing,\n type ImportExportCenterLevel,\n type ImportExportCenterSize,\n type ImportExportCenterStatus,\n type ImportExportCenterTimeFormat,\n type ImportExportDownloadRequest,\n type ImportExportJobRequest,\n type ImportExportPressReason,\n type ImportExportRemoveRequest,\n type ImportExportRequest,\n type ImportExportView,\n} from './import-export-center-defaults';\nimport { SlImportExportControl } from './import-export-control';\n\n/** The mark of a file's kind, the drawing `upload` puts in the same tile. */\nconst KIND_GLYPH: Record<FileKind, GlyphName> = {\n pdf: 'file-text',\n document: 'file-type',\n spreadsheet: 'file-spreadsheet',\n presentation: 'presentation',\n image: 'file-image',\n video: 'file-video',\n audio: 'file-audio',\n archive: 'file-archive',\n other: 'file',\n};\n\n/** The parts focus can rest on in a job, in the order they are drawn. */\nconst FOCUSABLE_PARTS = ['job-title', 'download', 'retry', 'cancel', 'toggle', 'remove'] as const;\n\nconst WAITING_ROWS = [0, 1, 2];\n\nconst SAMPLE_LIMIT = 12;\n\nconst COUNT_KEYS = ['total', 'processed', 'created', 'updated', 'skipped', 'failed'] as const;\n\n/** A deadline is a date: day, month and time, in every time format. */\nconst DEADLINE: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n};\n\nfunction createRequest<Reason extends string>(\n reason: Reason,\n event: Event | undefined,\n): ImportExportRequest<Reason> {\n let cancelled = false;\n return {\n reason,\n event,\n get cancelled() {\n return cancelled;\n },\n cancel() {\n cancelled = true;\n },\n };\n}\n\n/** A click with no coordinates is a key. */\nfunction pressReason(event: Event): ImportExportPressReason {\n return (event as MouseEvent).detail === 0 ? 'keyboard' : 'pointer';\n}\n\nfunction escapeKey(key: string): string {\n return key.replace(/[^\\w-]/g, (character) => `-${character.charCodeAt(0).toString(16)}-`);\n}\n\nfunction sameKeys(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((key, index) => key === b[index]);\n}\n\n/** What a job's own actions template is handed. */\nexport interface ImportExportJobContext {\n $implicit: ImportExportJob;\n}\n\n/** One row of a job's files, resolved for the template. */\ninterface FileRow {\n role: JobFileRole;\n label: string;\n file: JobFile;\n stem: string;\n extension: string;\n size: string | null;\n note: string | null;\n downloadable: boolean;\n availability: string;\n}\n\n/** Everything the template draws for one job, resolved once per render. */\ninterface JobView {\n job: ImportExportJob;\n ids: {\n title: string;\n status: string;\n toggle: string;\n details: string;\n control: (part: string) => string;\n };\n outcome: string | null;\n controls: JobControls;\n ordered: readonly string[];\n removable: boolean;\n expanded: boolean;\n kind: FileKind;\n kindGlyph: GlyphName;\n directionText: string;\n mark: GlyphName | 'spinner';\n file: { stem: string; extension: string; size: string | null } | null;\n time: FormattedTimestamp | null;\n statusText: string;\n progressText: readonly string[];\n summary: readonly string[];\n message: string | null;\n downloadFile: JobFile | null;\n downloadLabel: string;\n retryLabel: string;\n counts: readonly { key: string; label: string; value: string }[];\n files: readonly FileRow[];\n errorNote: string | null;\n}\n\n/**\n * The consumer's own controls for one job, after the family's.\n *\n * ```html\n * <ng-template slImportExportJobActions let-job>\n * <a slButtonLink size=\"sm\" variant=\"ghost\" [href]=\"'/jobs/' + job.key\">Abrir</a>\n * </ng-template>\n * ```\n */\n@Directive({ selector: 'ng-template[slImportExportJobActions]', standalone: true })\nexport class SlImportExportJobActions {\n readonly template = inject(TemplateRef<ImportExportJobContext>);\n}\n\n/** The consumer's controls in the header: an import dialog's trigger, an export button. */\n@Directive({\n selector: '[slImportExportCenterActions]',\n standalone: true,\n host: { 'data-part': 'actions' },\n})\nexport class SlImportExportCenterActions {}\n\n/** Replaces the view's empty page. */\n@Directive({ selector: '[slImportExportCenterEmpty]', standalone: true })\nexport class SlImportExportCenterEmpty {}\n\n/** The consumer's footer: the link from a popover to the whole page. */\n@Directive({\n selector: '[slImportExportCenterFooter]',\n standalone: true,\n host: { 'data-part': 'footer' },\n})\nexport class SlImportExportCenterFooter {}\n\n/**\n * The jobs an application runs away from the page — imports and exports —\n * and what the reader can do about each.\n *\n * **It holds none of the facts.** `jobs` is the consumer's array. Cancelling,\n * retrying, removing, downloading, opening and loading are outputs with a\n * reason, and the store answers by changing the array. The family never\n * opens a connection and never transfers a byte: `upload` does, in the\n * import dialog the consumer projects into the actions slot.\n *\n * **Two values move:** `[(view)]` and `[(expanded)]`, each with a request\n * output that carries the reason and can be cancelled.\n *\n * **What a job offers is one table,** `jobControls` in\n * `@slotted/core/import-export-center`, which the React binding renders too.\n *\n * **Focus never falls to the body.** A job that finishes while focus is on\n * Cancel keeps focus in the job; a job that leaves takes focus to the same\n * control of the job in its place.\n */\n@Component({\n selector: 'section[slImportExportCenter]',\n standalone: true,\n imports: [\n NgTemplateOutlet,\n SlButton,\n SlButtonEnd,\n SlButtonLink,\n SlGlyph,\n SlIcon,\n SlImportExportControl,\n SlProgressBar,\n SlResultState,\n SlResultStateActions,\n SlResultStateContent,\n SlResultStateDescription,\n SlResultStateTitle,\n SlSkeleton,\n SlSkeletonText,\n SlTab,\n SlTabList,\n SlTable,\n SlTableBody,\n SlTableCaption,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTabs,\n ],\n template: `\n <div data-part=\"header\">\n @switch (levelValue()) {\n @case ('3') {\n <h3 data-part=\"title\" [id]=\"titleId\">\n {{ t('title') }}\n @if (active() > 0) {\n <span data-part=\"count\">{{ t('active', { count: active() }) }}</span>\n }\n </h3>\n }\n @case ('4') {\n <h4 data-part=\"title\" [id]=\"titleId\">\n {{ t('title') }}\n @if (active() > 0) {\n <span data-part=\"count\">{{ t('active', { count: active() }) }}</span>\n }\n </h4>\n }\n @default {\n <h2 data-part=\"title\" [id]=\"titleId\">\n {{ t('title') }}\n @if (active() > 0) {\n <span data-part=\"count\">{{ t('active', { count: active() }) }}</span>\n }\n </h2>\n }\n }\n <div data-part=\"tools\">\n @if (finished().length > 0) {\n <span data-part=\"clear\">\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"ghost\"\n type=\"button\"\n (click)=\"clear($event)\"\n >\n {{ t('clear') }}\n </button>\n </span>\n }\n <ng-content select=\"[slImportExportCenterActions]\" />\n </div>\n </div>\n @if (viewList().length > 1) {\n <div data-part=\"views\">\n <div\n slTabs\n track=\"none\"\n [size]=\"sizeValue()\"\n [value]=\"currentView()\"\n (valueChange)=\"forwardView($event)\"\n >\n <div slTabList [attr.aria-label]=\"t('views')\">\n @for (entry of viewList(); track entry.value) {\n <div slTab [value]=\"entry.value\" [controls]=\"listId\">{{ entry.label }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (status() === 'error') {\n <div data-part=\"error\">\n <section slResultState reach=\"section\" status=\"error\" live=\"off\">\n <div slResultStateContent>\n <div slResultStateTitle>{{ t('loadError') }}</div>\n <p slResultStateDescription>{{ t('loadErrorDescription') }}</p>\n </div>\n <div slResultStateActions>\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"outline\"\n type=\"button\"\n (click)=\"reload($event)\"\n >\n {{ t('reload') }}\n </button>\n </div>\n </section>\n </div>\n } @else if (showEmpty()) {\n <div data-part=\"empty\">\n <ng-content select=\"[slImportExportCenterEmpty]\">\n <section slResultState reach=\"section\" status=\"empty\" live=\"off\">\n <div slResultStateContent>\n <div slResultStateTitle>{{ emptyTitle() }}</div>\n <p slResultStateDescription>{{ t('emptyDescription') }}</p>\n </div>\n </section>\n </ng-content>\n </div>\n } @else {\n <ul\n #list\n data-part=\"list\"\n tabindex=\"-1\"\n [id]=\"listId\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (focusin)=\"rememberFocus($event)\"\n >\n @if (waiting()) {\n @for (row of waitingRows; track row) {\n <li data-part=\"job\" aria-hidden=\"true\">\n <span data-part=\"visual\"><span slSkeleton shape=\"block\"></span></span>\n <div data-part=\"body\">\n <span slSkeletonText [lines]=\"2\"></span>\n <span slSkeletonText [lines]=\"1\"></span>\n </div>\n </li>\n }\n } @else {\n @for (view of jobViews(); track view.job.key) {\n <ng-container\n [ngTemplateOutlet]=\"jobTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: view }\"\n />\n }\n }\n </ul>\n }\n @if (status() !== 'error' && growingValue() === 'button' && hasMore() && !waiting()) {\n <button\n data-part=\"more\"\n type=\"button\"\n [attr.aria-disabled]=\"loading() ? 'true' : null\"\n [attr.data-loading]=\"loading() ? '' : null\"\n (click)=\"loadMore($event)\"\n >\n {{ loading() ? t('loading') : t('loadMore') }}\n </button>\n }\n <ng-content select=\"[slImportExportCenterFooter]\" />\n\n <ng-template #fileName let-stem=\"stem\" let-extension=\"extension\">\n <span data-part=\"file-name\" dir=\"auto\"\n ><span data-part=\"name\">{{ stem }}</span>\n @if (extension !== '') {\n <span data-part=\"extension\">{{ extension }}</span>\n }\n </span>\n </ng-template>\n\n <ng-template\n #download\n let-view=\"view\"\n let-file=\"file\"\n let-role=\"role\"\n let-label=\"label\"\n let-primary=\"primary\"\n >\n <span data-part=\"download\">\n @if (file.href === undefined) {\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n type=\"button\"\n [variant]=\"primary ? 'outline' : 'ghost'\"\n [attr.id]=\"primary ? view.ids.control('download') : null\"\n [attr.aria-labelledby]=\"\n primary ? view.ids.control('download') + ' ' + view.ids.title : null\n \"\n [attr.aria-describedby]=\"primary ? view.ids.status : null\"\n (click)=\"askDownload(view.job.key, role, $event)\"\n >\n {{ label }}\n </button>\n } @else {\n <a\n slButtonLink\n size=\"sm\"\n tone=\"secondary\"\n [variant]=\"primary ? 'outline' : 'ghost'\"\n [href]=\"file.href\"\n [attr.download]=\"file.name\"\n [attr.id]=\"primary ? view.ids.control('download') : null\"\n [attr.aria-labelledby]=\"\n primary ? view.ids.control('download') + ' ' + view.ids.title : null\n \"\n [attr.aria-describedby]=\"primary ? view.ids.status : null\"\n (click)=\"askDownload(view.job.key, role, $event)\"\n >{{ label }}</a\n >\n }\n </span>\n </ng-template>\n\n <ng-template #jobTemplate let-view>\n <li\n data-part=\"job\"\n [attr.data-key]=\"view.job.key\"\n [attr.data-direction]=\"view.job.direction\"\n [attr.data-status]=\"view.job.status\"\n [attr.data-outcome]=\"view.outcome\"\n [attr.data-expired]=\"view.controls.expired ? '' : null\"\n [attr.data-expanded]=\"view.expanded ? '' : null\"\n >\n <span data-part=\"visual\" aria-hidden=\"true\" [attr.data-kind]=\"view.kind\"\n ><span slIcon><svg slGlyph [name]=\"view.kindGlyph\"></svg></span\n ></span>\n <div data-part=\"body\">\n <div data-part=\"heading\">\n @if (view.job.href === undefined) {\n <span data-part=\"job-title\" tabindex=\"-1\" [id]=\"view.ids.title\">{{\n view.job.title\n }}</span>\n } @else {\n <a\n data-part=\"job-title\"\n [id]=\"view.ids.title\"\n [attr.href]=\"view.job.href\"\n (click)=\"open(view.job.key, $event)\"\n >{{ view.job.title }}</a\n >\n }\n <p data-part=\"meta\">\n <span>{{ view.directionText }}</span>\n @if (view.job.format !== undefined) {\n <span>{{ view.job.format }}</span>\n }\n @if (view.file !== null) {\n <span\n ><ng-container\n [ngTemplateOutlet]=\"fileName\"\n [ngTemplateOutletContext]=\"{\n stem: view.file.stem,\n extension: view.file.extension,\n }\"\n /></span>\n @if (view.file.size !== null) {\n <span>{{ view.file.size }}</span>\n }\n }\n @if (view.job.actor !== undefined) {\n <span>{{ view.job.actor }}</span>\n }\n @if (view.time !== null) {\n <time\n data-part=\"time\"\n [attr.datetime]=\"view.time.dateTime\"\n [attr.title]=\"view.time.title\"\n >{{ view.time.text }}</time\n >\n }\n </p>\n </div>\n <div data-part=\"status\" [id]=\"view.ids.status\">\n <span data-part=\"mark\" aria-hidden=\"true\">\n @if (view.mark === 'spinner') {\n <span data-ui=\"spinner\"></span>\n } @else {\n <span slIcon><svg slGlyph [name]=\"view.mark\"></svg></span>\n }\n </span>\n <span data-part=\"status-label\"\n ><span>{{ view.statusText }}</span>\n @if (view.job.stage) {\n <span data-part=\"stage\" [attr.title]=\"view.job.stage\">{{ view.job.stage }}</span>\n }\n </span>\n </div>\n @if (view.job.status === 'running') {\n <div data-part=\"progress\">\n <div\n slProgressBar\n hideLabel\n size=\"sm\"\n tone=\"accent\"\n [delay]=\"0\"\n [label]=\"view.job.title\"\n [max]=\"view.job.progress?.max ?? 100\"\n [value]=\"view.job.progress?.value ?? null\"\n [valueText]=\"\n view.progressText.length > 0 ? view.progressText.join(', ') : undefined\n \"\n ></div>\n @if (view.progressText.length > 0) {\n <span data-part=\"progress-text\">\n @for (item of view.progressText; track item) {\n <span>{{ item }}</span>\n }\n </span>\n }\n </div>\n }\n @if (view.summary.length > 0) {\n <p data-part=\"summary\">\n @for (item of view.summary; track item) {\n <span>{{ item }}</span>\n }\n </p>\n }\n @if (view.message !== null) {\n <p data-part=\"message\">{{ view.message }}</p>\n }\n </div>\n @if (view.ordered.length > 0 || view.removable || jobActionsTemplate()) {\n <div data-part=\"controls\">\n @for (part of view.ordered; track part) {\n @switch (part) {\n @case ('download') {\n @if (view.downloadFile !== null) {\n <ng-container\n [ngTemplateOutlet]=\"download\"\n [ngTemplateOutletContext]=\"{\n view,\n file: view.downloadFile,\n role: view.controls.download,\n label: view.downloadLabel,\n primary: true,\n }\"\n />\n }\n }\n @case ('toggle') {\n <span data-part=\"toggle\" [attr.data-expanded]=\"view.expanded ? '' : null\">\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"ghost\"\n type=\"button\"\n [id]=\"view.ids.toggle\"\n [attr.aria-expanded]=\"view.expanded ? 'true' : 'false'\"\n [attr.aria-controls]=\"view.ids.details\"\n [attr.aria-labelledby]=\"view.ids.toggle + ' ' + view.ids.title\"\n (click)=\"toggle(view.job.key, pressReason($event), $event)\"\n >\n {{ t('details') }}\n <span slButtonEnd\n ><span data-part=\"chevron\"\n ><span slIcon><svg slGlyph name=\"chevron-down\"></svg></span></span\n ></span>\n </button>\n </span>\n }\n @default {\n <span [attr.data-part]=\"part\">\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"outline\"\n type=\"button\"\n [id]=\"view.ids.control(part)\"\n [attr.aria-labelledby]=\"view.ids.control(part) + ' ' + view.ids.title\"\n [attr.aria-describedby]=\"view.ids.status\"\n (click)=\"press(part, view.job.key, $event)\"\n >\n {{ part === 'cancel' ? t('cancel') : view.retryLabel }}\n </button>\n </span>\n }\n }\n }\n @if (jobActionsTemplate(); as own) {\n <span data-part=\"job-actions\"\n ><ng-container\n [ngTemplateOutlet]=\"own.template\"\n [ngTemplateOutletContext]=\"{ $implicit: view.job }\"\n /></span>\n }\n @if (view.removable) {\n <button\n slImportExportControl\n data-part=\"remove\"\n [text]=\"t('remove')\"\n [describedBy]=\"view.ids.title\"\n (click)=\"removeOne(view.job.key, $event)\"\n >\n <span slIcon><svg slGlyph name=\"x\"></svg></span>\n </button>\n }\n </div>\n }\n @if (view.expanded) {\n <div\n data-part=\"details\"\n role=\"region\"\n [id]=\"view.ids.details\"\n [attr.aria-labelledby]=\"view.ids.toggle\"\n >\n @if (view.counts.length > 0) {\n <dl data-part=\"counts\">\n @for (count of view.counts; track count.key) {\n <div [attr.data-count]=\"count.key\">\n <dt>{{ count.label }}</dt>\n <dd>{{ count.value }}</dd>\n </div>\n }\n </dl>\n }\n @if (view.files.length > 0) {\n <ul data-part=\"files\">\n @for (row of view.files; track row.role) {\n <li data-part=\"file\" [attr.data-availability]=\"row.availability\">\n <span data-part=\"meta\">\n <strong>{{ row.label }}</strong>\n <span\n ><ng-container\n [ngTemplateOutlet]=\"fileName\"\n [ngTemplateOutletContext]=\"{ stem: row.stem, extension: row.extension }\"\n /></span>\n @if (row.size !== null) {\n <span>{{ row.size }}</span>\n }\n @if (row.note !== null) {\n <span>{{ row.note }}</span>\n }\n </span>\n @if (row.downloadable) {\n <ng-container\n [ngTemplateOutlet]=\"download\"\n [ngTemplateOutletContext]=\"{\n view,\n file: row.file,\n role: row.role,\n label: t('download'),\n primary: false,\n }\"\n />\n }\n </li>\n }\n </ul>\n }\n @if ((view.job.errors?.length ?? 0) > 0) {\n <div data-part=\"errors\">\n <div slTable variant=\"framed\" [columns]=\"4\">\n <div slTableContent>\n <caption slTableCaption>\n {{\n t('errorsCaption')\n }}\n </caption>\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader numeric>{{ t('errorColumns.row') }}</th>\n <th slTableColumnHeader>{{ t('errorColumns.message') }}</th>\n <th slTableColumnHeader>{{ t('errorColumns.column') }}</th>\n <th slTableColumnHeader>{{ t('errorColumns.value') }}</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (error of view.job.errors; track $index) {\n <tr slTableRow>\n <td slTableCell numeric>{{ formatCount(error.row) }}</td>\n <td slTableCell>{{ error.message }}</td>\n <td slTableCell>{{ error.column ?? '' }}</td>\n <td slTableCell>{{ error.value ?? '' }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n @if (view.errorNote !== null) {\n <p data-part=\"errors-note\">\n <span>{{ view.errorNote }}</span>\n </p>\n }\n </div>\n }\n </div>\n }\n </li>\n </ng-template>\n `,\n styleUrl: '../../../styles/src/import-export-center/import-export-center.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'slImportExportCenter',\n host: {\n 'data-ui': 'import-export-center',\n 'data-part': 'root',\n '[attr.data-size]': 'sizeValue()',\n '[attr.data-level]': 'levelValue()',\n '[attr.data-growing]': 'growingValue()',\n '[attr.data-time-format]': 'timeFormatValue()',\n '[attr.data-view]': 'currentView()',\n '[attr.data-loading]': \"loading() ? '' : null\",\n '[attr.data-status]': \"status() === 'error' ? 'error' : null\",\n '[attr.aria-labelledby]': 'labelledBy()',\n },\n})\nexport class SlImportExportCenter {\n /** The consumer's jobs, in the order they are drawn. The family changes none of them. */\n readonly jobs = input.required<readonly ImportExportJob[]>();\n /** The strip's entries. `all`, `import` and `export` when unstated; one entry draws no strip. */\n readonly views = input<readonly ImportExportView[] | undefined>(undefined);\n readonly size = input<ImportExportCenterSize | undefined>(undefined);\n readonly level = input<ImportExportCenterLevel | undefined>(undefined);\n readonly growing = input<ImportExportCenterGrowing | undefined>(undefined);\n readonly timeFormat = input<ImportExportCenterTimeFormat | undefined>(undefined);\n /** What numbers, sizes, times and deadlines are written in. Absent, the language in force. */\n readonly locale = input<string | undefined>(undefined);\n readonly timeZone = input<string | undefined>(undefined);\n /** The moment a relative reading and a deadline count from. State it for a stable server render. */\n readonly now = input<number | undefined>(undefined);\n readonly loading = input(false, { transform: booleanAttribute });\n readonly status = input<ImportExportCenterStatus>('ready');\n /** Whether the history has another page; `growing=\"button\"` draws `more` while it has. */\n readonly hasMore = input(false, { transform: booleanAttribute });\n /** Words laid over the catalog of the language in force, key by key. */\n readonly messages = input<PartialMessages<ImportExportCenterMessages> | undefined>(undefined);\n /** The view an unbound centre starts on, read once. */\n readonly defaultView = input<string | undefined>(undefined);\n /** The keys an unbound centre starts with shown, read once. */\n readonly defaultExpanded = input<readonly string[] | undefined>(undefined);\n /** The current view. Two-way. */\n readonly view = model<string | undefined>(undefined);\n /** The keys whose details are shown. Two-way. */\n readonly expanded = model<readonly string[] | undefined>(undefined);\n\n readonly viewRequest = output<ChangeRequest<string | undefined>>();\n readonly expandedRequest = output<ChangeRequest<readonly string[] | undefined>>();\n readonly cancelRequest = output<ImportExportJobRequest>();\n readonly retryRequest = output<ImportExportJobRequest>();\n readonly removeRequest = output<ImportExportRemoveRequest>();\n /** Asked before a download. With an `href` the link navigates unless cancelled; without one the consumer produces the file. */\n readonly downloadRequest = output<ImportExportDownloadRequest>();\n /** Asked before the title's link navigates to the job's page; cancellable. */\n readonly openRequest = output<ImportExportJobRequest>();\n readonly loadMoreRequest = output<ImportExportRequest<ImportExportPressReason>>();\n readonly reloadRequest = output<ImportExportRequest<ImportExportPressReason>>();\n\n private readonly defaults = injectImportExportCenterDefaults();\n private readonly native: HTMLElement = inject(ElementRef).nativeElement;\n private readonly writtenLabel = inject(new HostAttributeToken('aria-label'), { optional: true });\n private readonly writtenLabelledBy = inject(new HostAttributeToken('aria-labelledby'), {\n optional: true,\n });\n private readonly listElement = viewChild<ElementRef<HTMLUListElement>>('list');\n protected readonly jobActionsTemplate = contentChild(SlImportExportJobActions);\n\n readonly id = inject(SlImportExportCenterIdFactory).next();\n readonly titleId = `${this.id}-title`;\n readonly listId = `${this.id}-list`;\n protected readonly waitingRows = WAITING_ROWS;\n protected readonly pressReason = pressReason;\n\n readonly sizeValue = computed(() => this.size() ?? this.defaults.size);\n readonly levelValue = computed(() => this.level() ?? this.defaults.level);\n readonly growingValue = computed(() => this.growing() ?? this.defaults.growing);\n readonly timeFormatValue = computed(() => this.timeFormat() ?? this.defaults.timeFormat);\n private readonly contextLocale = injectLocale();\n readonly localeValue = computed(() => this.locale() ?? this.contextLocale());\n readonly timeZoneValue = computed(() => this.timeZone() ?? this.defaults.timeZone);\n /** The family's words in the language in force, with this centre's `messages` laid over them. */\n readonly t = injectMessages(importExportCenterMessages, this.messages);\n\n protected readonly labelledBy = computed(() =>\n this.writtenLabel !== null ? null : (this.writtenLabelledBy ?? this.titleId),\n );\n\n readonly viewList = computed<readonly ImportExportView[]>(\n () =>\n this.views() ?? [\n { label: this.t('all'), value: 'all' },\n { label: this.t('imports'), value: 'import' },\n { label: this.t('exports'), value: 'export' },\n ],\n );\n\n /** The view: the model, then defaultView, then the first entry. */\n readonly currentView = computed(\n () => this.view() ?? this.defaultView() ?? this.viewList()[0]?.value ?? 'all',\n );\n\n /** The shown keys: the model, then defaultExpanded. */\n readonly currentExpanded = computed<readonly string[]>(\n () => this.expanded() ?? this.defaultExpanded() ?? [],\n );\n\n readonly visibleJobs = computed(() => filterJobs(this.jobs(), this.currentView()));\n readonly active = computed(() => activeJobCount(this.jobs()));\n readonly finished = computed(() =>\n this.visibleJobs().filter((job) => isFinishedJob(job) && job.removable !== false),\n );\n readonly waiting = computed(() => this.loading() && this.visibleJobs().length === 0);\n readonly showEmpty = computed(() => !this.waiting() && this.visibleJobs().length === 0);\n readonly emptyTitle = computed(() => {\n const view = this.currentView();\n return view === 'import'\n ? this.t('emptyImports')\n : view === 'export'\n ? this.t('emptyExports')\n : this.t('empty');\n });\n\n private readonly remaining = signal<ReadonlyMap<string, number | null>>(new Map());\n private readonly samples = new Map<string, ProgressSample[]>();\n\n readonly jobViews = computed<readonly JobView[]>(() => {\n const expanded = new Set(this.currentExpanded());\n return this.visibleJobs().map((job) => this.viewOf(job, expanded));\n });\n\n private memory: (FocusMemory & { element: HTMLElement }) | null = null;\n private revealing: string | null = null;\n private previous: ReadonlyMap<string, ImportExportJob> | null = null;\n\n constructor() {\n /* A transition of a shown job is announced once; the first render is not. */\n effect(() => {\n const jobs = this.jobs();\n untracked(() => {\n const seen = this.previous;\n this.previous = new Map(jobs.map((job) => [job.key, job]));\n if (seen === null) return;\n for (const job of jobs) {\n const transition = jobTransition(seen.get(job.key), job);\n if (transition !== null) {\n getLiveAnnouncer().announce(jobAnnouncement(transition, job, this.t));\n }\n }\n });\n });\n\n /* The time left: samples of the progress the family has seen, and the server's eta first. */\n effect(() => {\n const jobs = this.jobs();\n const now = this.now() ?? Date.now();\n const timeZone = this.timeZoneValue();\n untracked(() => {\n const next = new Map<string, number | null>();\n for (const job of jobs) {\n if (job.status !== 'running') {\n this.samples.delete(job.key);\n continue;\n }\n const value = job.progress?.value;\n const max = job.progress?.max;\n const list = this.samples.get(job.key) ?? [];\n if (value !== undefined && max !== undefined && list.at(-1)?.value !== value) {\n list.push({ at: Date.now(), max, value });\n if (list.length > SAMPLE_LIMIT) list.shift();\n this.samples.set(job.key, list);\n }\n next.set(job.key, remainingSeconds(job, list, { now, timeZone }));\n }\n this.remaining.set(next);\n });\n });\n\n /* A key that left the jobs leaves the set. */\n effect(() => {\n const present = new Set(this.jobs().map((job) => job.key));\n untracked(() => {\n const own = this.expanded();\n if (own === undefined) return;\n const kept = own.filter((key) => present.has(key));\n if (kept.length !== own.length) this.expanded.set(kept);\n });\n });\n\n /* After every render: focus that lost its element, and a job being revealed. */\n afterRenderEffect(() => {\n this.jobViews();\n untracked(() => {\n this.restoreFocus();\n this.finishReveal();\n });\n });\n }\n\n /** Focuses the first job's first control, or the list when there is none. */\n focus(): void {\n const list = this.listElement()?.nativeElement;\n const first = list?.querySelector<HTMLElement>(\n ':scope > [data-part=\"job\"] :is(a[data-part=\"job-title\"], [data-part=\"controls\"] button, [data-part=\"controls\"] a)',\n );\n (first ?? list)?.focus();\n }\n\n /** Shows a job's details, scrolls it into view and focuses its title: where a toast's View takes the reader. */\n reveal(key: string): void {\n const job = this.jobs().find((each) => each.key === key);\n if (job === undefined) return;\n const keys = this.currentExpanded();\n if (!keys.includes(key)) this.requestExpanded([...keys, key], 'programmatic', undefined);\n if (filterJobs([job], this.currentView()).length === 0) {\n this.selectView('all', 'programmatic', undefined);\n }\n this.revealing = key;\n }\n\n protected formatCount(value: number): string {\n return new Intl.NumberFormat(this.localeValue()).format(value);\n }\n\n private deadline(value: TimestampValue): string {\n return formatTimestamp(value, {\n absolute: DEADLINE,\n format: 'absolute',\n locale: this.localeValue(),\n timeZone: this.timeZoneValue(),\n }).text;\n }\n\n private viewOf(job: ImportExportJob, expandedKeys: ReadonlySet<string>): JobView {\n const t = this.t;\n const locale = this.localeValue();\n const clock = { now: this.now(), timeZone: this.timeZoneValue() };\n const prefix = `${this.id}-${escapeKey(job.key)}`;\n const ids = {\n control: (part: string) => `${prefix}-${part}`,\n details: `${prefix}-details`,\n status: `${prefix}-status`,\n title: `${prefix}-title`,\n toggle: `${prefix}-toggle`,\n };\n const controls = jobControls(job, clock);\n const kindFile = job.result ?? job.source;\n const kind: FileKind =\n kindFile !== undefined\n ? fileKind({ name: kindFile.name, type: kindFile.type ?? '' })\n : job.format !== undefined\n ? fileKind({ name: `job.${job.format.toLowerCase()}`, type: '' })\n : 'other';\n const shown =\n job.direction === 'export' ? (job.result ?? job.source) : (job.source ?? job.result);\n const when =\n job.status === 'succeeded' || job.status === 'failed'\n ? (job.finishedAt ?? job.createdAt)\n : job.createdAt;\n const counts: JobCounts = job.counts ?? {};\n const count = new Intl.NumberFormat(locale);\n const errors = job.errors ?? [];\n const total = Math.max(job.errorCount ?? 0, errors.length);\n const files: FileRow[] = (\n [\n ['source', job.source],\n ['result', job.result],\n ['errors', job.errorsFile],\n ] as const\n )\n .filter((entry): entry is readonly [JobFileRole, JobFile] => entry[1] !== undefined)\n .map(([role, file]) => {\n const availability = fileAvailability(file, clock);\n const { stem, extension } = splitName(file.name);\n return {\n availability,\n downloadable: availability === 'available' || availability === 'expires',\n extension,\n file,\n label: t(`fileLabels.${role}`),\n note:\n availability === 'denied'\n ? (file.denied ?? null)\n : file.expiresAt === undefined\n ? null\n : availability === 'expired'\n ? t('expired', { date: this.deadline(file.expiresAt) })\n : t('expires', { date: this.deadline(file.expiresAt) }),\n role,\n size: file.size === undefined ? null : formatBytes(file.size, locale),\n stem,\n };\n });\n\n const downloadFile =\n controls.download === 'errors'\n ? (job.errorsFile ?? null)\n : controls.download === 'result'\n ? (job.result ?? null)\n : null;\n const mark = jobGlyph(job);\n\n return {\n controls,\n counts: COUNT_KEYS.filter((name) => typeof counts[name] === 'number').map((name) => ({\n key: name,\n label: t(`countLabels.${name}`),\n value: count.format(counts[name] ?? 0),\n })),\n downloadFile,\n downloadLabel: controls.download === 'errors' ? t('downloadErrors') : t('download'),\n errorNote:\n total > errors.length && errors.length > 0\n ? t('sample', { shown: errors.length, total })\n : null,\n expanded:\n expandedKeys.has(job.key) && controls.controls.includes('toggle') && hasDetails(job),\n file:\n shown === undefined\n ? null\n : {\n ...splitName(shown.name),\n size: shown.size === undefined ? null : formatBytes(shown.size, locale),\n },\n files,\n ids,\n job,\n directionText: t(job.direction),\n kind,\n kindGlyph: KIND_GLYPH[kind],\n mark,\n message: this.messageOf(job, clock),\n ordered: controls.controls.filter((part) => part !== 'remove'),\n outcome: jobOutcome(job),\n progressText:\n job.status === 'running'\n ? jobProgressText(job, {\n locale,\n t,\n remaining: this.remaining().get(job.key),\n })\n : [],\n removable: controls.controls.includes('remove'),\n retryLabel: controls.retry === 'regenerate' ? t('regenerate') : t('retry'),\n statusText: jobStatusText(job, t),\n summary: jobSummaryText(job, { locale, t }),\n time:\n when === undefined\n ? null\n : formatTimestamp(when, {\n format: this.timeFormatValue(),\n locale,\n now: this.now(),\n timeZone: this.timeZoneValue(),\n }),\n };\n }\n\n private messageOf(\n job: ImportExportJob,\n clock: { now: number | undefined; timeZone: string | undefined },\n ): string | null {\n if (job.message !== undefined && job.message !== '') return job.message;\n const result = job.result;\n if (result === undefined) return null;\n const availability = fileAvailability(result, clock);\n if (availability === 'denied') return result.denied ?? null;\n if (result.expiresAt === undefined) return null;\n if (availability === 'expired')\n return this.t('expired', { date: this.deadline(result.expiresAt) });\n if (availability === 'expires')\n return this.t('expires', { date: this.deadline(result.expiresAt) });\n return null;\n }\n\n /* ── The two models ────────────────────────────────────────────────── */\n\n protected forwardView(request: ChangeRequest<string | undefined>) {\n if (request.value === undefined) return;\n this.selectView(request.value, request.reason, request.source);\n }\n\n private selectView(next: string, reason: ChangeReason, source: unknown) {\n if (next === this.currentView()) return;\n let cancelled = false;\n const state = createControllable<string | undefined>({\n initial: this.currentView(),\n onRequest: (request) => {\n this.viewRequest.emit(request);\n cancelled = request.cancelled;\n },\n });\n const moved = state.request(next, reason, source);\n /* The model is the state: written once the request is accepted, which is\n what `[(view)]` binds and what an unbound centre keeps. */\n if (!cancelled && moved) this.view.set(next);\n }\n\n private requestExpanded(next: readonly string[], reason: ChangeReason, source: unknown) {\n if (sameKeys(next, this.currentExpanded())) return;\n let cancelled = false;\n const state = createControllable<readonly string[] | undefined>({\n equals: (a, b) => sameKeys(a ?? [], b ?? []),\n initial: this.currentExpanded(),\n onRequest: (request) => {\n this.expandedRequest.emit(request);\n cancelled = request.cancelled;\n },\n });\n const moved = state.request(next, reason, source);\n if (!cancelled && moved) this.expanded.set(next);\n }\n\n protected toggle(key: string, reason: ImportExportPressReason, event: Event) {\n const keys = this.currentExpanded();\n this.requestExpanded(\n keys.includes(key) ? keys.filter((each) => each !== key) : [...keys, key],\n reason,\n event,\n );\n }\n\n /* ── Requests ──────────────────────────────────────────────────────── */\n\n protected press(part: string, key: string, event: Event) {\n const request = Object.assign(createRequest(pressReason(event), event), { key });\n (part === 'cancel' ? this.cancelRequest : this.retryRequest).emit(request);\n }\n\n protected removeOne(key: string, event: Event) {\n this.removeRequest.emit(\n Object.assign(createRequest(pressReason(event), event), { keys: [key] }),\n );\n }\n\n protected clear(event: Event) {\n this.removeRequest.emit(\n Object.assign(createRequest('clear' as const, event), {\n keys: this.finished().map((job) => job.key),\n }),\n );\n }\n\n protected askDownload(key: string, file: JobFileRole, event: Event) {\n const request = Object.assign(createRequest(pressReason(event), event), { file, key });\n this.downloadRequest.emit(request);\n if (request.cancelled) event.preventDefault();\n }\n\n protected open(key: string, event: Event) {\n const request = Object.assign(createRequest(pressReason(event), event), { key });\n this.openRequest.emit(request);\n if (request.cancelled) event.preventDefault();\n }\n\n protected loadMore(event: Event) {\n if (this.loading()) return;\n this.loadMoreRequest.emit(createRequest(pressReason(event), event));\n }\n\n protected reload(event: Event) {\n this.reloadRequest.emit(createRequest(pressReason(event), event));\n }\n\n /* ── Focus ─────────────────────────────────────────────────────────── */\n\n protected rememberFocus(event: FocusEvent) {\n const list = this.listElement()?.nativeElement;\n const target = event.target as HTMLElement | null;\n const job = target?.closest<HTMLElement>('[data-part=\"job\"]') ?? null;\n if (list === undefined || target === null || job === null || !list.contains(job)) {\n this.memory = null;\n return;\n }\n const all = [...list.querySelectorAll<HTMLElement>(':scope > [data-part=\"job\"]')];\n let part = 'job-title';\n for (\n let node: HTMLElement | null = target;\n node !== null && node !== job;\n node = node.parentElement\n ) {\n const name = node.dataset['part'];\n if (name !== undefined && (FOCUSABLE_PARTS as readonly string[]).includes(name)) {\n part = name;\n break;\n }\n }\n this.memory = { element: target, index: all.indexOf(job), key: job.dataset['key'] ?? '', part };\n }\n\n private focusPart(list: HTMLElement, key: string, part: string) {\n const job = list.querySelector<HTMLElement>(\n `:scope > [data-part=\"job\"][data-key=\"${CSS.escape(key)}\"]`,\n );\n const holder = job?.querySelector<HTMLElement>(`[data-part=\"${part}\"]`) ?? null;\n const target =\n holder === null\n ? null\n : holder.matches('button, a, [tabindex]')\n ? holder\n : holder.querySelector<HTMLElement>('button, a');\n target?.focus();\n }\n\n private restoreFocus() {\n const kept = this.memory;\n const list = this.listElement()?.nativeElement;\n if (kept === null || list === undefined || kept.element.isConnected) return;\n const active = list.ownerDocument.activeElement;\n if (active !== null && active !== list.ownerDocument.body) return;\n const drawn: FocusableJob[] = [\n ...list.querySelectorAll<HTMLElement>(':scope > [data-part=\"job\"][data-key]'),\n ].map((job) => ({\n key: job.dataset['key'] ?? '',\n parts: FOCUSABLE_PARTS.filter(\n (part) => part !== 'job-title' && job.querySelector(`[data-part=\"${part}\"]`) !== null,\n ),\n }));\n const destination = focusDestination(kept, drawn);\n this.memory = null;\n if ('list' in destination) list.focus();\n else this.focusPart(list, destination.key, destination.part);\n }\n\n private finishReveal() {\n const key = this.revealing;\n const list = this.listElement()?.nativeElement;\n if (key === null || list === undefined) return;\n this.revealing = null;\n const job = list.querySelector<HTMLElement>(\n `:scope > [data-part=\"job\"][data-key=\"${CSS.escape(key)}\"]`,\n );\n if (job === null) return;\n job.scrollIntoView?.({ block: 'nearest' });\n job.querySelector<HTMLElement>('[data-part=\"job-title\"]')?.focus({ preventScroll: true });\n }\n\n /** The element the family renders on: the region a consumer's ref reaches. */\n get element(): HTMLElement {\n return this.native;\n }\n}\n","import { effect, inject, signal, untracked } from '@angular/core';\nimport type { Signal, TemplateRef } from '@angular/core';\nimport { injectMessages } from '@slotted/angular/i18n';\nimport { SlToastService } from '@slotted/angular/toast';\nimport type { ToastContent, ToastMessage } from '@slotted/angular/toast';\nimport {\n importExportCenterMessages,\n type ImportExportCenterMessages,\n type PartialMessages,\n} from '@slotted/core/i18n';\nimport { jobNotice } from '@slotted/core/import-export-center';\nimport type { ImportExportJob } from '@slotted/core/import-export-center';\n\nexport interface JobToastsOptions {\n /**\n * The toast's View control, written by the consumer and rendered per\n * message. A function — a `viewChild` signal — is read when a toast is\n * shown, so a template that exists only after the view is created still\n * reaches it. The message's `data` carries `{ key }`, and `noticeKey(message.id)`\n * from `@slotted/core/import-export-center` reads the same key back.\n */\n actions?:\n | TemplateRef<{ $implicit: ToastMessage<ToastContent> }>\n | (() => TemplateRef<{ $implicit: ToastMessage<ToastContent> }> | undefined)\n | undefined;\n /** Words laid over the catalog of the language in force: the announcement a toast carries. */\n messages?: PartialMessages<ImportExportCenterMessages> | undefined;\n}\n\n/** What a notice's toast carries in `data`: the job it points at. */\nexport interface JobToastData {\n readonly key: string;\n}\n\n/**\n * A toast that points at a job, for a page that is not the centre: the job\n * started, finished, finished with failed rows, failed. Called once in an\n * injection context where the application keeps its jobs — the shell — so\n * the reader hears of a job that finishes while they work elsewhere.\n *\n * The toast only points. It carries no progress, no cancel and no download;\n * its one action is the consumer's View, which takes the reader to the centre\n * and calls its `reveal(key)`. Its id is the job's key under\n * `import-export-center:`, so the finishing notice replaces the starting one\n * in place. Its announcement is the sentence the centre says for the same\n * transition, which the shared announcer does not repeat when both are\n * mounted. The jobs present the first time the signal is read made no move\n * the reader saw, and get no toast.\n */\nexport function jobToasts(\n jobs: Signal<readonly ImportExportJob[]>,\n { actions, messages }: JobToastsOptions = {},\n): void {\n const toasts = inject(SlToastService);\n const t = injectMessages(importExportCenterMessages, signal(messages));\n let previous: ReadonlyMap<string, ImportExportJob> | null = null;\n\n effect(() => {\n const current = jobs();\n untracked(() => {\n const seen = previous;\n previous = new Map(current.map((job) => [job.key, job]));\n if (seen === null) return;\n for (const job of current) {\n const notice = jobNotice(seen.get(job.key), job, t);\n if (notice === null) continue;\n const template = typeof actions === 'function' ? actions() : actions;\n toasts.show({\n ...(template === undefined ? {} : { actions: template }),\n announcement: notice.title,\n data: { key: notice.key } satisfies JobToastData,\n description: notice.description,\n id: notice.id,\n loading: notice.loading,\n title: notice.title,\n tone: notice.tone,\n });\n }\n });\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slotted-angular-import-export-center.mjs","sources":["../../import-export-center/src/import-export-center-defaults.ts","../../import-export-center/src/import-export-control.ts","../../import-export-center/src/import-export-center.ts","../../import-export-center/src/job-toasts.ts","../../import-export-center/src/slotted-angular-import-export-center.ts"],"sourcesContent":["import { inject, Injectable, InjectionToken } from '@angular/core';\nimport type { JobFileRole } from '@slotted/core/import-export-center';\n\nexport type ImportExportCenterSize = 'sm' | 'md';\n\nexport type ImportExportCenterLevel = '2' | '3' | '4';\n\nexport type ImportExportCenterGrowing = 'none' | 'button';\n\nexport type ImportExportCenterTimeFormat = 'relative' | 'absolute';\n\nexport type ImportExportCenterStatus = 'ready' | 'error';\n\n/** A press on one of the family's own controls: a pointer, or a key on a focused control. */\nexport type ImportExportPressReason = 'pointer' | 'keyboard';\n\nexport type ImportExportRemoveReason = ImportExportPressReason | 'clear';\n\n/**\n * A request over one of the consumer's facts, carrying the reason and the\n * originating event; `cancel()` refuses it, and a cancelled download or open\n * does not navigate.\n */\nexport interface ImportExportRequest<Reason extends string> {\n readonly reason: Reason;\n readonly event?: Event | undefined;\n readonly cancelled: boolean;\n cancel(): void;\n}\n\nexport interface ImportExportJobRequest extends ImportExportRequest<ImportExportPressReason> {\n readonly key: string;\n}\n\nexport interface ImportExportRemoveRequest extends ImportExportRequest<ImportExportRemoveReason> {\n readonly keys: readonly string[];\n}\n\nexport interface ImportExportDownloadRequest extends ImportExportRequest<ImportExportPressReason> {\n readonly key: string;\n /** Which of the job's files: the original, the result, or the report of failed rows. */\n readonly file: JobFileRole;\n}\n\nexport interface ImportExportView {\n readonly value: string;\n readonly label: string;\n}\n\nexport interface ImportExportCenterDefaults {\n growing: ImportExportCenterGrowing;\n level: ImportExportCenterLevel;\n size: ImportExportCenterSize;\n timeFormat: ImportExportCenterTimeFormat;\n timeZone?: string | undefined;\n}\n\nconst FALLBACK: ImportExportCenterDefaults = {\n growing: 'none',\n level: '2',\n size: 'md',\n timeFormat: 'relative',\n};\n\nexport const IMPORT_EXPORT_CENTER_DEFAULTS = new InjectionToken<ImportExportCenterDefaults>(\n 'slotted import-export-center defaults',\n { providedIn: 'root', factory: () => FALLBACK },\n);\n\n/**\n * An application decides once how its job centre reads — the size, the rank,\n * how history loads, how time is written and in which zone. A centre that\n * states any of them still wins. Its words and the locale come from the\n * language in force (`provideSlotted`).\n */\nexport function provideImportExportCenterDefaults(defaults: Partial<ImportExportCenterDefaults>) {\n return {\n provide: IMPORT_EXPORT_CENTER_DEFAULTS,\n useFactory: (): ImportExportCenterDefaults => ({ ...FALLBACK, ...defaults }),\n };\n}\n\nexport function injectImportExportCenterDefaults(): ImportExportCenterDefaults {\n return inject(IMPORT_EXPORT_CENTER_DEFAULTS);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SlImportExportCenterIdFactory {\n private count = 0;\n\n next() {\n this.count += 1;\n return `slotted-import-export-center-${this.count}`;\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n provideTooltipDefaults,\n SlTooltip,\n SlTooltipContent,\n SlTooltipLayer,\n} from '@slotted/angular/tooltip';\n\n/**\n * The family's one icon control, named by a tooltip with the words its\n * accessible name carries: a cross with no words beside it is a control\n * nobody can tell apart until it is named. The job's title describes it, and\n * the tooltip's own content joins that description while it is open.\n */\n@Component({\n selector: 'button[slImportExportControl]',\n standalone: true,\n imports: [SlTooltipLayer, SlTooltipContent],\n template: `<ng-content /><ng-template slTooltipLayer>\n <div slTooltipContent>{{ text() }}</div>\n </ng-template>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n hostDirectives: [SlTooltip],\n providers: [provideTooltipDefaults({ openOn: 'hover', side: 'bottom' })],\n host: {\n type: 'button',\n '[attr.aria-label]': 'text()',\n '[attr.aria-describedby]': 'describedByValue()',\n '(pointerenter)': 'onPointerEnter($event)',\n '(pointerleave)': 'onPointerLeave($event)',\n '(pointerdown)': 'onPointerDown($event)',\n '(pointerup)': 'onPointerUp()',\n '(pointercancel)': 'onPointerUp()',\n '(focus)': 'onFocus($event)',\n '(blur)': 'onBlur($event)',\n },\n})\nexport class SlImportExportControl {\n readonly text = input.required<string>();\n /** The id of the element that says which job the control acts on. */\n readonly describedBy = input<string | undefined>(undefined);\n\n private readonly tooltip = inject(SlTooltip);\n private readonly native: HTMLElement = inject(ElementRef).nativeElement;\n\n constructor() {\n this.tooltip.triggerNode.set(this.native);\n inject(DestroyRef).onDestroy(() => this.tooltip.triggerNode.set(null));\n }\n\n protected readonly describedByValue = computed(() => {\n const ids = [this.describedBy(), this.tooltip.isOpen() ? this.tooltip.contentId : undefined];\n const joined = ids.filter((id): id is string => id !== undefined).join(' ');\n return joined === '' ? null : joined;\n });\n\n protected onPointerEnter(event: PointerEvent) {\n if (event.pointerType === 'touch') return;\n this.tooltip.openAfterDelay(event);\n }\n\n protected onPointerLeave(event: PointerEvent) {\n this.tooltip.closeAfterDelay(event);\n }\n\n protected onPointerDown(event: PointerEvent) {\n if (event.pointerType === 'touch') this.tooltip.pressAndHold(event);\n else if (this.tooltip.isOpen()) this.tooltip.toggle(false, 'pointer', event);\n }\n\n protected onPointerUp() {\n this.tooltip.cancelPending();\n }\n\n protected onFocus(event: FocusEvent) {\n if (!this.native.matches(':focus-visible')) return;\n this.tooltip.toggle(true, 'keyboard', event);\n }\n\n protected onBlur(event: FocusEvent) {\n if (this.tooltip.isOpen()) this.tooltip.toggle(false, 'blur', event);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterRenderEffect,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n Directive,\n effect,\n ElementRef,\n HostAttributeToken,\n inject,\n input,\n model,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { SlButton, SlButtonEnd, SlButtonLink } from '@slotted/angular/button';\nimport { injectLocale, injectMessages } from '@slotted/angular/i18n';\nimport { SlGlyph, SlIcon } from '@slotted/angular/icon';\nimport type { GlyphName } from '@slotted/angular/icon';\nimport { SlProgressBar } from '@slotted/angular/progress-indicator';\nimport {\n SlResultState,\n SlResultStateActions,\n SlResultStateContent,\n SlResultStateDescription,\n SlResultStateTitle,\n} from '@slotted/angular/result-state';\nimport { SlSkeleton, SlSkeletonText } from '@slotted/angular/skeleton';\nimport {\n SlTable,\n SlTableBody,\n SlTableCaption,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n} from '@slotted/angular/table';\nimport { SlTab, SlTabList, SlTabs } from '@slotted/angular/tabs';\nimport {\n activeJobCount,\n fileAvailability,\n filterJobs,\n focusDestination,\n hasDetails,\n isFinishedJob,\n jobAnnouncement,\n jobControls,\n jobGlyph,\n jobOutcome,\n jobProgressText,\n jobStatusText,\n jobSummaryText,\n jobTransition,\n remainingSeconds,\n} from '@slotted/core/import-export-center';\nimport type {\n FocusableJob,\n FocusMemory,\n ImportExportJob,\n JobControls,\n JobCounts,\n JobFile,\n JobFileRole,\n ProgressSample,\n} from '@slotted/core/import-export-center';\nimport {\n importExportCenterMessages,\n type ImportExportCenterMessages,\n type PartialMessages,\n} from '@slotted/core/i18n';\nimport { getLiveAnnouncer } from '@slotted/core/live-announcer';\nimport { createControllable } from '@slotted/core/state';\nimport type { ChangeReason, ChangeRequest } from '@slotted/core/state';\nimport { formatTimestamp } from '@slotted/core/timeline';\nimport type { FormattedTimestamp, TimestampValue } from '@slotted/core/timeline';\nimport { fileKind, formatBytes, splitName } from '@slotted/core/upload';\nimport type { FileKind } from '@slotted/core/upload';\n\nimport {\n injectImportExportCenterDefaults,\n SlImportExportCenterIdFactory,\n type ImportExportCenterGrowing,\n type ImportExportCenterLevel,\n type ImportExportCenterSize,\n type ImportExportCenterStatus,\n type ImportExportCenterTimeFormat,\n type ImportExportDownloadRequest,\n type ImportExportJobRequest,\n type ImportExportPressReason,\n type ImportExportRemoveRequest,\n type ImportExportRequest,\n type ImportExportView,\n} from './import-export-center-defaults';\nimport { SlImportExportControl } from './import-export-control';\n\n/** The mark of a file's kind, the drawing `upload` puts in the same tile. */\nconst KIND_GLYPH: Record<FileKind, GlyphName> = {\n pdf: 'file-text',\n document: 'file-type',\n spreadsheet: 'file-spreadsheet',\n presentation: 'presentation',\n image: 'file-image',\n video: 'file-video',\n audio: 'file-audio',\n archive: 'file-archive',\n other: 'file',\n};\n\n/** The parts focus can rest on in a job, in the order they are drawn. */\nconst FOCUSABLE_PARTS = ['job-title', 'download', 'retry', 'cancel', 'toggle', 'remove'] as const;\n\nconst WAITING_ROWS = [0, 1, 2];\n\nconst SAMPLE_LIMIT = 12;\n\nconst COUNT_KEYS = ['total', 'processed', 'created', 'updated', 'skipped', 'failed'] as const;\n\n/** A deadline is a date: day, month and time, in every time format. */\nconst DEADLINE: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n};\n\nfunction createRequest<Reason extends string>(\n reason: Reason,\n event: Event | undefined,\n): ImportExportRequest<Reason> {\n let cancelled = false;\n return {\n reason,\n event,\n get cancelled() {\n return cancelled;\n },\n cancel() {\n cancelled = true;\n },\n };\n}\n\n/** A click with no coordinates is a key. */\nfunction pressReason(event: Event): ImportExportPressReason {\n return (event as MouseEvent).detail === 0 ? 'keyboard' : 'pointer';\n}\n\nfunction escapeKey(key: string): string {\n return key.replace(/[^\\w-]/g, (character) => `-${character.charCodeAt(0).toString(16)}-`);\n}\n\nfunction sameKeys(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((key, index) => key === b[index]);\n}\n\n/** What a job's own actions template is handed. */\nexport interface ImportExportJobContext {\n $implicit: ImportExportJob;\n}\n\n/** One row of a job's files, resolved for the template. */\ninterface FileRow {\n role: JobFileRole;\n label: string;\n file: JobFile;\n stem: string;\n extension: string;\n size: string | null;\n note: string | null;\n downloadable: boolean;\n availability: string;\n}\n\n/** Everything the template draws for one job, resolved once per render. */\ninterface JobView {\n job: ImportExportJob;\n ids: {\n title: string;\n status: string;\n toggle: string;\n details: string;\n control: (part: string) => string;\n };\n outcome: string | null;\n controls: JobControls;\n ordered: readonly string[];\n removable: boolean;\n expanded: boolean;\n kind: FileKind;\n kindGlyph: GlyphName;\n directionText: string;\n mark: GlyphName | 'spinner';\n file: { stem: string; extension: string; size: string | null } | null;\n time: FormattedTimestamp | null;\n statusText: string;\n progressText: readonly string[];\n summary: readonly string[];\n message: string | null;\n downloadFile: JobFile | null;\n downloadLabel: string;\n retryLabel: string;\n counts: readonly { key: string; label: string; value: string }[];\n files: readonly FileRow[];\n errorNote: string | null;\n}\n\n/**\n * The consumer's own controls for one job, after the family's.\n *\n * ```html\n * <ng-template slImportExportJobActions let-job>\n * <a slButtonLink size=\"sm\" variant=\"ghost\" [href]=\"'/jobs/' + job.key\">Abrir</a>\n * </ng-template>\n * ```\n */\n@Directive({ selector: 'ng-template[slImportExportJobActions]', standalone: true })\nexport class SlImportExportJobActions {\n readonly template = inject(TemplateRef<ImportExportJobContext>);\n}\n\n/** The consumer's controls in the header: an import dialog's trigger, an export button. */\n@Directive({\n selector: '[slImportExportCenterActions]',\n standalone: true,\n host: { 'data-part': 'actions' },\n})\nexport class SlImportExportCenterActions {}\n\n/** Replaces the view's empty page. */\n@Directive({ selector: '[slImportExportCenterEmpty]', standalone: true })\nexport class SlImportExportCenterEmpty {}\n\n/** The consumer's footer: the link from a popover to the whole page. */\n@Directive({\n selector: '[slImportExportCenterFooter]',\n standalone: true,\n host: { 'data-part': 'footer' },\n})\nexport class SlImportExportCenterFooter {}\n\n/**\n * The jobs an application runs away from the page — imports and exports —\n * and what the reader can do about each.\n *\n * **It holds none of the facts.** `jobs` is the consumer's array. Cancelling,\n * retrying, removing, downloading, opening and loading are outputs with a\n * reason, and the store answers by changing the array. The family never\n * opens a connection and never transfers a byte: `upload` does, in the\n * import dialog the consumer projects into the actions slot.\n *\n * **Two values move:** `[(view)]` and `[(expanded)]`, each with a request\n * output that carries the reason and can be cancelled.\n *\n * **What a job offers is one table,** `jobControls` in\n * `@slotted/core/import-export-center`, which the React binding renders too.\n *\n * **Focus never falls to the body.** A job that finishes while focus is on\n * Cancel keeps focus in the job; a job that leaves takes focus to the same\n * control of the job in its place.\n */\n@Component({\n selector: 'section[slImportExportCenter]',\n standalone: true,\n imports: [\n NgTemplateOutlet,\n SlButton,\n SlButtonEnd,\n SlButtonLink,\n SlGlyph,\n SlIcon,\n SlImportExportControl,\n SlProgressBar,\n SlResultState,\n SlResultStateActions,\n SlResultStateContent,\n SlResultStateDescription,\n SlResultStateTitle,\n SlSkeleton,\n SlSkeletonText,\n SlTab,\n SlTabList,\n SlTable,\n SlTableBody,\n SlTableCaption,\n SlTableCell,\n SlTableColumnHeader,\n SlTableContent,\n SlTableHead,\n SlTableRow,\n SlTabs,\n ],\n template: `\n <div data-part=\"header\">\n @switch (levelValue()) {\n @case ('3') {\n <h3 data-part=\"title\" [id]=\"titleId\">\n {{ t('title') }}\n @if (active() > 0) {\n <span data-part=\"count\">{{ t('active', { count: active() }) }}</span>\n }\n </h3>\n }\n @case ('4') {\n <h4 data-part=\"title\" [id]=\"titleId\">\n {{ t('title') }}\n @if (active() > 0) {\n <span data-part=\"count\">{{ t('active', { count: active() }) }}</span>\n }\n </h4>\n }\n @default {\n <h2 data-part=\"title\" [id]=\"titleId\">\n {{ t('title') }}\n @if (active() > 0) {\n <span data-part=\"count\">{{ t('active', { count: active() }) }}</span>\n }\n </h2>\n }\n }\n <div data-part=\"tools\">\n @if (finished().length > 0) {\n <span data-part=\"clear\">\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"ghost\"\n type=\"button\"\n (click)=\"clear($event)\"\n >\n {{ t('clear') }}\n </button>\n </span>\n }\n <ng-content select=\"[slImportExportCenterActions]\" />\n </div>\n </div>\n @if (viewList().length > 1) {\n <div data-part=\"views\">\n <div\n slTabs\n track=\"none\"\n [size]=\"sizeValue()\"\n [value]=\"currentView()\"\n (valueChange)=\"forwardView($event)\"\n >\n <div slTabList [attr.aria-label]=\"t('views')\">\n @for (entry of viewList(); track entry.value) {\n <div slTab [value]=\"entry.value\" [controls]=\"listId\">{{ entry.label }}</div>\n }\n </div>\n </div>\n </div>\n }\n @if (status() === 'error') {\n <div data-part=\"error\">\n <section slResultState reach=\"section\" status=\"error\" live=\"off\">\n <div slResultStateContent>\n <div slResultStateTitle>{{ t('loadError') }}</div>\n <p slResultStateDescription>{{ t('loadErrorDescription') }}</p>\n </div>\n <div slResultStateActions>\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"outline\"\n type=\"button\"\n (click)=\"reload($event)\"\n >\n {{ t('reload') }}\n </button>\n </div>\n </section>\n </div>\n } @else if (showEmpty()) {\n <div data-part=\"empty\">\n <ng-content select=\"[slImportExportCenterEmpty]\">\n <section slResultState reach=\"section\" status=\"empty\" live=\"off\">\n <div slResultStateContent>\n <div slResultStateTitle>{{ emptyTitle() }}</div>\n <p slResultStateDescription>{{ t('emptyDescription') }}</p>\n </div>\n </section>\n </ng-content>\n </div>\n } @else {\n <ul\n #list\n data-part=\"list\"\n tabindex=\"-1\"\n [id]=\"listId\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-busy]=\"loading() ? 'true' : null\"\n (focusin)=\"rememberFocus($event)\"\n >\n @if (waiting()) {\n @for (row of waitingRows; track row) {\n <li data-part=\"job\" aria-hidden=\"true\">\n <span data-part=\"visual\"><span slSkeleton shape=\"block\"></span></span>\n <div data-part=\"body\">\n <span slSkeletonText [lines]=\"2\"></span>\n <span slSkeletonText [lines]=\"1\"></span>\n </div>\n </li>\n }\n } @else {\n @for (view of jobViews(); track view.job.key) {\n <ng-container\n [ngTemplateOutlet]=\"jobTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: view }\"\n />\n }\n }\n </ul>\n }\n @if (status() !== 'error' && growingValue() === 'button' && hasMore() && !waiting()) {\n <button\n data-part=\"more\"\n type=\"button\"\n [attr.aria-disabled]=\"loading() ? 'true' : null\"\n [attr.data-loading]=\"loading() ? '' : null\"\n (click)=\"loadMore($event)\"\n >\n {{ loading() ? t('loading') : t('loadMore') }}\n </button>\n }\n <ng-content select=\"[slImportExportCenterFooter]\" />\n\n <ng-template #fileName let-stem=\"stem\" let-extension=\"extension\">\n <span data-part=\"file-name\" dir=\"auto\"\n ><span data-part=\"name\">{{ stem }}</span>\n @if (extension !== '') {\n <span data-part=\"extension\">{{ extension }}</span>\n }\n </span>\n </ng-template>\n\n <ng-template\n #download\n let-view=\"view\"\n let-file=\"file\"\n let-role=\"role\"\n let-label=\"label\"\n let-primary=\"primary\"\n >\n <span data-part=\"download\">\n @if (file.href === undefined) {\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n type=\"button\"\n [variant]=\"primary ? 'outline' : 'ghost'\"\n [attr.id]=\"primary ? view.ids.control('download') : null\"\n [attr.aria-labelledby]=\"\n primary ? view.ids.control('download') + ' ' + view.ids.title : null\n \"\n [attr.aria-describedby]=\"primary ? view.ids.status : null\"\n (click)=\"askDownload(view.job.key, role, $event)\"\n >\n {{ label }}\n </button>\n } @else {\n <a\n slButtonLink\n size=\"sm\"\n tone=\"secondary\"\n [variant]=\"primary ? 'outline' : 'ghost'\"\n [href]=\"file.href\"\n [attr.download]=\"file.name\"\n [attr.id]=\"primary ? view.ids.control('download') : null\"\n [attr.aria-labelledby]=\"\n primary ? view.ids.control('download') + ' ' + view.ids.title : null\n \"\n [attr.aria-describedby]=\"primary ? view.ids.status : null\"\n (click)=\"askDownload(view.job.key, role, $event)\"\n >{{ label }}</a\n >\n }\n </span>\n </ng-template>\n\n <ng-template #jobTemplate let-view>\n <li\n data-part=\"job\"\n [attr.data-key]=\"view.job.key\"\n [attr.data-direction]=\"view.job.direction\"\n [attr.data-status]=\"view.job.status\"\n [attr.data-outcome]=\"view.outcome\"\n [attr.data-expired]=\"view.controls.expired ? '' : null\"\n [attr.data-expanded]=\"view.expanded ? '' : null\"\n >\n <span data-part=\"visual\" aria-hidden=\"true\" [attr.data-kind]=\"view.kind\"\n ><span slIcon><svg slGlyph [name]=\"view.kindGlyph\"></svg></span\n ></span>\n <div data-part=\"body\">\n <div data-part=\"heading\">\n @if (view.job.href === undefined) {\n <span data-part=\"job-title\" tabindex=\"-1\" [id]=\"view.ids.title\">{{\n view.job.title\n }}</span>\n } @else {\n <a\n data-part=\"job-title\"\n [id]=\"view.ids.title\"\n [attr.href]=\"view.job.href\"\n (click)=\"open(view.job.key, $event)\"\n >{{ view.job.title }}</a\n >\n }\n <p data-part=\"meta\">\n <span>{{ view.directionText }}</span>\n @if (view.job.format !== undefined) {\n <span>{{ view.job.format }}</span>\n }\n @if (view.file !== null) {\n <span\n ><ng-container\n [ngTemplateOutlet]=\"fileName\"\n [ngTemplateOutletContext]=\"{\n stem: view.file.stem,\n extension: view.file.extension,\n }\"\n /></span>\n @if (view.file.size !== null) {\n <span>{{ view.file.size }}</span>\n }\n }\n @if (view.job.actor !== undefined) {\n <span>{{ view.job.actor }}</span>\n }\n @if (view.time !== null) {\n <time\n data-part=\"time\"\n [attr.datetime]=\"view.time.dateTime\"\n [attr.title]=\"view.time.title\"\n >{{ view.time.text }}</time\n >\n }\n </p>\n </div>\n <div data-part=\"status\" [id]=\"view.ids.status\">\n <span data-part=\"mark\" aria-hidden=\"true\">\n @if (view.mark === 'spinner') {\n <span data-ui=\"spinner\"></span>\n } @else {\n <span slIcon><svg slGlyph [name]=\"view.mark\"></svg></span>\n }\n </span>\n <span data-part=\"status-label\"\n ><span>{{ view.statusText }}</span>\n @if (view.job.stage) {\n <span data-part=\"stage\" [attr.title]=\"view.job.stage\">{{ view.job.stage }}</span>\n }\n </span>\n </div>\n @if (view.job.status === 'running') {\n <div data-part=\"progress\">\n <div\n slProgressBar\n hideLabel\n size=\"sm\"\n tone=\"accent\"\n [delay]=\"0\"\n [label]=\"view.job.title\"\n [max]=\"view.job.progress?.max ?? 100\"\n [value]=\"view.job.progress?.value ?? null\"\n [valueText]=\"\n view.progressText.length > 0 ? view.progressText.join(', ') : undefined\n \"\n ></div>\n @if (view.progressText.length > 0) {\n <span data-part=\"progress-text\">\n @for (item of view.progressText; track item) {\n <span>{{ item }}</span>\n }\n </span>\n }\n </div>\n }\n @if (view.summary.length > 0) {\n <p data-part=\"summary\">\n @for (item of view.summary; track item) {\n <span>{{ item }}</span>\n }\n </p>\n }\n @if (view.message !== null) {\n <p data-part=\"message\">{{ view.message }}</p>\n }\n </div>\n @if (view.ordered.length > 0 || view.removable || jobActionsTemplate()) {\n <div data-part=\"controls\">\n @for (part of view.ordered; track part) {\n @switch (part) {\n @case ('download') {\n @if (view.downloadFile !== null) {\n <ng-container\n [ngTemplateOutlet]=\"download\"\n [ngTemplateOutletContext]=\"{\n view,\n file: view.downloadFile,\n role: view.controls.download,\n label: view.downloadLabel,\n primary: true,\n }\"\n />\n }\n }\n @case ('toggle') {\n <span data-part=\"toggle\" [attr.data-expanded]=\"view.expanded ? '' : null\">\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"ghost\"\n type=\"button\"\n [id]=\"view.ids.toggle\"\n [attr.aria-expanded]=\"view.expanded ? 'true' : 'false'\"\n [attr.aria-controls]=\"view.ids.details\"\n [attr.aria-labelledby]=\"view.ids.toggle + ' ' + view.ids.title\"\n (click)=\"toggle(view.job.key, pressReason($event), $event)\"\n >\n {{ t('details') }}\n <span slButtonEnd\n ><span data-part=\"chevron\"\n ><span slIcon><svg slGlyph name=\"chevron-down\"></svg></span></span\n ></span>\n </button>\n </span>\n }\n @default {\n <span [attr.data-part]=\"part\">\n <button\n slButton\n size=\"sm\"\n tone=\"secondary\"\n variant=\"outline\"\n type=\"button\"\n [id]=\"view.ids.control(part)\"\n [attr.aria-labelledby]=\"view.ids.control(part) + ' ' + view.ids.title\"\n [attr.aria-describedby]=\"view.ids.status\"\n (click)=\"press(part, view.job.key, $event)\"\n >\n {{ part === 'cancel' ? t('cancel') : view.retryLabel }}\n </button>\n </span>\n }\n }\n }\n @if (jobActionsTemplate(); as own) {\n <span data-part=\"job-actions\"\n ><ng-container\n [ngTemplateOutlet]=\"own.template\"\n [ngTemplateOutletContext]=\"{ $implicit: view.job }\"\n /></span>\n }\n @if (view.removable) {\n <button\n slImportExportControl\n data-part=\"remove\"\n [text]=\"t('remove')\"\n [describedBy]=\"view.ids.title\"\n (click)=\"removeOne(view.job.key, $event)\"\n >\n <span slIcon><svg slGlyph name=\"x\"></svg></span>\n </button>\n }\n </div>\n }\n @if (view.expanded) {\n <div\n data-part=\"details\"\n role=\"region\"\n [id]=\"view.ids.details\"\n [attr.aria-labelledby]=\"view.ids.toggle\"\n >\n @if (view.counts.length > 0) {\n <dl data-part=\"counts\">\n @for (count of view.counts; track count.key) {\n <div [attr.data-count]=\"count.key\">\n <dt>{{ count.label }}</dt>\n <dd>{{ count.value }}</dd>\n </div>\n }\n </dl>\n }\n @if (view.files.length > 0) {\n <ul data-part=\"files\">\n @for (row of view.files; track row.role) {\n <li data-part=\"file\" [attr.data-availability]=\"row.availability\">\n <span data-part=\"meta\">\n <strong>{{ row.label }}</strong>\n <span\n ><ng-container\n [ngTemplateOutlet]=\"fileName\"\n [ngTemplateOutletContext]=\"{ stem: row.stem, extension: row.extension }\"\n /></span>\n @if (row.size !== null) {\n <span>{{ row.size }}</span>\n }\n @if (row.note !== null) {\n <span>{{ row.note }}</span>\n }\n </span>\n @if (row.downloadable) {\n <ng-container\n [ngTemplateOutlet]=\"download\"\n [ngTemplateOutletContext]=\"{\n view,\n file: row.file,\n role: row.role,\n label: t('download'),\n primary: false,\n }\"\n />\n }\n </li>\n }\n </ul>\n }\n @if ((view.job.errors?.length ?? 0) > 0) {\n <div data-part=\"errors\">\n <div slTable variant=\"framed\" [columns]=\"4\">\n <div slTableContent>\n <caption slTableCaption>\n {{\n t('errorsCaption')\n }}\n </caption>\n <thead slTableHead>\n <tr slTableRow>\n <th slTableColumnHeader numeric>{{ t('errorColumns.row') }}</th>\n <th slTableColumnHeader>{{ t('errorColumns.message') }}</th>\n <th slTableColumnHeader>{{ t('errorColumns.column') }}</th>\n <th slTableColumnHeader>{{ t('errorColumns.value') }}</th>\n </tr>\n </thead>\n <tbody slTableBody>\n @for (error of view.job.errors; track $index) {\n <tr slTableRow>\n <td slTableCell numeric>{{ formatCount(error.row) }}</td>\n <td slTableCell>{{ error.message }}</td>\n <td slTableCell>{{ error.column ?? '' }}</td>\n <td slTableCell>{{ error.value ?? '' }}</td>\n </tr>\n }\n </tbody>\n </div>\n </div>\n @if (view.errorNote !== null) {\n <p data-part=\"errors-note\">\n <span>{{ view.errorNote }}</span>\n </p>\n }\n </div>\n }\n </div>\n }\n </li>\n </ng-template>\n `,\n styleUrl: '../../../styles/src/import-export-center/import-export-center.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'slImportExportCenter',\n host: {\n 'data-ui': 'import-export-center',\n 'data-part': 'root',\n '[attr.data-size]': 'sizeValue()',\n '[attr.data-level]': 'levelValue()',\n '[attr.data-growing]': 'growingValue()',\n '[attr.data-time-format]': 'timeFormatValue()',\n '[attr.data-view]': 'currentView()',\n '[attr.data-loading]': \"loading() ? '' : null\",\n '[attr.data-status]': \"status() === 'error' ? 'error' : null\",\n '[attr.aria-labelledby]': 'labelledBy()',\n },\n})\nexport class SlImportExportCenter {\n /** The consumer's jobs, in the order they are drawn. The family changes none of them. */\n readonly jobs = input.required<readonly ImportExportJob[]>();\n /** The strip's entries. `all`, `import` and `export` when unstated; one entry draws no strip. */\n readonly views = input<readonly ImportExportView[] | undefined>(undefined);\n readonly size = input<ImportExportCenterSize | undefined>(undefined);\n readonly level = input<ImportExportCenterLevel | undefined>(undefined);\n readonly growing = input<ImportExportCenterGrowing | undefined>(undefined);\n readonly timeFormat = input<ImportExportCenterTimeFormat | undefined>(undefined);\n /** What numbers, sizes, times and deadlines are written in. Absent, the language in force. */\n readonly locale = input<string | undefined>(undefined);\n readonly timeZone = input<string | undefined>(undefined);\n /** The moment a relative reading and a deadline count from. State it for a stable server render. */\n readonly now = input<number | undefined>(undefined);\n readonly loading = input(false, { transform: booleanAttribute });\n readonly status = input<ImportExportCenterStatus>('ready');\n /** Whether the history has another page; `growing=\"button\"` draws `more` while it has. */\n readonly hasMore = input(false, { transform: booleanAttribute });\n /** Words laid over the catalog of the language in force, key by key. */\n readonly messages = input<PartialMessages<ImportExportCenterMessages> | undefined>(undefined);\n /** The view an unbound centre starts on, read once. */\n readonly defaultView = input<string | undefined>(undefined);\n /** The keys an unbound centre starts with shown, read once. */\n readonly defaultExpanded = input<readonly string[] | undefined>(undefined);\n /** The current view. Two-way. */\n readonly view = model<string | undefined>(undefined);\n /** The keys whose details are shown. Two-way. */\n readonly expanded = model<readonly string[] | undefined>(undefined);\n\n readonly viewRequest = output<ChangeRequest<string | undefined>>();\n readonly expandedRequest = output<ChangeRequest<readonly string[] | undefined>>();\n readonly cancelRequest = output<ImportExportJobRequest>();\n readonly retryRequest = output<ImportExportJobRequest>();\n readonly removeRequest = output<ImportExportRemoveRequest>();\n /** Asked before a download. With an `href` the link navigates unless cancelled; without one the consumer produces the file. */\n readonly downloadRequest = output<ImportExportDownloadRequest>();\n /** Asked before the title's link navigates to the job's page; cancellable. */\n readonly openRequest = output<ImportExportJobRequest>();\n readonly loadMoreRequest = output<ImportExportRequest<ImportExportPressReason>>();\n readonly reloadRequest = output<ImportExportRequest<ImportExportPressReason>>();\n\n private readonly defaults = injectImportExportCenterDefaults();\n private readonly native: HTMLElement = inject(ElementRef).nativeElement;\n private readonly writtenLabel = inject(new HostAttributeToken('aria-label'), { optional: true });\n private readonly writtenLabelledBy = inject(new HostAttributeToken('aria-labelledby'), {\n optional: true,\n });\n private readonly listElement = viewChild<ElementRef<HTMLUListElement>>('list');\n protected readonly jobActionsTemplate = contentChild(SlImportExportJobActions);\n\n readonly id = inject(SlImportExportCenterIdFactory).next();\n readonly titleId = `${this.id}-title`;\n readonly listId = `${this.id}-list`;\n protected readonly waitingRows = WAITING_ROWS;\n protected readonly pressReason = pressReason;\n\n readonly sizeValue = computed(() => this.size() ?? this.defaults.size);\n readonly levelValue = computed(() => this.level() ?? this.defaults.level);\n readonly growingValue = computed(() => this.growing() ?? this.defaults.growing);\n readonly timeFormatValue = computed(() => this.timeFormat() ?? this.defaults.timeFormat);\n private readonly contextLocale = injectLocale();\n readonly localeValue = computed(() => this.locale() ?? this.contextLocale());\n readonly timeZoneValue = computed(() => this.timeZone() ?? this.defaults.timeZone);\n /** The family's words in the language in force, with this centre's `messages` laid over them. */\n readonly t = injectMessages(importExportCenterMessages, this.messages);\n\n protected readonly labelledBy = computed(() =>\n this.writtenLabel !== null ? null : (this.writtenLabelledBy ?? this.titleId),\n );\n\n readonly viewList = computed<readonly ImportExportView[]>(\n () =>\n this.views() ?? [\n { label: this.t('all'), value: 'all' },\n { label: this.t('imports'), value: 'import' },\n { label: this.t('exports'), value: 'export' },\n ],\n );\n\n /** The view: the model, then defaultView, then the first entry. */\n readonly currentView = computed(\n () => this.view() ?? this.defaultView() ?? this.viewList()[0]?.value ?? 'all',\n );\n\n /** The shown keys: the model, then defaultExpanded. */\n readonly currentExpanded = computed<readonly string[]>(\n () => this.expanded() ?? this.defaultExpanded() ?? [],\n );\n\n readonly visibleJobs = computed(() => filterJobs(this.jobs(), this.currentView()));\n readonly active = computed(() => activeJobCount(this.jobs()));\n readonly finished = computed(() =>\n this.visibleJobs().filter((job) => isFinishedJob(job) && job.removable !== false),\n );\n readonly waiting = computed(() => this.loading() && this.visibleJobs().length === 0);\n readonly showEmpty = computed(() => !this.waiting() && this.visibleJobs().length === 0);\n readonly emptyTitle = computed(() => {\n const view = this.currentView();\n return view === 'import'\n ? this.t('emptyImports')\n : view === 'export'\n ? this.t('emptyExports')\n : this.t('empty');\n });\n\n private readonly remaining = signal<ReadonlyMap<string, number | null>>(new Map());\n private readonly samples = new Map<string, ProgressSample[]>();\n\n readonly jobViews = computed<readonly JobView[]>(() => {\n const expanded = new Set(this.currentExpanded());\n return this.visibleJobs().map((job) => this.viewOf(job, expanded));\n });\n\n private memory: (FocusMemory & { element: HTMLElement }) | null = null;\n private revealing: string | null = null;\n private previous: ReadonlyMap<string, ImportExportJob> | null = null;\n\n constructor() {\n /* A transition of a shown job is announced once; the first render is not. */\n effect(() => {\n const jobs = this.jobs();\n untracked(() => {\n const seen = this.previous;\n this.previous = new Map(jobs.map((job) => [job.key, job]));\n if (seen === null) return;\n for (const job of jobs) {\n const transition = jobTransition(seen.get(job.key), job);\n if (transition !== null) {\n getLiveAnnouncer().announce(jobAnnouncement(transition, job, this.t));\n }\n }\n });\n });\n\n /* The time left: samples of the progress the family has seen, and the server's eta first. */\n effect(() => {\n const jobs = this.jobs();\n const now = this.now() ?? Date.now();\n const timeZone = this.timeZoneValue();\n untracked(() => {\n const next = new Map<string, number | null>();\n for (const job of jobs) {\n if (job.status !== 'running') {\n this.samples.delete(job.key);\n continue;\n }\n const value = job.progress?.value;\n const max = job.progress?.max;\n const list = this.samples.get(job.key) ?? [];\n if (value !== undefined && max !== undefined && list.at(-1)?.value !== value) {\n list.push({ at: Date.now(), max, value });\n if (list.length > SAMPLE_LIMIT) list.shift();\n this.samples.set(job.key, list);\n }\n next.set(job.key, remainingSeconds(job, list, { now, timeZone }));\n }\n this.remaining.set(next);\n });\n });\n\n /* A key that left the jobs leaves the set. */\n effect(() => {\n const present = new Set(this.jobs().map((job) => job.key));\n untracked(() => {\n const own = this.expanded();\n if (own === undefined) return;\n const kept = own.filter((key) => present.has(key));\n if (kept.length !== own.length) this.expanded.set(kept);\n });\n });\n\n /* After every render: focus that lost its element, and a job being revealed. */\n afterRenderEffect(() => {\n this.jobViews();\n untracked(() => {\n this.restoreFocus();\n this.finishReveal();\n });\n });\n }\n\n /** Focuses the first job's first control, or the list when there is none. */\n focus(): void {\n const list = this.listElement()?.nativeElement;\n const first = list?.querySelector<HTMLElement>(\n ':scope > [data-part=\"job\"] :is(a[data-part=\"job-title\"], [data-part=\"controls\"] button, [data-part=\"controls\"] a)',\n );\n (first ?? list)?.focus();\n }\n\n /** Shows a job's details, scrolls it into view and focuses its title: where a toast's View takes the reader. */\n reveal(key: string): void {\n const job = this.jobs().find((each) => each.key === key);\n if (job === undefined) return;\n const keys = this.currentExpanded();\n if (!keys.includes(key)) this.requestExpanded([...keys, key], 'programmatic', undefined);\n if (filterJobs([job], this.currentView()).length === 0) {\n this.selectView('all', 'programmatic', undefined);\n }\n this.revealing = key;\n }\n\n protected formatCount(value: number): string {\n return new Intl.NumberFormat(this.localeValue()).format(value);\n }\n\n private deadline(value: TimestampValue): string {\n return formatTimestamp(value, {\n absolute: DEADLINE,\n format: 'absolute',\n locale: this.localeValue(),\n timeZone: this.timeZoneValue(),\n }).text;\n }\n\n private viewOf(job: ImportExportJob, expandedKeys: ReadonlySet<string>): JobView {\n const t = this.t;\n const locale = this.localeValue();\n const clock = { now: this.now(), timeZone: this.timeZoneValue() };\n const prefix = `${this.id}-${escapeKey(job.key)}`;\n const ids = {\n control: (part: string) => `${prefix}-${part}`,\n details: `${prefix}-details`,\n status: `${prefix}-status`,\n title: `${prefix}-title`,\n toggle: `${prefix}-toggle`,\n };\n const controls = jobControls(job, clock);\n const kindFile = job.result ?? job.source;\n const kind: FileKind =\n kindFile !== undefined\n ? fileKind({ name: kindFile.name, type: kindFile.type ?? '' })\n : job.format !== undefined\n ? fileKind({ name: `job.${job.format.toLowerCase()}`, type: '' })\n : 'other';\n const shown =\n job.direction === 'export' ? (job.result ?? job.source) : (job.source ?? job.result);\n const when =\n job.status === 'succeeded' || job.status === 'failed'\n ? (job.finishedAt ?? job.createdAt)\n : job.createdAt;\n const counts: JobCounts = job.counts ?? {};\n const count = new Intl.NumberFormat(locale);\n const errors = job.errors ?? [];\n const total = Math.max(job.errorCount ?? 0, errors.length);\n const files: FileRow[] = (\n [\n ['source', job.source],\n ['result', job.result],\n ['errors', job.errorsFile],\n ] as const\n )\n .filter((entry): entry is readonly [JobFileRole, JobFile] => entry[1] !== undefined)\n .map(([role, file]) => {\n const availability = fileAvailability(file, clock);\n const { stem, extension } = splitName(file.name);\n return {\n availability,\n downloadable: availability === 'available' || availability === 'expires',\n extension,\n file,\n label: t(`fileLabels.${role}`),\n note:\n availability === 'denied'\n ? (file.denied ?? null)\n : file.expiresAt === undefined\n ? null\n : availability === 'expired'\n ? t('expired', { date: this.deadline(file.expiresAt) })\n : t('expires', { date: this.deadline(file.expiresAt) }),\n role,\n size: file.size === undefined ? null : formatBytes(file.size, locale),\n stem,\n };\n });\n\n const downloadFile =\n controls.download === 'errors'\n ? (job.errorsFile ?? null)\n : controls.download === 'result'\n ? (job.result ?? null)\n : null;\n const mark = jobGlyph(job);\n\n return {\n controls,\n counts: COUNT_KEYS.filter((name) => typeof counts[name] === 'number').map((name) => ({\n key: name,\n label: t(`countLabels.${name}`),\n value: count.format(counts[name] ?? 0),\n })),\n downloadFile,\n downloadLabel: controls.download === 'errors' ? t('downloadErrors') : t('download'),\n errorNote:\n total > errors.length && errors.length > 0\n ? t('sample', { shown: errors.length, total })\n : null,\n expanded:\n expandedKeys.has(job.key) && controls.controls.includes('toggle') && hasDetails(job),\n file:\n shown === undefined\n ? null\n : {\n ...splitName(shown.name),\n size: shown.size === undefined ? null : formatBytes(shown.size, locale),\n },\n files,\n ids,\n job,\n directionText: t(job.direction),\n kind,\n kindGlyph: KIND_GLYPH[kind],\n mark,\n message: this.messageOf(job, clock),\n ordered: controls.controls.filter((part) => part !== 'remove'),\n outcome: jobOutcome(job),\n progressText:\n job.status === 'running'\n ? jobProgressText(job, {\n locale,\n t,\n remaining: this.remaining().get(job.key),\n })\n : [],\n removable: controls.controls.includes('remove'),\n retryLabel: controls.retry === 'regenerate' ? t('regenerate') : t('retry'),\n statusText: jobStatusText(job, t),\n summary: jobSummaryText(job, { locale, t }),\n time:\n when === undefined\n ? null\n : formatTimestamp(when, {\n format: this.timeFormatValue(),\n locale,\n now: this.now(),\n timeZone: this.timeZoneValue(),\n }),\n };\n }\n\n private messageOf(\n job: ImportExportJob,\n clock: { now: number | undefined; timeZone: string | undefined },\n ): string | null {\n if (job.message !== undefined && job.message !== '') return job.message;\n const result = job.result;\n if (result === undefined) return null;\n const availability = fileAvailability(result, clock);\n if (availability === 'denied') return result.denied ?? null;\n if (result.expiresAt === undefined) return null;\n if (availability === 'expired')\n return this.t('expired', { date: this.deadline(result.expiresAt) });\n if (availability === 'expires')\n return this.t('expires', { date: this.deadline(result.expiresAt) });\n return null;\n }\n\n /* ── The two models ────────────────────────────────────────────────── */\n\n protected forwardView(request: ChangeRequest<string | undefined>) {\n if (request.value === undefined) return;\n this.selectView(request.value, request.reason, request.source);\n }\n\n private selectView(next: string, reason: ChangeReason, source: unknown) {\n if (next === this.currentView()) return;\n let cancelled = false;\n const state = createControllable<string | undefined>({\n initial: this.currentView(),\n onRequest: (request) => {\n this.viewRequest.emit(request);\n cancelled = request.cancelled;\n },\n });\n const moved = state.request(next, reason, source);\n /* The model is the state: written once the request is accepted, which is\n what `[(view)]` binds and what an unbound centre keeps. */\n if (!cancelled && moved) this.view.set(next);\n }\n\n private requestExpanded(next: readonly string[], reason: ChangeReason, source: unknown) {\n if (sameKeys(next, this.currentExpanded())) return;\n let cancelled = false;\n const state = createControllable<readonly string[] | undefined>({\n equals: (a, b) => sameKeys(a ?? [], b ?? []),\n initial: this.currentExpanded(),\n onRequest: (request) => {\n this.expandedRequest.emit(request);\n cancelled = request.cancelled;\n },\n });\n const moved = state.request(next, reason, source);\n if (!cancelled && moved) this.expanded.set(next);\n }\n\n protected toggle(key: string, reason: ImportExportPressReason, event: Event) {\n const keys = this.currentExpanded();\n this.requestExpanded(\n keys.includes(key) ? keys.filter((each) => each !== key) : [...keys, key],\n reason,\n event,\n );\n }\n\n /* ── Requests ──────────────────────────────────────────────────────── */\n\n protected press(part: string, key: string, event: Event) {\n const request = Object.assign(createRequest(pressReason(event), event), { key });\n (part === 'cancel' ? this.cancelRequest : this.retryRequest).emit(request);\n }\n\n protected removeOne(key: string, event: Event) {\n this.removeRequest.emit(\n Object.assign(createRequest(pressReason(event), event), { keys: [key] }),\n );\n }\n\n protected clear(event: Event) {\n this.removeRequest.emit(\n Object.assign(createRequest('clear' as const, event), {\n keys: this.finished().map((job) => job.key),\n }),\n );\n }\n\n protected askDownload(key: string, file: JobFileRole, event: Event) {\n const request = Object.assign(createRequest(pressReason(event), event), { file, key });\n this.downloadRequest.emit(request);\n if (request.cancelled) event.preventDefault();\n }\n\n protected open(key: string, event: Event) {\n const request = Object.assign(createRequest(pressReason(event), event), { key });\n this.openRequest.emit(request);\n if (request.cancelled) event.preventDefault();\n }\n\n protected loadMore(event: Event) {\n if (this.loading()) return;\n this.loadMoreRequest.emit(createRequest(pressReason(event), event));\n }\n\n protected reload(event: Event) {\n this.reloadRequest.emit(createRequest(pressReason(event), event));\n }\n\n /* ── Focus ─────────────────────────────────────────────────────────── */\n\n protected rememberFocus(event: FocusEvent) {\n const list = this.listElement()?.nativeElement;\n const target = event.target as HTMLElement | null;\n const job = target?.closest<HTMLElement>('[data-part=\"job\"]') ?? null;\n if (list === undefined || target === null || job === null || !list.contains(job)) {\n this.memory = null;\n return;\n }\n const all = [...list.querySelectorAll<HTMLElement>(':scope > [data-part=\"job\"]')];\n let part = 'job-title';\n for (\n let node: HTMLElement | null = target;\n node !== null && node !== job;\n node = node.parentElement\n ) {\n const name = node.dataset['part'];\n if (name !== undefined && (FOCUSABLE_PARTS as readonly string[]).includes(name)) {\n part = name;\n break;\n }\n }\n this.memory = { element: target, index: all.indexOf(job), key: job.dataset['key'] ?? '', part };\n }\n\n private focusPart(list: HTMLElement, key: string, part: string) {\n const job = list.querySelector<HTMLElement>(\n `:scope > [data-part=\"job\"][data-key=\"${CSS.escape(key)}\"]`,\n );\n const holder = job?.querySelector<HTMLElement>(`[data-part=\"${part}\"]`) ?? null;\n const target =\n holder === null\n ? null\n : holder.matches('button, a, [tabindex]')\n ? holder\n : holder.querySelector<HTMLElement>('button, a');\n target?.focus();\n }\n\n private restoreFocus() {\n const kept = this.memory;\n const list = this.listElement()?.nativeElement;\n if (kept === null || list === undefined || kept.element.isConnected) return;\n const active = list.ownerDocument.activeElement;\n if (active !== null && active !== list.ownerDocument.body) return;\n const drawn: FocusableJob[] = [\n ...list.querySelectorAll<HTMLElement>(':scope > [data-part=\"job\"][data-key]'),\n ].map((job) => ({\n key: job.dataset['key'] ?? '',\n parts: FOCUSABLE_PARTS.filter(\n (part) => part !== 'job-title' && job.querySelector(`[data-part=\"${part}\"]`) !== null,\n ),\n }));\n const destination = focusDestination(kept, drawn);\n this.memory = null;\n if ('list' in destination) list.focus();\n else this.focusPart(list, destination.key, destination.part);\n }\n\n private finishReveal() {\n const key = this.revealing;\n const list = this.listElement()?.nativeElement;\n if (key === null || list === undefined) return;\n this.revealing = null;\n const job = list.querySelector<HTMLElement>(\n `:scope > [data-part=\"job\"][data-key=\"${CSS.escape(key)}\"]`,\n );\n if (job === null) return;\n job.scrollIntoView?.({ block: 'nearest' });\n job.querySelector<HTMLElement>('[data-part=\"job-title\"]')?.focus({ preventScroll: true });\n }\n\n /** The element the family renders on: the region a consumer's ref reaches. */\n get element(): HTMLElement {\n return this.native;\n }\n}\n","import { effect, inject, signal, untracked } from '@angular/core';\nimport type { Signal, TemplateRef } from '@angular/core';\nimport { injectMessages } from '@slotted/angular/i18n';\nimport { SlToastService } from '@slotted/angular/toast';\nimport type { ToastContent, ToastMessage } from '@slotted/angular/toast';\nimport {\n importExportCenterMessages,\n type ImportExportCenterMessages,\n type PartialMessages,\n} from '@slotted/core/i18n';\nimport { jobNotice } from '@slotted/core/import-export-center';\nimport type { ImportExportJob } from '@slotted/core/import-export-center';\n\nexport interface JobToastsOptions {\n /**\n * The toast's View control, written by the consumer and rendered per\n * message. A function — a `viewChild` signal — is read when a toast is\n * shown, so a template that exists only after the view is created still\n * reaches it. The message's `data` carries `{ key }`, and `noticeKey(message.id)`\n * from `@slotted/core/import-export-center` reads the same key back.\n */\n actions?:\n | TemplateRef<{ $implicit: ToastMessage<ToastContent> }>\n | (() => TemplateRef<{ $implicit: ToastMessage<ToastContent> }> | undefined)\n | undefined;\n /** Words laid over the catalog of the language in force: the announcement a toast carries. */\n messages?: PartialMessages<ImportExportCenterMessages> | undefined;\n}\n\n/** What a notice's toast carries in `data`: the job it points at. */\nexport interface JobToastData {\n readonly key: string;\n}\n\n/**\n * A toast that points at a job, for a page that is not the centre: the job\n * started, finished, finished with failed rows, failed. Called once in an\n * injection context where the application keeps its jobs — the shell — so\n * the reader hears of a job that finishes while they work elsewhere.\n *\n * The toast only points. It carries no progress, no cancel and no download;\n * its one action is the consumer's View, which takes the reader to the centre\n * and calls its `reveal(key)`. Its id is the job's key under\n * `import-export-center:`, so the finishing notice replaces the starting one\n * in place. Its announcement is the sentence the centre says for the same\n * transition, which the shared announcer does not repeat when both are\n * mounted. The jobs present the first time the signal is read made no move\n * the reader saw, and get no toast.\n */\nexport function jobToasts(\n jobs: Signal<readonly ImportExportJob[]>,\n { actions, messages }: JobToastsOptions = {},\n): void {\n const toasts = inject(SlToastService);\n const t = injectMessages(importExportCenterMessages, signal(messages));\n let previous: ReadonlyMap<string, ImportExportJob> | null = null;\n\n effect(() => {\n const current = jobs();\n untracked(() => {\n const seen = previous;\n previous = new Map(current.map((job) => [job.key, job]));\n if (seen === null) return;\n for (const job of current) {\n const notice = jobNotice(seen.get(job.key), job, t);\n if (notice === null) continue;\n const template = typeof actions === 'function' ? actions() : actions;\n toasts.show({\n ...(template === undefined ? {} : { actions: template }),\n announcement: notice.title,\n data: { key: notice.key } satisfies JobToastData,\n description: notice.description,\n id: notice.id,\n loading: notice.loading,\n title: notice.title,\n tone: notice.tone,\n });\n }\n });\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}