{"version":3,"file":"tstdl-angular-document-management.mjs","sources":["../../../../projects/tstdl/angular/document-management/source/api/api.ts","../../../../projects/tstdl/angular/document-management/source/components/document-type-select-dialog/document-type-select-dialog.component.ts","../../../../projects/tstdl/angular/document-management/source/components/document-type-select-dialog/document-type-select-dialog.component.html","../../../../projects/tstdl/angular/document-management/source/components/document-details/document-details.component.ts","../../../../projects/tstdl/angular/document-management/source/components/document-details/document-details.component.html","../../../../projects/tstdl/angular/document-management/source/components/property-value/property-value.component.ts","../../../../projects/tstdl/angular/document-management/source/components/property-value/property-value.component.html","../../../../projects/tstdl/angular/document-management/source/components/document-list/document-list-document/document-list-document.component.ts","../../../../projects/tstdl/angular/document-management/source/components/document-list/document-list-document/document-list-document.component.html","../../../../projects/tstdl/angular/document-management/source/components/document-list/document-list.component.ts","../../../../projects/tstdl/angular/document-management/source/components/document-list/document-list.component.html","../../../../projects/tstdl/angular/document-management/source/components/document-workflow-state/document-workflow-state.component.ts","../../../../projects/tstdl/angular/document-management/source/components/document-workflow-state/document-workflow-state.component.html","../../../../projects/tstdl/angular/document-management/source/filter.ts","../../../../projects/tstdl/angular/document-management/source/services/authorization.service.ts","../../../../projects/tstdl/angular/document-management/source/context.ts","../../../../projects/tstdl/angular/document-management/tstdl-angular-document-management.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { getApiService } from '@tstdl/angular';\nimport { documentManagementApiDefinition } from '@tstdl/base/document-management';\n\n@Injectable({ providedIn: 'root' })\nexport class DocumentManagementApiService extends getApiService('DocumentManagement', documentManagementApiDefinition) { }\n","import { DIALOG_DATA, DialogRef, type Dialog } from '@angular/cdk/dialog';\nimport { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { enterAnimation } from '@tstdl/angular/animations';\nimport { ButtonComponent } from '@tstdl/angular/button';\nimport { InputComponent, InputGroupComponent, InputGroupLabelComponent } from '@tstdl/angular/form';\nimport { IconComponent } from '@tstdl/angular/icon';\nimport type { EnrichedDocumentCategory, EnrichedDocumentType } from '@tstdl/base/document-management';\nimport { compareByValueSelection, isNull } from '@tstdl/base/utils';\nimport { normalizeText } from '@tstdl/base/utils/string';\nimport { firstValueFrom } from 'rxjs';\n\nimport type { DocumentManagementContext } from '../../context';\n\nexport type DocumentTypeSelectDialogData = {\n  context: DocumentManagementContext,\n  selection?: EnrichedDocumentType | null,\n};\n\nexport type DocumentTypeSelectDialogResult = {\n  type: EnrichedDocumentType | null,\n};\n\n@Component({\n  selector: 'tsl-document-type-select-dialog',\n  imports: [FormsModule, ButtonComponent, IconComponent, InputGroupComponent, InputGroupLabelComponent, InputComponent],\n  templateUrl: './document-type-select-dialog.component.html',\n  styleUrl: './document-type-select-dialog.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  animations: [enterAnimation({ timing: '200ms ease' })],\n  host: {\n    class: 'tsl-tw',\n  },\n})\nexport class DocumentTypeSelectDialogComponent {\n  readonly #dialogRef = inject(DialogRef<DocumentTypeSelectDialogResult>);\n  readonly #data = inject<DocumentTypeSelectDialogData>(DIALOG_DATA);\n  readonly context = this.#data.context;\n  readonly selection = this.#data.selection ?? null;\n\n  readonly searchFilter = signal<string>('');\n  readonly selectedCategory = signal<EnrichedDocumentCategory | null>(this.#data.selection?.category ?? null);\n\n  readonly layers = computed(() => getCategoryLayers(this.context.data()?.rootCategories ?? [], this.selectedCategory())\n    .map((layer) => {\n      const { relevant, irrelevant } = Object.groupBy(layer, (item) => item.relevant ? 'relevant' : 'irrelevant');\n      return { relevant: relevant ?? [], irrelevant: irrelevant ?? [] };\n    })\n  );\n\n  readonly filteredLayers = computed(() => {\n    const searchFilter = normalizeText(this.searchFilter());\n\n    return this.layers().map((layer) => {\n      const { relevant, irrelevantWithFilter } = Object.groupBy(layer.relevant, ({ category, highlight }) => (highlight || category.helper.normalizedLabel.includes(searchFilter)) ? 'relevant' : 'irrelevantWithFilter')\n\n      return {\n        ...layer,\n        relevant: relevant ?? [],\n        irrelevant: [...layer.irrelevant, ...(irrelevantWithFilter ?? [])],\n      };\n    });\n  });\n\n  readonly categoryFilteredTypes = computed(() => this.selectedCategory()?.typesDeep ?? this.context.data()?.types ?? []);\n\n  readonly types = computed(() => {\n    const searchFilter = normalizeText(this.searchFilter());\n    const sorted = this.categoryFilteredTypes().toSorted(compareByValueSelection((type) => type.label));\n\n    if (searchFilter.length == 0) {\n      return sorted;\n    }\n\n    return sorted.filter((type) => type.helper.normalizedLabel.includes(searchFilter));\n  });\n\n  static async open(data: DocumentTypeSelectDialogData, dialog: Dialog): Promise<DocumentTypeSelectDialogResult> {\n    const dialogRef = dialog.open<DocumentTypeSelectDialogResult, DocumentTypeSelectDialogData>(DocumentTypeSelectDialogComponent, {\n      data\n    });\n\n    dialogRef.backdropClick.subscribe(() => dialogRef.close());\n\n    const result = await firstValueFrom(dialogRef.closed);\n\n    return { type: result?.type ?? null };\n  }\n\n  close() {\n    this.#dialogRef.close();\n  }\n\n  selectCategory(category: EnrichedDocumentCategory | null) {\n    this.selectedCategory.update((currentCategory) => ((category == currentCategory) || (currentCategory?.parents.includes(category!) ?? false)) ? (category?.parent ?? null) : category);\n    this.searchFilter.set('');\n  }\n\n  selectType(type: EnrichedDocumentType | null) {\n    this.#dialogRef.close({ type });\n  }\n}\n\nfunction getCategoryLayers(rootCategories: EnrichedDocumentCategory[], selectedCategory: EnrichedDocumentCategory | null): { category: EnrichedDocumentCategory, highlight: boolean, relevant: boolean }[][] {\n  const children = rootCategories.flatMap((category) => category.children);\n\n  const mappedRootCategories = rootCategories.map((category) => {\n    const isSelectedCategory = category == selectedCategory;\n    const isParent = selectedCategory?.parents.includes(category) ?? false;\n\n    const highlight = isParent || isSelectedCategory;\n    const relevant = isNull(selectedCategory) || isNull(category.parent) || selectedCategory.parents.includes(category.parent) || (selectedCategory?.childrenDeep.includes(category) ?? false);\n\n    return {\n      category,\n      highlight,\n      relevant: relevant || highlight\n    };\n  })\n    .toSorted(compareByValueSelection((item) => item.category.label));\n\n  if (children.length == 0) {\n    return [mappedRootCategories];\n  }\n\n  const nextLayers = getCategoryLayers(children, selectedCategory);\n\n  return [\n    mappedRootCategories,\n    ...nextLayers\n  ];\n}\n","<div class=\"feature-xl bg-neutral-100 dark:bg-neutral-800 border-2 rounded-md overflow-hidden\">\n  <div class=\"flex justify-between items-center p-4 border-b-2 bg-white/30 dark:bg-neutral-900/30\">\n    <h2 class=\"text-lg font-semibold\">Dokumententyp auswählen</h2>\n\n    <div class=\"flex gap-4\">\n      <tsl-input-group>\n        <label tslInputGroupLabel>Filter</label>\n        <input tslInput [(ngModel)]=\"searchFilter\" />\n      </tsl-input-group>\n\n      <button tslButton design=\"icon\" (click)=\"close()\">\n        <tsl-icon icon=\"x-lg\"></tsl-icon>\n      </button>\n    </div>\n  </div>\n\n  <div class=\"flex gap-2 h-[50rem] pl-4 overflow-hidden\">\n    @for (layer of filteredLayers(); track index; let index = $index) {\n      <div class=\"border-r-2 py-2 pr-2 overflow-y-auto\">\n        <div class=\"mb-2 font-semibold\">Ebene {{ index + 1 }}</div>\n\n        <div class=\"h-0 max-h-0 overflow-hidden pointer-events-none\" inert>\n          @for (item of layer.irrelevant; track item.category.id) {\n            <button tslButton design=\"outline\" class=\"block invisible\">{{ item.category.label }}</button>\n          }\n        </div>\n\n        <div class=\"space-y-2 overflow-hidden\">\n          @for (item of layer.relevant; track item.category.id) {\n            <div @enter>\n              <button tslButton [design]=\"item.highlight ? 'flat' : 'outline'\" [color]=\"context.categoryColors()[item.category.id] ?? 'red'\" class=\"block\" (click)=\"selectCategory(item.category)\">\n                {{ item.category.label }}\n              </button>\n            </div>\n          } @empty {\n            <div @enter class=\"text-neutral-600 dark:text-neutral-300\">Keine Kategorien</div>\n          }\n        </div>\n      </div>\n    }\n\n    <div class=\"overflow-y-auto py-2 pr-2\">\n      <div class=\"mb-2 font-semibold\">Dokumententypen</div>\n\n      <div class=\"h-0 max-h-0 overflow-hidden pointer-events-none\" inert>\n        @for (type of context.data()?.types; track type.id) {\n          <button tslButton design=\"outline\" class=\"block invisible\">{{ type.label }}</button>\n        }\n      </div>\n\n      <div class=\"space-y-2\">\n        @for (type of types(); track type.id) {\n          <div @enter>\n            <button tslButton [design]=\"type == selection ? 'flat' : 'outline'\" [color]=\"context.categoryColors()[type.category.id] ?? 'red'\" class=\"block\" (click)=\"selectType(type)\">\n              {{ type.label }}\n            </button>\n          </div>\n        }\n      </div>\n\n      @if (types().length == 0) {\n        <div class=\"text-neutral-600 dark:text-neutral-300\">Keine Dokumententypen gefunden.</div>\n      }\n    </div>\n  </div>\n</div>\n","import { DIALOG_DATA, DialogRef, type Dialog } from '@angular/cdk/dialog';\nimport { CdkMenuTrigger } from '@angular/cdk/menu';\nimport { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, Injector, runInInjectionContext, untracked } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormBuilder, ReactiveFormsModule } from '@angular/forms';\nimport { LocalizePipe } from '@tstdl/angular';\nimport { BadgeComponent } from '@tstdl/angular/badge';\nimport { ButtonComponent } from '@tstdl/angular/button';\nimport { InputComponent, InputGroupComponent, InputGroupLabelComponent, SelectComponent, SelectOptionComponent } from '@tstdl/angular/form';\nimport { IconComponent } from '@tstdl/angular/icon';\nimport { TslMenu } from '@tstdl/angular/menu';\nimport { PdfViewerComponent } from '@tstdl/angular/pdf-viewer';\nimport { DocumentPropertyDataType, DocumentWorkflowState, DocumentWorkflowStep } from '@tstdl/base/document-management';\nimport { getMimeTypeExtensions } from '@tstdl/base/file';\nimport { dateShort } from '@tstdl/base/formats';\nimport { switchAll } from '@tstdl/base/signals';\nimport { tstdlCommonLocalizationKeys } from '@tstdl/base/text';\nimport type { InputType, Record, TypedOmit } from '@tstdl/base/types';\nimport { assertDefinedPass, dateTimeToNumericDate, formatBytes, isBoolean, isNotNull, isNull, isNumber, isUndefined, numericDateToDateTime } from '@tstdl/base/utils';\nimport { objectEntries } from '@tstdl/base/utils/object';\nimport { normalizeTextInput } from '@tstdl/base/utils/string';\nimport { DateTime } from 'luxon';\nimport { firstValueFrom, map } from 'rxjs';\nimport { match } from 'ts-pattern';\n\nimport type { DocumentManagementContext } from '../../context';\nimport { DocumentTypeSelectDialogComponent } from '../document-type-select-dialog/document-type-select-dialog.component';\n\nexport type DocumentDetailsData = {\n  dialog: Dialog,\n  context: DocumentManagementContext,\n  documentId: string,\n};\n\ntype PropertyItem = {\n  id: string,\n  label: string,\n  type: DocumentPropertyDataType,\n  inputType: InputType,\n  editable: boolean,\n  value: string | number | boolean | null,\n};\n\n@Component({\n  selector: 'tsl-document-details',\n  imports: [NgClass, ReactiveFormsModule, LocalizePipe, PdfViewerComponent, ButtonComponent, BadgeComponent, IconComponent, InputGroupComponent, InputComponent, InputGroupLabelComponent, TslMenu, CdkMenuTrigger, SelectComponent, SelectOptionComponent],\n  templateUrl: './document-details.component.html',\n  styleUrl: './document-details.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    class: 'tsl-tw content-grid h-full sm:py-4',\n  },\n})\nexport class DocumentDetailsComponent {\n  readonly #injector = inject(Injector);\n  readonly #dialogRef = inject(DialogRef);\n  readonly #data = inject<DocumentDetailsData>(DIALOG_DATA);\n  readonly #formBuilder = inject(FormBuilder);\n  readonly context = this.#data.context;\n  readonly document = computed(() => assertDefinedPass(this.context.data()?.maps.documents.get(this.#data.documentId)));\n\n  readonly commonLocalizationKeys = tstdlCommonLocalizationKeys;\n  readonly DocumentWorkflowStep = DocumentWorkflowStep;\n  readonly DocumentWorkflowState = DocumentWorkflowState;\n  readonly getMimeTypeExtensions = getMimeTypeExtensions;\n  readonly formatBytes = formatBytes;\n  readonly dateShort = dateShort;\n\n  readonly canEdit = computed(() => this.document().approval == 'pending');\n  // readonly canEdit = computed(() => false);\n\n  readonly documentId = computed(() => this.document().id);\n  readonly contentUrl = computed(() => this.context.api.getEndpointUrl('getFileContent', { id: this.documentId() }).href);\n\n  readonly assignableCollections = computed(() => {\n    const existingCollectionIds = this.formValue().collections;\n    return this.context.data()?.collections.filter((collection) => !existingCollectionIds.includes(collection.id)) ?? [];\n  });\n\n  readonly properties = computed((): PropertyItem[] => {\n    const document = this.document();\n    const date = document.date;\n\n    return [\n      {\n        id: 'date',\n        label: 'Datum',\n        type: DocumentPropertyDataType.Date,\n        inputType: 'date',\n        editable: true,\n        value: isNull(date) ? null : numericDateToDateTime(date).toFormat('yyyy-MM-dd'),\n      },\n      {\n        id: 'mimeType',\n        label: 'Typ',\n        type: DocumentPropertyDataType.Text,\n        inputType: 'text',\n        editable: false,\n        value: this.getMimeTypeExtensions(document.mimeType)[0] ?? null,\n      },\n      {\n        id: 'originalFileName',\n        label: 'Original-Name',\n        type: DocumentPropertyDataType.Text,\n        inputType: 'text',\n        editable: false,\n        value: document.originalFileName ?? '-',\n      },\n      {\n        id: 'size',\n        label: 'Größe',\n        type: DocumentPropertyDataType.Text,\n        inputType: 'text',\n        editable: false,\n        value: this.formatBytes(document.size),\n      },\n      {\n        id: 'pages',\n        label: 'Seiten',\n        type: DocumentPropertyDataType.Integer,\n        inputType: 'number',\n        editable: false,\n        value: document.pages?.toString() ?? null,\n      },\n      ...(document.type?.properties ?? []).map((property): PropertyItem => {\n        const propertyValue = document.properties.find((p) => p.propertyId == property.id);\n\n        return {\n          id: property.id,\n          type: property.dataType,\n          label: property.label,\n          inputType: match(property.dataType)\n            .with('text', () => 'text' as const)\n            .with('integer', () => 'number' as const)\n            .with('decimal', () => 'number' as const)\n            .with('boolean', () => 'checkbox' as const)\n            .with('date', () => 'date' as const)\n            .exhaustive(),\n          editable: true,\n          value: isUndefined(propertyValue)\n            ? null\n            : match(property.dataType)\n              .with('text', () => isNull(String(propertyValue.value)) ? null : String(propertyValue.value))\n              .with('integer', () => isNull(propertyValue.value) ? null : isNumber(propertyValue.value) ? propertyValue.value : parseInt(String(propertyValue.value)))\n              .with('decimal', () => isNull(propertyValue.value) ? null : isNumber(propertyValue.value) ? propertyValue.value : parseFloat(String(propertyValue.value)))\n              .with('boolean', () => isNull(propertyValue.value) ? null : isBoolean(propertyValue.value) ? propertyValue.value : null)\n              .with('date', () => isNull(propertyValue.value) ? null : isNumber(propertyValue.value) ? numericDateToDateTime(propertyValue.value).toFormat('yyyy-MM-dd') : DateTime.fromJSDate(new Date(String(propertyValue.value))).toFormat('yyyy-MM-dd'))\n              .exhaustive(),\n        };\n      }),\n    ];\n  });\n\n  readonly form = computed(() => {\n    const properties = this.#formBuilder.group<Record<string, string | number | boolean | null>>({});\n\n    for (const property of this.properties()) {\n      properties.addControl(property.id, this.#formBuilder.control(property.value));\n    }\n\n    const form = this.#formBuilder.group({\n      typeId: this.#formBuilder.control(this.document().type?.id ?? null),\n      title: this.#formBuilder.control(this.document().title),\n      subtitle: this.#formBuilder.control(this.document().subtitle),\n      comment: this.#formBuilder.control(this.document().comment),\n      tags: this.#formBuilder.array(this.document().tags.map((tag) => this.#formBuilder.nonNullable.control(tag.label))),\n      collections: this.#formBuilder.array(this.document().assignments.collections.map((collection) => this.#formBuilder.nonNullable.control(collection.collection.id))),\n      properties,\n    });\n\n    if (!this.canEdit()) {\n      form.disable();\n    }\n\n    return form;\n  });\n\n  readonly formValue = switchAll(() => {\n    const form = this.form();\n    return untracked(() => runInInjectionContext(this.#injector, () => toSignal(form.valueChanges.pipe(map(() => form.getRawValue())), { initialValue: form.getRawValue() })));\n  });\n\n  readonly fromValueDocumentTypeLabel = computed(() => {\n    const typeId = this.formValue().typeId;\n\n    if (isNull(typeId)) {\n      return '-';\n    }\n\n    const type = this.context.data()?.maps.types.get(typeId);\n    return type?.label ?? '-';\n  });\n\n  readonly formValueHasChanged = computed(() => {\n    const formValue = this.formValue();\n    const document = this.document();\n\n    if (((document.type?.id ?? null) != formValue.typeId) || (document.title != formValue.title) || (document.subtitle != formValue.subtitle) || (document.comment != formValue.comment)) {\n      return true;\n    }\n\n    if ((document.tags.map((tag) => tag.label).toSorted().join(',') != formValue.tags.filter((tag) => tag.length > 0).toSorted().join(','))) {\n      return true;\n    }\n\n    for (const [id, controlValue] of objectEntries(formValue.properties)) {\n      const property = this.properties().find((property) => property.id == id);\n      if (controlValue != property?.value) {\n        return true;\n      }\n    }\n\n    return false;\n  });\n\n  static async open(data: TypedOmit<DocumentDetailsData, 'dialog'>, dialog: Dialog): Promise<void> {\n    const dialogRef = dialog.open<undefined, DocumentDetailsData>(DocumentDetailsComponent, {\n      data: { ...data, dialog },\n      width: '100dvw',\n      height: '100dvh',\n    });\n\n    dialogRef.backdropClick.subscribe(() => dialogRef.close());\n\n    await firstValueFrom(dialogRef.closed);\n  }\n\n  close() {\n    this.#dialogRef.close();\n  }\n\n  async selectDocumentType(): Promise<void> {\n    const { type } = await DocumentTypeSelectDialogComponent.open({\n      context: this.context,\n      selection: this.context.data()?.maps.types.get(this.formValue().typeId!),\n    }, this.#data.dialog);\n\n    if (isNull(type)) {\n      return;\n    }\n\n    this.form().patchValue({ typeId: type.id });\n  }\n\n  addCollection(id: string): void {\n    this.form().controls.collections.push(this.#formBuilder.nonNullable.control(id));\n  }\n\n  removeCollection(index: number): void {\n    this.form().controls.collections.removeAt(index);\n  }\n\n  addNewTag(): void {\n    this.form().controls.tags.controls.unshift(this.#formBuilder.nonNullable.control(''));\n  }\n\n  removeTag(index: number): void {\n    this.form().controls.tags.removeAt(index);\n  }\n\n  async save(): Promise<void> {\n    const { typeId: type, title, subtitle, comment, tags, properties: { date, ...properties } } = this.formValue();\n    const documentProperties = this.properties().filter((property) => property.editable && (property.id != 'date'));\n\n    await this.context.api.updateDocument({\n      id: this.document().id,\n      typeId: type,\n      title: normalizeTextInput(title),\n      subtitle: normalizeTextInput(subtitle),\n      date: isNull(date) ? null : dateTimeToNumericDate(DateTime.fromFormat(date as string, 'yyyy-MM-dd')),\n      tags: (tags as string[]).map((tag) => normalizeTextInput(tag)).filter(isNotNull),\n      comment: normalizeTextInput(comment),\n      properties: documentProperties.map((property) => ({\n        propertyId: property.id,\n        value: match(property.type)\n          .with('text', (): string | null => normalizeTextInput(properties[property.id] as string | null))\n          .with('integer', (): number | null => isNull(properties[property.id]) ? null : isNumber(properties[property.id]) ? properties[property.id] as number : parseInt(String(properties[property.id])))\n          .with('decimal', (): number | null => isNull(properties[property.id]) ? null : isNumber(properties[property.id]) ? properties[property.id] as number : parseFloat(String(properties[property.id])))\n          .with('boolean', (): boolean | null => (isNull(properties[property.id]) || isBoolean(properties[property.id])) ? properties[property.id] as boolean : null)\n          .with('date', (): number | null => {\n            const normalized = normalizeTextInput(properties[property.id] as string | null);\n\n            if (isNull(normalized)) {\n              return null;\n            }\n\n            const dateTime = DateTime.fromFormat(normalized, 'yyyy-MM-dd');\n\n            if (dateTime.isValid) {\n              return dateTimeToNumericDate(dateTime);\n            }\n\n            return null;\n          })\n          .exhaustive(),\n      })),\n      collections: {\n        assign: [],\n        archive: [],\n      },\n    });\n  }\n\n  async proceedWorkflow(): Promise<void> {\n    await this.context.api.proceedDocumentWorkflow({ id: this.document().id, state: DocumentWorkflowState.Completed });\n  }\n\n  async download(): Promise<void> {\n    const url = await this.context.api.getFileContentUrl({ id: this.document().id, download: true });\n    window.open(url, '_blank');\n  }\n}\n","@let currentWorkflow = document().workflows[0];\n\n<div class=\"feature-xl grid grid-cols-[1fr,auto] bg-neutral-100 dark:bg-neutral-800 border-2 rounded-md overflow-hidden\">\n  <div class=\"border-r-4 dark:border-neutral-500/60\">\n    <tsl-pdf-viewer [source]=\"contentUrl()\" class=\"w-full h-full\"></tsl-pdf-viewer>\n  </div>\n\n  <div class=\"relative min-w-24 max-w-[45ch] p-4 overflow-y-auto flex flex-col gap-4\">\n    <button tslButton design=\"icon\" class=\"absolute top-2 right-2\" (click)=\"close()\">\n      <tsl-icon icon=\"x-lg\"></tsl-icon>\n    </button>\n\n    @if (!canEdit()) {\n      <div>\n        <div class=\"text-xl font-semibold\">{{ document().title }}</div>\n        <div class=\"text-lg\">{{ document().subtitle }}</div>\n      </div>\n    }\n\n    <div [class.mt-8]=\"!canEdit()\">\n      <div class=\"font-semibold\" [class.text-lg]=\"!canEdit()\" [class.text-2xl]=\"canEdit()\">Eigenschaften</div>\n\n      <div [formGroup]=\"form().controls.properties\" class=\"grid grid-cols-[auto,1fr,auto] gap-y-2\" [class.mt-2]=\"!canEdit()\" [class.mt-8]=\"canEdit()\">\n        <tsl-input-group class=\"col-span-3 grid grid-cols-subgrid\">\n          <label tslInputGroupLabel>Typ</label>\n          <input tslInput [value]=\"fromValueDocumentTypeLabel()\" readonly />\n          <button tslInputGroupLabel class=\"px-3 ring-1 ring-inset ring-lime-500 hover:bg-neutral-50 dark:hover:bg-neutral-600\" (click)=\"selectDocumentType()\">\n            <tsl-icon icon=\"list-nested\"></tsl-icon>\n          </button>\n        </tsl-input-group>\n\n        @if (canEdit()) {\n          <tsl-input-group class=\"col-span-3 grid grid-cols-subgrid\">\n            <label tslInputGroupLabel>Titel</label>\n            <input tslInput [formControl]=\"form().controls.title\" class=\"col-span-2\" />\n          </tsl-input-group>\n\n          <tsl-input-group class=\"col-span-3 grid grid-cols-subgrid\">\n            <label tslInputGroupLabel>Untertitel</label>\n            <input tslInput [formControl]=\"form().controls.subtitle\" class=\"col-span-2\" />\n          </tsl-input-group>\n        }\n\n        @for (property of properties(); track property.id) {\n          <tsl-input-group class=\"col-span-3 grid grid-cols-subgrid\">\n            <label tslInputGroupLabel>{{ property.label }}</label>\n\n            @if (property.inputType != 'checkbox') {\n              <input [type]=\"property.inputType\" tslInput [formControlName]=\"property.id\" [readonly]=\"!property.editable || !canEdit()\" class=\"col-span-2\" />\n            } @else {\n              <button tslSelect [formControlName]=\"property.id\" class=\"col-span-2\" [disabled]=\"!property.editable || !canEdit()\">\n                <button tslSelectOption [value]=\"null\">{{ commonLocalizationKeys.notSpecified | localize }}</button>\n                <button tslSelectOption [value]=\"true\">{{ commonLocalizationKeys.yes | localize }}</button>\n                <button tslSelectOption [value]=\"false\">{{ commonLocalizationKeys.no | localize }}</button>\n              </button>\n            }\n          </tsl-input-group>\n        }\n      </div>\n    </div>\n\n    <div class=\"mt-4\">\n      <div class=\"text-lg font-semibold\">Kommentar</div>\n      <tsl-input-group class=\"w-full h-auto mt-2\">\n        <textarea tslInput [formControl]=\"form().controls.comment\" rows=\"5\" class=\"resize-none\" [readonly]=\"!canEdit()\"></textarea>\n      </tsl-input-group>\n    </div>\n\n    <div class=\"mt-4\">\n      <div class=\"flex items-center gap-1 text-lg font-semibold\">\n        <div>Akten</div>\n\n        <button tslButton design=\"icon\" size=\"small\" [cdkMenuTriggerFor]=\"menu\">\n          <tsl-icon icon=\"plus\" size=\"xl\"></tsl-icon>\n        </button>\n\n        <ng-template #menu>\n          <tsl-menu>\n            @for (collection of assignableCollections(); track collection.id) {\n              @if (!form().controls.collections.value.includes(collection.id)) {\n                <button cdkMenuItem (click)=\"addCollection(collection.id)\">{{ collection.name }}</button>\n              }\n            } @empty {\n              <div class=\"px-2\">Keine weiteren zuweisbaren Akten</div>\n            }\n          </tsl-menu>\n        </ng-template>\n      </div>\n\n      <div class=\"flex flex-wrap gap-2 mt-2\">\n        @for (collectionControl of form().controls.collections.controls; track collectionControl; let index = $index) {\n          <tsl-badge design=\"flat-outline\" color=\"amber\" class=\"pr-1\">\n            @if (canEdit()) {\n              <div class=\"grid grid-cols-[1fr,auto] gap-1\">\n                <span class=\"truncate\">{{ context.data()?.maps?.collections?.get(collectionControl.value)?.name ?? '-' }}</span>\n                <button tslButton design=\"icon\" class=\"place-self-center p-0.5\" (click)=\"removeCollection(index)\">\n                  <tsl-icon icon=\"x\"></tsl-icon>\n                </button>\n              </div>\n            } @else {}\n          </tsl-badge>\n        }\n      </div>\n    </div>\n\n    <div class=\"grow mt-4\">\n      <div class=\"flex items-center gap-1 text-lg font-semibold\">\n        <div>Tags</div>\n        <button tslButton design=\"icon\" size=\"small\" (click)=\"addNewTag()\">\n          <tsl-icon icon=\"plus\" size=\"xl\"></tsl-icon>\n        </button>\n      </div>\n\n      <div class=\"gap-2 mt-2\" [ngClass]=\"{ 'flex flex-wrap': !canEdit(), 'grid grid-cols-2': canEdit() }\">\n        @for (tagControl of form().controls.tags.controls; track tagControl; let index = $index) {\n          <tsl-badge design=\"flat-outline\" color=\"emerald\" [ngClass]=\"{ 'gap-2 p-0 pr-1': canEdit() }\">\n            @if (canEdit()) {\n              <div class=\"grid grid-cols-[1fr,auto] gap-1\">\n                <input type=\"text\" [formControl]=\"tagControl\" class=\"px-2 py-1.5 w-full bg-transparent rounded-[inherit]\" />\n                <button tslButton design=\"icon\" class=\"place-self-center p-0.5\" (click)=\"removeTag(index)\">\n                  <tsl-icon icon=\"x\"></tsl-icon>\n                </button>\n              </div>\n            } @else {\n              <span class=\"truncate\">{{ tagControl.value }}</span>\n            }\n          </tsl-badge>\n        }\n      </div>\n    </div>\n\n    <div class=\"grid grid-cols-[auto,auto] gap-x-2 gap-y-4\">\n      @if (\n        currentWorkflow?.step != DocumentWorkflowStep.Assignment &&\n        (currentWorkflow?.state == DocumentWorkflowState.Review || currentWorkflow?.state == DocumentWorkflowState.Error || currentWorkflow?.state == DocumentWorkflowState.Failed)\n      ) {\n        <button tslButton design=\"outline\" color=\"sky\" class=\"col-span-2 flex justify-center items-center gap-2\" (click)=\"proceedWorkflow()\">\n          <span>Worfklowschritt abschließen</span>\n          <tsl-icon icon=\"play-fill\"></tsl-icon>\n        </button>\n      }\n      <button tslButton design=\"outline\" class=\"justify-self-start flex items-center gap-2\" (click)=\"download()\">\n        <tsl-icon icon=\"download\"></tsl-icon>\n        <span>Herunterladen</span>\n      </button>\n      <button tslButton design=\"outline\" class=\"justify-self-end flex items-center gap-2\" [disabled]=\"!formValueHasChanged()\" (click)=\"save()\">\n        <tsl-icon icon=\"save\"></tsl-icon>\n        <span>Speichern</span>\n      </button>\n    </div>\n  </div>\n</div>\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { DateTimeLocalePipe, NumberLocalePipe, NumericDateToDateTimePipe } from '@tstdl/angular';\nimport { IconComponent } from '@tstdl/angular/icon';\nimport { DocumentPropertyDataType, type DocumentPropertyValueView } from '@tstdl/base/document-management';\nimport { dateShort, decimalFormat, integerFormat } from '@tstdl/base/formats';\n\n@Component({\n  selector: '[tslPropertyValue]',\n  imports: [NumberLocalePipe, NumericDateToDateTimePipe, DateTimeLocalePipe, IconComponent],\n  templateUrl: './property-value.component.html',\n  styleUrl: './property-value.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    class: 'tsl-tw',\n  },\n})\nexport class PropertyValueComponent {\n  readonly property = input.required<DocumentPropertyValueView>();\n\n  readonly DocumentPropertyDataType = DocumentPropertyDataType;\n  readonly integerFormat = integerFormat;\n  readonly decimalFormat = decimalFormat;\n  readonly dateShort = dateShort;\n}\n","@let _property = property();\n@let dataType = _property.dataType;\n@let value = _property.value;\n\n@if (value === null) {\n  Keine Angabe\n} @else {\n  @switch (typeof value) {\n    @case (\"string\") {\n      {{ value }}\n    }\n    @case (\"number\") {\n      @switch (dataType) {\n        @case (DocumentPropertyDataType.Integer) {\n          {{ $any(value) | numberLocale: integerFormat }}\n        }\n        @case (DocumentPropertyDataType.Decimal) {\n          {{ $any(value) | numberLocale: decimalFormat }}\n        }\n        @case (DocumentPropertyDataType.Date) {\n          {{ $any(value) | numericDateToDateTime | dateTimeLocale: dateShort }}\n        }\n      }\n    }\n    @case (DocumentPropertyDataType.Boolean) {\n      <tsl-icon [icon]=\"value ? 'check' : 'x'\"></tsl-icon>\n    }\n  }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, ViewEncapsulation } from '@angular/core';\nimport { DateTimeLocalePipe } from '@tstdl/angular';\nimport { BadgeComponent } from '@tstdl/angular/badge';\nimport { IconComponent } from '@tstdl/angular/icon';\nimport { DocumentWorkflowStep, type EnrichedDocument } from '@tstdl/base/document-management';\nimport { getMimeTypeExtensions } from '@tstdl/base/file';\nimport { dateShort } from '@tstdl/base/formats';\nimport { formatBytes } from '@tstdl/base/utils';\n\nimport type { DocumentManagementContext } from '../../../context';\nimport { PropertyValueComponent } from '../../property-value/property-value.component';\n\n@Component({\n  selector: 'tsl-document-list-document',\n  imports: [DateTimeLocalePipe, BadgeComponent, IconComponent, PropertyValueComponent],\n  templateUrl: './document-list-document.component.html',\n  styleUrl: './document-list-document.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  host: {\n    class: 'tsl-tw',\n  },\n})\nexport class DocumentListDocumentComponent {\n  readonly context = input.required<DocumentManagementContext>();\n  readonly document = input.required<EnrichedDocument>();\n\n  readonly DocumentWorkflowStep = DocumentWorkflowStep;\n  readonly getMimeTypeExtensions = getMimeTypeExtensions;\n  readonly formatBytes = formatBytes;\n  readonly dateShort = dateShort;\n\n  readonly documentId = computed(() => this.document().id);\n  readonly previewUrl = computed(() => this.context().api.getEndpointUrl('getPreview', { id: this.documentId(), page: 1 }));\n}\n","@let currentWorkflow = document().workflows[0];\n@let categoryColor = document().type ? (context().categoryColors()[document().type!.category.id] ?? 'red') : 'neutral';\n\n<div class=\"relative w-8\">\n  <tsl-badge [color]=\"categoryColor\" class=\"category-badge absolute inset-0 justify-center px-1.5 py-4 rounded-none border-r-2 border-r-current\">\n    @if (document().type?.category?.label; as label) {\n      <span class=\"truncate\">{{ label }}</span>\n    }\n  </tsl-badge>\n</div>\n\n<div class=\"grid grid-rows-[repeat(3,auto)] gap-4 p-4 pb-2\">\n  <div class=\"grid grid-cols-[1fr,auto] gap-2 items-start truncate\">\n    <div class=\"truncate\">\n      @if (document().title; as title) {\n        <div class=\"font-semibold truncate\">{{ document().title }}</div>\n      }\n\n      @if (document().subtitle; as subtitle) {\n        <div class=\"text-sm truncate\">{{ subtitle }}</div>\n      }\n    </div>\n\n    @if (document().type; as type) {\n      <tsl-badge design=\"flat-outline\" color=\"lime\">\n        <span class=\"truncate\">{{ type.label }}</span>\n      </tsl-badge>\n    }\n  </div>\n\n  <div class=\"justify-self-start grid grid-rows-[auto,auto] grid-flow-col gap-x-6 text-sm overflow-hidden\">\n    @for (property of document().properties; let last = $last; track property.propertyId) {\n      <div class=\"opacity-80 font-semibold truncate\">{{ property.label }}</div>\n      <div tslPropertyValue [property]=\"property\" class=\"truncate opacity-70\"></div>\n    }\n  </div>\n\n  <div>\n    <div class=\"opacity-80 font-semibold text-sm\">Akten</div>\n    <div class=\"flex gap-2\">\n      @for (collection of document().assignments.collections; track collection.collection.id) {\n        <div class=\"flex items-center gap-1 opacity-70\">\n          <tsl-icon icon=\"folder\" size=\"xs\"></tsl-icon>\n          <span>{{ collection.collection.name }}</span>\n        </div>\n      } @empty {\n        <span class=\"opacity-70\">Keine Akten zugeordnet</span>\n      }\n    </div>\n  </div>\n\n  <div class=\"overflow-hidden\">\n    <div class=\"flex gap-2 w-full\">\n      @for (tag of document().tags; track tag) {\n        <tsl-badge design=\"flat-outline\" color=\"emerald\" size=\"small\">\n          <span class=\"truncate\">{{ tag.label }}</span>\n        </tsl-badge>\n      }\n    </div>\n\n    <hr class=\"my-1.5 border-t-[1.5px] border-neutral-500/40\" />\n\n    <div>\n      <div class=\"flex justify-between items-start\">\n        <div class=\"flex items-start gap-4 text-sm opacity-70\">\n          <div class=\"flex gap-2 items-center\">\n            <tsl-icon icon=\"person\"></tsl-icon>\n            <span>Hans Muster</span>\n          </div>\n\n          <div class=\"flex gap-2 items-center\">\n            <tsl-icon icon=\"calendar-event\"></tsl-icon>\n            <span>{{ document().metadata.createTimestamp | dateTimeLocale: dateShort }}</span>\n          </div>\n        </div>\n\n        <div class=\"col-start-2 justify-self-end self-start flex gap-2 items-start text-nowrap\">\n          <tsl-badge design=\"flat-outline\" size=\"small\" pill=\"true\" dot=\"true\" color=\"amber\" class=\"uppercase\">{{ getMimeTypeExtensions(document().mimeType)[0] }}</tsl-badge>\n          <tsl-badge design=\"flat-outline\" size=\"small\" pill=\"true\" dot=\"true\" color=\"sky\">{{ formatBytes(document().size) }}</tsl-badge>\n\n          @if (document().pages; as pages) {\n            <tsl-badge design=\"flat-outline\" size=\"small\" pill=\"true\" dot=\"true\" color=\"emerald\" class=\"text-nowrap\">\n              <span>{{ pages }} Seite{{ pages > 1 ? 'n' : '' }}</span>\n            </tsl-badge>\n          }\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"relative inset-0 rounded-r-[inherit] overflow-clip\">\n  <div class=\"absolute inset-0 border-l-2 rounded-r-[inherit]\">\n    @defer (on viewport) {\n      <img [src]=\"previewUrl()\" alt=\"Document preview\" class=\"w-full h-full block object-cover object-top dark:filter dark:opacity-85\" />\n    } @placeholder {\n      <div class=\"w-full h-full\"></div>\n    }\n  </div>\n</div>\n\n@if (\n  (currentWorkflow?.step == 'content-extraction' || currentWorkflow?.step == 'classification' || currentWorkflow?.step == 'data-extraction') &&\n  (currentWorkflow?.state == 'pending' || currentWorkflow?.state == 'running')\n) {\n  <div class=\"absolute inset-0 flex justify-center items-center text-neutral-50 bg-black/40 animate-pulse\">\n    {{ currentWorkflow?.step == 'classification' ? 'Klassifikation...' : 'Extraktion...' }}\n  </div>\n}\n\n<ng-content></ng-content>\n","import { Dialog } from '@angular/cdk/dialog';\nimport { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, ErrorHandler, inject, input, signal, ViewEncapsulation } from '@angular/core';\nimport { DropDirective, fadeInOutAnimation } from '@tstdl/angular';\nimport { enterAnimation } from '@tstdl/angular/animations';\nimport { IconComponent } from '@tstdl/angular/icon';\nimport { DocumentAssignmentTarget } from '@tstdl/base/document-management';\nimport { getHttpStatusMessage } from '@tstdl/base/http';\nimport { isDefined, isUndefined } from '@tstdl/base/utils';\n\nimport type { DocumentManagementContext } from '../../context';\nimport { DocumentDetailsComponent } from '../document-details/document-details.component';\nimport { DocumentWorkflowStateComponent } from '../document-workflow-state/document-workflow-state.component';\nimport { DocumentListDocumentComponent } from './document-list-document/document-list-document.component';\n\ntype PendingUpload = {\n  file: File,\n};\n\n@Component({\n  selector: 'tsl-document-list',\n  imports: [NgClass, DocumentListDocumentComponent, IconComponent, DocumentWorkflowStateComponent],\n  templateUrl: './document-list.component.html',\n  styleUrl: './document-list.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  hostDirectives: [DropDirective],\n  animations: [fadeInOutAnimation(), enterAnimation()],\n  host: {\n    class: 'tsl-tw',\n  },\n})\nexport class DocumentListComponent {\n  readonly #dialog = inject(Dialog);\n  readonly #errorHandler = inject(ErrorHandler);\n\n  readonly drop = inject(DropDirective);\n  readonly disableEnterAnimation = signal(true);\n\n  uploadsRunning = false;\n\n  readonly context = input.required<DocumentManagementContext>();\n  readonly showWorkflowState = input(true);\n\n  readonly pendingDocuments = computed(() => this.context().filteredDocuments()?.filter((document) => document.approval == 'pending'));\n  readonly pendingUploads = signal([] as PendingUpload[]);\n\n  constructor() {\n    this.drop.filesDropped.subscribe((files) => this.onFilesDropped(files));\n\n    let dataCounter = 0;\n    const effectRef = effect(() => {\n      if (isDefined(this.context().data()) && (++dataCounter >= 2)) {\n        this.disableEnterAnimation.set(false);\n        effectRef.destroy();\n      }\n    });\n  }\n\n  onFilesDropped(files: File[]): void {\n    this.pendingUploads.update((existing) => [...existing, ...files.map((file) => ({ file }))]);\n    void this.handleUploads();\n  }\n\n  async handleUploads(): Promise<void> {\n    if (this.uploadsRunning) {\n      return;\n    }\n\n    this.uploadsRunning = true;\n\n    try {\n      while (true) {\n        const upload = this.pendingUploads()[0];\n\n        if (isUndefined(upload)) {\n          break;\n        }\n\n        try {\n          const { uploadId, uploadUrl } = await this.context().api.initiateDocumentUpload({ contentLength: upload.file.size });\n\n          const response = await fetch(uploadUrl, {\n            method: 'PUT',\n            body: upload.file,\n          });\n\n          if (!response.ok) {\n            throw new Error(`Failed to upload file: ${response.status} ${getHttpStatusMessage(response.status)}`);\n          }\n\n          await this.context().api.createDocument({\n            uploadId,\n            originalFileName: upload.file.name,\n            assignment: { automatic: { scope: this.context().collectionIds(), target: DocumentAssignmentTarget.Collection } },\n          });\n        }\n        catch (error) {\n          this.#errorHandler.handleError(error);\n        }\n        finally {\n          this.pendingUploads.update((uploads) => uploads.filter((u) => u !== upload));\n          // this.context().reload();\n        }\n      }\n    }\n    finally {\n      this.uploadsRunning = false;\n    }\n  }\n\n  async openDocument(documentId: string): Promise<void> {\n    await DocumentDetailsComponent.open({\n      context: this.context(),\n      documentId,\n    }, this.#dialog);\n  }\n}\n","@if (context().isLoading()) {\n  <div class=\"flex justify-center items-center h-full\">Loading...</div>\n} @else {\n  <div class=\"grid gap-x-2 gap-y-4\" [ngClass]=\"{ 'grid-cols-1': !showWorkflowState(), 'grid-cols-[1fr,auto]': showWorkflowState() }\">\n    @for (document of pendingDocuments(); track document.id) {\n      @defer (on viewport; on idle) {\n        <tsl-document-list-document\n          @enter\n          [@.disabled]=\"disableEnterAnimation()\"\n          [context]=\"context()\"\n          [document]=\"document\"\n          (click)=\"openDocument(document.id)\"\n          class=\"hover:cursor-pointer bg-neutral-100 dark:bg-neutral-800 hover:outline outline-2 outline-offset-4 outline-accent-600 dark:outline-accent-400 shadow\"\n          [class.rounded-r-none]=\"showWorkflowState()\" />\n\n        @if (showWorkflowState()) {\n          <div class=\"relative w-96 h-full\">\n            <tsl-document-workflow-state\n              @enter\n              [@.disabled]=\"disableEnterAnimation()\"\n              [context]=\"context()\"\n              [document]=\"document\"\n              class=\"absolute inset-0 bg-neutral-100 dark:bg-neutral-800 shadow rounded-l-none\"></tsl-document-workflow-state>\n          </div>\n        }\n      } @placeholder {\n        <div class=\"col-span-2 h-64\"></div>\n      }\n    }\n  </div>\n\n  @if (drop.isOver()) {\n    <div @fadeInOut class=\"fixed inset-0 bg-black/40\">\n      <div class=\"absolute inset-2 flex flex-col justify-center items-center gap-4 text-neutral-50 border-4 border-dashed border-neutral-50 rounded-md pointer-events-none\">\n        <div class=\"animate-bounce\">\n          <tsl-icon icon=\"upload\" size=\"6xl\"></tsl-icon>\n        </div>\n        <div class=\"text-lg\">Dokumente hierher ziehen</div>\n      </div>\n    </div>\n  }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, input, signal, untracked, ViewEncapsulation } from '@angular/core';\nimport { DateTimeLocalePipe, LocalizeEnumPipe } from '@tstdl/angular';\nimport { enterAnimation } from '@tstdl/angular/animations';\nimport { BadgeComponent } from '@tstdl/angular/badge';\nimport { ButtonComponent } from '@tstdl/angular/button';\nimport { IconComponent, type IconName } from '@tstdl/angular/icon';\nimport { DocumentWorkflowFailReason, DocumentWorkflowState, DocumentWorkflowStep, type EnrichedDocument } from '@tstdl/base/document-management';\nimport { dateTimeNumeric } from '@tstdl/base/formats';\nimport { enumValues } from '@tstdl/base/utils';\nimport { fromEntries } from '@tstdl/base/utils/object';\n\nimport type { DocumentManagementContext } from '../../context';\n\nconst workflowStateColors = {\n  [DocumentWorkflowState.Pending]: 'yellow',\n  [DocumentWorkflowState.Running]: 'blue',\n  [DocumentWorkflowState.Review]: 'amber',\n  [DocumentWorkflowState.Completed]: 'emerald',\n  [DocumentWorkflowState.Error]: 'red',\n  [DocumentWorkflowState.Failed]: 'red',\n  none: 'neutral',\n} as const satisfies Record<DocumentWorkflowState | 'none', string>;\n\nconst workflowStateClasses = {\n  [DocumentWorkflowState.Pending]: 'text-yellow-500',\n  [DocumentWorkflowState.Running]: 'text-blue-500',\n  [DocumentWorkflowState.Review]: 'text-amber-500',\n  [DocumentWorkflowState.Completed]: 'text-emerald-500',\n  [DocumentWorkflowState.Error]: 'text-red-500',\n  [DocumentWorkflowState.Failed]: 'text-red-500',\n  none: 'neutral',\n} as const satisfies Record<DocumentWorkflowState | 'none', string>;\n\nconst workflowStepIcons: Record<DocumentWorkflowStep, IconName> = {\n  [DocumentWorkflowStep.ContentExtraction]: 'book-half',\n  [DocumentWorkflowStep.Classification]: 'tags',\n  [DocumentWorkflowStep.DataExtraction]: 'file-earmark-break',\n  [DocumentWorkflowStep.Assignment]: 'folder2-open',\n  [DocumentWorkflowStep.Validation]: 'clipboard-check',\n} as const satisfies Record<DocumentWorkflowStep, IconName>;\n\nconst workflowSteps = enumValues(DocumentWorkflowStep);\n\n@Component({\n  selector: 'tsl-document-workflow-state',\n  imports: [LocalizeEnumPipe, DateTimeLocalePipe, BadgeComponent, IconComponent, ButtonComponent],\n  templateUrl: './document-workflow-state.component.html',\n  styleUrl: './document-workflow-state.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  animations: [enterAnimation()],\n  host: {\n    class: 'tsl-tw',\n  },\n})\nexport class DocumentWorkflowStateComponent {\n  readonly context = input.required<DocumentManagementContext>();\n  readonly document = input.required<EnrichedDocument>();\n\n  readonly stateColors = workflowStateColors;\n  readonly stateClasses = workflowStateClasses;\n  readonly stepIcons = workflowStepIcons;\n  readonly workflowSteps = workflowSteps;\n  readonly DocumentWorkflowStep = DocumentWorkflowStep;\n  readonly DocumentWorkflowState = DocumentWorkflowState;\n  readonly DocumentWorkflowFailReason = DocumentWorkflowFailReason;\n  readonly dateTimeNumeric = dateTimeNumeric;\n\n  readonly selectedWorkflowStep = signal<DocumentWorkflowStep | null>(null);\n  readonly selectedWorkflow = computed(() => this.document().workflows.find((workflow) => workflow.step == this.selectedWorkflowStep()) ?? null);\n\n  readonly lastStepStates = computed(() => {\n    const entries = workflowSteps.map((step) => {\n      const workflow = this.document().workflows.find((workflow) => workflow.step == step);\n      return [step, workflow?.state ?? 'none'] as const;\n    });\n\n    return fromEntries(entries);\n  });\n\n  constructor() {\n    const latestWorkflowId = computed(() => this.document().workflows[0]?.id ?? null);\n\n    effect(() => {\n      latestWorkflowId();\n\n      const latestWorkflow = untracked(this.document).workflows[0];\n      this.selectedWorkflowStep.set(latestWorkflow?.step ?? DocumentWorkflowStep.Classification);\n    });\n  }\n}\n","@if (selectedWorkflow(); as workflow) {\n  <div class=\"p-4\">\n    <div class=\"flex justify-between mb-2\">\n      <div class=\"font-semibold text-base\">{{ workflow.step | localizeEnum: DocumentWorkflowStep }}</div>\n      <tsl-badge design=\"flat-outline\" [color]=\"stateColors[workflow.state]\">{{ workflow.state | localizeEnum: DocumentWorkflowState }}</tsl-badge>\n    </div>\n\n    <div class=\"space-y-2 text-sm\">\n      <div>\n        <div class=\"font-semibold opacity-80\">Start</div>\n        <div class=\"opacity-70\">{{ workflow.metadata.createTimestamp | dateTimeLocale: dateTimeNumeric }}</div>\n      </div>\n\n      @if (workflow.completeTimestamp; as completeTimestamp) {\n        <div>\n          <div class=\"font-semibold opacity-80\">Completed</div>\n          <div class=\"opacity-70\">{{ completeTimestamp | dateTimeLocale: dateTimeNumeric }}</div>\n        </div>\n\n        <div>\n          <div class=\"font-semibold opacity-80\">Completed by</div>\n          <div class=\"opacity-70\">Max Mustermann</div>\n        </div>\n      }\n\n      @if (workflow.state == DocumentWorkflowState.Failed) {\n        <div>\n          <div class=\"text-red-500 font-semibold opacity-80\">Fehler:</div>\n          <div class=\"opacity-70\">{{ workflow.failReason | localizeEnum: DocumentWorkflowFailReason }}</div>\n        </div>\n      }\n    </div>\n  </div>\n}\n\n<div class=\"flex flex-col border-l border-neutral-400 dark:border-neutral-500/75\">\n  @for (step of workflowSteps; let last = $last; track step) {\n    @let state = lastStepStates()[step];\n\n    <button\n      tslButton\n      [color]=\"'neutral'\"\n      [class.bg-transparent]=\"step == selectedWorkflow()?.step\"\n      [class.animate-pulse]=\"state == DocumentWorkflowState.Running\"\n      [disabled]=\"state == 'none'\"\n      class=\"relative grow p-4 rounded-none\"\n      (click)=\"selectedWorkflowStep.set(step)\">\n      <tsl-icon [icon]=\"stepIcons[step]\"></tsl-icon>\n\n      @if (state != 'none') {\n        <tsl-badge design=\"flat-outline\" size=\"small\" dot=\"true\" [color]=\"stateColors[state]\" class=\"absolute justify-center w-4 h-4 p-0 top-1 right-1\"></tsl-badge>\n      }\n\n      @if (state == DocumentWorkflowState.Running) {\n        <div class=\"absolute inset-0 flex items-center justify-center\">\n          <div class=\"loader\"></div>\n        </div>\n      }\n    </button>\n\n    @if (!last) {\n      <hr class=\"border-neutral-400 dark:border-neutral-500/75\" />\n    }\n  }\n</div>\n","import { linkedSignal, signal, type WritableSignal } from '@angular/core';\nimport { isFunction, type ValueOrProvider } from '@tstdl/base/utils';\n\nexport type DocumentFilterInputs = {\n  searchText?: ValueOrProvider<string | null>,\n  collections?: ValueOrProvider<string[]>,\n  categories?: ValueOrProvider<(string | null)[]>,\n  types?: ValueOrProvider<(string | null)[]>,\n  tags?: ValueOrProvider<string[]>,\n};\n\nexport class DocumentFilter {\n  readonly searchText: WritableSignal<string | null>;\n  readonly collections: WritableSignal<string[]>;\n  readonly categories: WritableSignal<(string | null)[]>;\n  readonly types: WritableSignal<(string | null)[]>;\n  readonly tags: WritableSignal<string[]>;\n\n  constructor(inputs?: DocumentFilterInputs) {\n    this.searchText = isFunction(inputs?.searchText)\n      ? linkedSignal(inputs.searchText)\n      : signal(inputs?.searchText ?? '');\n\n    this.collections = isFunction(inputs?.collections)\n      ? linkedSignal(inputs.collections)\n      : signal(inputs?.collections ?? []);\n\n    this.categories = isFunction(inputs?.categories)\n      ? linkedSignal(inputs.categories)\n      : signal(inputs?.categories ?? []);\n\n    this.types = isFunction(inputs?.types)\n      ? linkedSignal(inputs.types)\n      : signal(inputs?.types ?? []);\n\n    this.tags = isFunction(inputs?.tags)\n      ? linkedSignal(inputs.tags)\n      : signal(inputs?.tags ?? []);\n  }\n}\n\nexport function documentFilter(inputs?: DocumentFilterInputs): DocumentFilter {\n  return new DocumentFilter(inputs);\n}\n","import { inject, Injectable, type Signal } from '@angular/core';\nimport { AuthenticationClientService } from '@tstdl/base/authentication';\nimport type { Policy } from '@tstdl/base/document-management';\nimport { toSignal } from '@tstdl/base/signals';\nimport type { TypedOmit } from '@tstdl/base/types';\nimport { isUndefined } from '@tstdl/base/utils';\nimport { switchMap, type Observable } from 'rxjs';\n\nimport { DocumentManagementApiService } from '../api';\n\n/**\n * This service forwards authorization checks to the backend.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class ForwardingDocumentManagementAuthorizationService {\n  readonly #authenticationService = inject(AuthenticationClientService);\n  readonly #api = inject(DocumentManagementApiService);\n  readonly #cache = new Map<`${string}:${string}`, Observable<boolean>>();\n\n  canReadCollection(collectionId: string): Signal<boolean> {\n    return this.getSignal('canReadCollection', { collectionId });\n  }\n\n  canCreateDocuments(collectionId: string): Signal<boolean> {\n    return this.getSignal('canCreateDocuments', { collectionId });\n  }\n\n  canUpdateDocument(documentId: string): Signal<boolean> {\n    return this.getSignal('canUpdateDocument', { documentId });\n  }\n\n  canDeleteDocuments(collectionId: string): Signal<boolean> {\n    return this.getSignal('canDeleteDocuments', { collectionId });\n  }\n\n  canAssignDocuments(collectionId: string): Signal<boolean> {\n    return this.getSignal('canAssignDocuments', { collectionId });\n  }\n\n  canManageRequests(collectionId: string): Signal<boolean> {\n    return this.getSignal('canManageRequests', { collectionId });\n  }\n\n  canApproveDocument(documentId: string): Signal<boolean> {\n    return this.getSignal('canApproveDocument', { documentId });\n  }\n\n  canRejectDocument(documentId: string): Signal<boolean> {\n    return this.getSignal('canRejectDocument', { documentId });\n  }\n\n  canProgressDocumentWorkflow(documentId: string): Signal<boolean> {\n    return this.getSignal('canProgressDocumentWorkflow', { documentId });\n  }\n\n  canManageCategoriesAndTypes(): Signal<boolean> {\n    return this.getSignal('canManageCategoriesAndTypes', {});\n  }\n\n  canReadDocumentRequestsTemplates(): Signal<boolean> {\n    return this.getSignal('canReadDocumentRequestsTemplates', {});\n  }\n\n  canManageDocumentRequestsTemplates(): Signal<boolean> {\n    return this.getSignal('canManageDocumentRequestsTemplates', {});\n  }\n\n  canManageValidationDefinitions(): Signal<boolean> {\n    return this.getSignal('canManageValidationDefinitions', {});\n  }\n\n  private getSignal<Type extends Policy['type']>(type: Type, parameters: TypedOmit<Extract<Policy, { type: Type }>, 'type'>): Signal<boolean> {\n    const cacheKey = `canReadCollection:${JSON.stringify(parameters)}` as const;\n    let allowed$ = this.#cache.get(cacheKey);\n\n    if (isUndefined(allowed$)) {\n      allowed$ = this.#authenticationService.subjectId$.pipe(\n        switchMap(async (subjectId) => {\n          if (isUndefined(subjectId)) {\n            return false;\n          }\n\n          console.log('ForwardingDocumentManagementAuthorizationService: Forwarding authorization check', type, parameters);\n          return await this.#api.testAuthorization({ type, ...parameters } as Policy);\n        })\n      );\n\n      this.#cache.set(cacheKey, allowed$);\n    }\n\n    return toSignal(allowed$, { initialValue: false });\n  }\n}\n","import { computed, inject, Injector, linkedSignal, resource, signal, type ResourceRef, type ResourceStreamItem, type WritableSignal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport type { BadgeColor } from '@tstdl/angular/badge';\nimport type { ButtonColor } from '@tstdl/angular/button';\nimport { CancellationToken } from '@tstdl/base/cancellation';\nimport { getDocumentManagementFolders, toEnrichedDocumentManagementData, type DocumentManagementData } from '@tstdl/base/document-management';\nimport { defer, map } from '@tstdl/base/signals';\nimport { isArray, isFunction, isUndefined, type ValueOrProvider } from '@tstdl/base/utils';\nimport { fromEntries } from '@tstdl/base/utils/object';\nimport { normalizeText } from '@tstdl/base/utils/string';\nimport { from, map as rxjsMap, takeUntil } from 'rxjs';\n\nimport { DocumentManagementApiService } from './api';\nimport { documentFilter, type DocumentFilter, type DocumentFilterInputs } from './filter';\nimport { ForwardingDocumentManagementAuthorizationService } from './services';\n\nexport type DocumentManagementContextInputs = {\n  collectionIds: ValueOrProvider<string[]>,\n  filter?: DocumentFilterInputs,\n  wrapCollections?: ValueOrProvider<boolean | undefined>,\n};\n\nconst colors = [\n  'amber',\n  'lime',\n  'cyan',\n  'purple',\n  'yellow',\n  'green',\n  'sky',\n  'fuchsia',\n  'emerald',\n  'blue',\n  'pink',\n  'teal',\n  'indigo',\n  'rose',\n] as const satisfies (BadgeColor & ButtonColor)[];\n\nexport class DocumentManagementContext {\n  readonly #injector = inject(Injector);\n  readonly api = inject(DocumentManagementApiService);\n  readonly authorizationService = inject(ForwardingDocumentManagementAuthorizationService);\n  readonly collectionIds: WritableSignal<string[]>;\n  readonly wrapCollections: WritableSignal<boolean | undefined>;\n  readonly filter: DocumentFilter;\n\n  readonly rawData: ResourceRef<DocumentManagementData | undefined>;\n\n  readonly data = defer(() => map(this.rawData.value, (data) => isUndefined(data) ? undefined : toEnrichedDocumentManagementData(data)));\n  readonly folders = defer(() => map(this.data, (data) => isUndefined(data) ? undefined : getDocumentManagementFolders(data, { wrapCollections: this.wrapCollections() })));\n\n  readonly filteredDocuments = map(this.data, (data) => {\n    const searchTexts = normalizeText(this.filter.searchText() ?? '').split(' ').map((text) => text.trim()).filter((text) => text.length > 0);\n    const collections = this.filter.collections();\n    const categories = this.filter.categories();\n    const types = this.filter.types();\n    const tags = this.filter.tags();\n\n    return data?.documents.filter((document) => {\n      if (collections.length > 0) {\n        const hasCollection = document.assignments.collections.some((assignment) => collections.includes(assignment.collection.id));\n\n        if (!hasCollection) {\n          return false;\n        }\n      }\n\n      if (categories.length > 0) {\n        const documentCategoryId = document.type?.category.id ?? null;\n        const hasCategory = categories.includes(documentCategoryId);\n\n        if (!hasCategory) {\n          return false;\n        }\n      }\n\n      if (types.length > 0) {\n        const documentTypeId = document.type?.id ?? null;\n        const hasType = types.includes(documentTypeId);\n\n        if (!hasType) {\n          return false;\n        }\n      }\n\n      if (tags.length > 0) {\n        const hasTag = document.tags.some((tag) => tags.includes(tag.id));\n\n        if (!hasTag) {\n          return false;\n        }\n      }\n\n      if (searchTexts.length > 0) {\n        const collectionTexts = document.assignments.collections.map((assignment) => assignment.collection.name);\n        const categoryText = document.type?.category.label ?? '';\n        const typeText = document.type?.label ?? '';\n        const tagTexts = document.tags.map((tag) => tag.label);\n        const propertyTexts = document.properties.map((property) => String(property.value));\n        const documentText = normalizeText([document.title, document.subtitle, document.summary, document.comment, document.originalFileName, ...collectionTexts, categoryText, typeText, ...tagTexts, ...propertyTexts].join(' '));\n        const normalizedDocumentText = normalizeText(documentText);\n\n        for (const searchText of searchTexts) {\n          if (!normalizedDocumentText.includes(searchText)) {\n            return false;\n          }\n        }\n      }\n\n      return true;\n    });\n  });\n\n  readonly hasValue = computed(() => this.rawData.hasValue());\n  readonly isLoading = defer(() => this.rawData.isLoading);\n\n  readonly categoryColors = computed(() => {\n    const entries = this.data()?.rootCategories.flatMap((category, index) => {\n      const color = colors[index % colors.length]!;\n\n      const children = category.childrenDeep.map((child) => [child.id, color] as const);\n      return [[category.id, color], ...children] as const;\n    });\n\n    return fromEntries(entries ?? []);\n  });\n\n  constructor({ collectionIds, filter, wrapCollections }: DocumentManagementContextInputs) {\n    this.collectionIds = isFunction(collectionIds) ? linkedSignal(collectionIds) : signal(collectionIds);\n    this.wrapCollections = isFunction(wrapCollections) ? linkedSignal(wrapCollections) : signal(wrapCollections);\n    this.filter = documentFilter(filter);\n    this.rawData = this.#getRawDataResource();\n  }\n\n  reload(): void {\n    this.rawData.reload();\n  }\n\n  #getRawDataResource() {\n    return resource({\n      params: this.collectionIds,\n      stream: async ({ params: collectionIds, abortSignal }) => {\n        if (collectionIds.length == 0) {\n          return computed(() => ({ value: undefined }));\n        }\n\n        const data$ = await this.api.getDataStream({ collectionIds });\n\n        const cancelToken = CancellationToken.from(abortSignal);\n\n        const resourceStreamItem$ = data$.pipe(\n          takeUntil(from(cancelToken)),\n          rxjsMap((value): ResourceStreamItem<DocumentManagementData | undefined> => ({ value }))\n        );\n\n        return toSignal(\n          resourceStreamItem$,\n          { injector: this.#injector, initialValue: { value: undefined } satisfies ResourceStreamItem<DocumentManagementData | undefined> }\n        );\n      },\n    });\n  }\n}\n\nexport function documentManagementContext(collectionIdsOrInputs: DocumentManagementContextInputs['collectionIds'] | DocumentManagementContextInputs): DocumentManagementContext {\n  const input = (isArray(collectionIdsOrInputs) || isFunction(collectionIdsOrInputs)) ? { collectionIds: collectionIdsOrInputs } : collectionIdsOrInputs;\n  return new DocumentManagementContext(input);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","toSignal","map","rxjsMap"],"mappings":"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"}