{"version":3,"file":"sdcorejs-angular-components-job-progress.mjs","sources":["../../../projects/sdcorejs-angular/components/job-progress/src/job-progress.component.ts","../../../projects/sdcorejs-angular/components/job-progress/src/job-progress.component.html","../../../projects/sdcorejs-angular/components/job-progress/sdcorejs-angular-components-job-progress.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, HostBinding, booleanAttribute, computed, inject, input, output } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdTaskService, SdTaskState, SdTaskStatus, SdTaskView } from '@sdcorejs/angular/services/task';\n\nexport type SdJobProgressMode = 'bar' | 'compact' | 'details';\n\n@Component({\n  selector: 'sd-job-progress',\n  standalone: true,\n  templateUrl: './job-progress.component.html',\n  styleUrl: './job-progress.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdJobProgress {\n  readonly taskId = input<string | undefined>(undefined);\n  readonly state = input<SdTaskState | undefined>(undefined);\n  readonly mode = input<SdJobProgressMode>('bar');\n  readonly title = input<string | undefined>(undefined);\n  readonly message = input<string | undefined>(undefined);\n  readonly showActions = input(true, { transform: booleanAttribute });\n\n  readonly sdCancel = output<void>();\n  readonly sdRetry = output<void>();\n\n  readonly #tasks = inject(SdTaskService);\n  readonly #i18n = inject(I18nService);\n\n  readonly task = computed<SdTaskView | undefined>(() => {\n    if (this.state()) return undefined;\n    const id = this.taskId();\n    return id ? this.#tasks.get(id) : undefined;\n  });\n  readonly resolvedState = computed<SdTaskState | undefined>(() => this.state() ?? this.task()?.state());\n  readonly progress = computed<number | undefined>(() => {\n    const value = this.resolvedState()?.progress;\n    return value === undefined || !Number.isFinite(value) ? undefined : Math.max(0, Math.min(100, value));\n  });\n  readonly effectiveTitle = computed(() => this.title() ?? this.resolvedState()?.title);\n  readonly effectiveMessage = computed(() => this.message() ?? this.resolvedState()?.message);\n  readonly statusLabel = computed(() => this.#i18n.t(`core.component.job-progress.status.${this.resolvedState()?.status ?? 'idle'}`));\n  readonly progressLabel = computed(() => {\n    const title = this.effectiveTitle();\n    return title ? `${title}: ${this.statusLabel()}` : this.statusLabel();\n  });\n  readonly cancelLabel = computed(() => this.#i18n.t('core.component.job-progress.cancel'));\n  readonly retryLabel = computed(() => this.#i18n.t('core.component.job-progress.retry'));\n  readonly displayedError = computed(() => formatError(this.resolvedState()?.error ?? this.task()?.error()));\n  readonly active = computed(() => {\n    const status = this.resolvedState()?.status;\n    return status === 'queued' || status === 'running';\n  });\n  readonly canCancel = computed(() => this.showActions() && this.active() && (this.task()?.canCancel() ?? true));\n  readonly canRetry = computed(() => {\n    if (!this.showActions()) return false;\n    const status = this.resolvedState()?.status;\n    return this.task()?.canRetry() ?? (status === 'failed' || status === 'cancelled');\n  });\n\n  @HostBinding('attr.data-mode') get modeAttr(): SdJobProgressMode {\n    return this.mode();\n  }\n\n  @HostBinding('attr.data-status') get statusAttr(): SdTaskStatus {\n    return this.resolvedState()?.status ?? 'idle';\n  }\n\n  @HostBinding('attr.aria-live') readonly ariaLive = 'polite';\n\n  onCancel(): void {\n    const id = this.taskId();\n    if (id && this.task()) void this.#tasks.cancel(id);\n    this.sdCancel.emit();\n  }\n\n  onRetry(): void {\n    const id = this.taskId();\n    if (id && this.task()) this.#tasks.retry(id);\n    this.sdRetry.emit();\n  }\n}\n\nfunction formatError(error: unknown): string | undefined {\n  if (error === null || error === undefined) return undefined;\n  if (error instanceof Error) return error.message;\n  return typeof error === 'string' ? error : String(error);\n}\n","@if (resolvedState()) {\n  <section class=\"sd-job-progress\" [attr.aria-label]=\"progressLabel()\">\n    <div class=\"sd-job-progress__header\">\n      <div class=\"sd-job-progress__identity\">\n        @if (effectiveTitle()) {\n          <strong class=\"sd-job-progress__title\">{{ effectiveTitle() }}</strong>\n        }\n        <span class=\"sd-job-progress__status\">{{ statusLabel() }}</span>\n      </div>\n\n      @if (progress() !== undefined) {\n        <span class=\"sd-job-progress__percentage\">{{ progress() }}%</span>\n      }\n    </div>\n\n    @if (active() || progress() !== undefined) {\n      <div\n        class=\"sd-job-progress__track\"\n        role=\"progressbar\"\n        aria-valuemin=\"0\"\n        aria-valuemax=\"100\"\n        [attr.aria-valuenow]=\"progress()\"\n        [attr.aria-label]=\"progressLabel()\"\n        [attr.data-indeterminate]=\"progress() === undefined ? 'true' : 'false'\">\n        <span\n          class=\"sd-job-progress__fill\"\n          [class.sd-job-progress__fill--indeterminate]=\"progress() === undefined\"\n          [style.width.%]=\"progress() ?? 30\"></span>\n      </div>\n    }\n\n    @if (mode() === 'details' && effectiveMessage()) {\n      <p class=\"sd-job-progress__message\" data-task-details>{{ effectiveMessage() }}</p>\n    }\n\n    @if (displayedError()) {\n      <p class=\"sd-job-progress__error\" role=\"alert\">{{ displayedError() }}</p>\n    }\n\n    @if (canCancel() || canRetry()) {\n      <div class=\"sd-job-progress__actions\">\n        @if (canCancel()) {\n          <button type=\"button\" data-task-cancel (click)=\"onCancel()\">\n            {{ cancelLabel() }}\n          </button>\n        }\n        @if (canRetry()) {\n          <button type=\"button\" data-task-retry (click)=\"onRetry()\">\n            {{ retryLabel() }}\n          </button>\n        }\n      </div>\n    }\n  </section>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}