{"version":3,"file":"yuuvis-client-framework-sort.mjs","sources":["../../../../../libs/yuuvis/client-framework/sort/src/lib/sort/sort.component.ts","../../../../../libs/yuuvis/client-framework/sort/src/yuuvis-client-framework-sort.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, effect, inject, input, linkedSignal, output, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDivider } from '@angular/material/divider';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { SystemService, TranslateService } from '@yuuvis/client-core';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\nimport { SortMenuOption, SortType } from './models';\n\nconst MATERIAL_MODULES = [MatTooltip, MatIconModule, MatMenuModule, MatButtonModule, MatDivider];\n\n@Component({\n  selector: 'yuv-sort',\n  imports: [YmtIconButtonDirective, ...MATERIAL_MODULES],\n  template: `<button\n      ymt-icon-button\n      [icon-button-size]=\"small() ? 'small' : 'medium'\"\n      [matTooltip]=\"tooltip()\"\n      matTooltipPosition=\"below\"\n      [matMenuTriggerFor]=\"menu\"\n      [attr.aria-label]=\"tooltip()\"\n    >\n      <mat-icon>swap_vert</mat-icon>\n    </button>\n\n    <mat-menu #menu=\"matMenu\" class=\"sort-menu\" [ariaLabel]=\"tooltip()\">\n      @for (option of sortFields(); track $index) {\n        <button\n          mat-menu-item\n          class=\"sort-menu-item\"\n          [class.selected]=\"option.selected\"\n          (click)=\"selectSort(option)\"\n          [attr.aria-label]=\"option.label\"\n          [matTooltip]=\"option.label\"\n          matTooltipPosition=\"right\"\n        >\n          <mat-icon>{{ option.selected ? 'radio_button_checked' : '' }}</mat-icon>\n          <span>{{ option.label }}</span>\n        </button>\n        @if (sortFields().length - 3 === $index) {\n          <mat-divider />\n        }\n      }\n    </mat-menu>`,\n  styleUrls: ['./sort.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SortComponent {\n  readonly #systemService = inject(SystemService);\n  readonly translate = inject(TranslateService);\n\n  tooltip = signal<string>(this.translate.instant('yuv.sort.tooltip'));\n\n  sortOptions = input<string[]>([]);\n  selectedSortOption = input<{ field: string; order: SortType } | undefined>(undefined);\n  storageKey = input<string>();\n  // If true, renders a smaller icon button\n  small = input<boolean>(false);\n  sortChanged = output<{ field: string; order: SortType }>();\n\n  orderOptions = signal<SortMenuOption[]>([\n    { label: this.translate.instant('yuv.sort.ascending'), value: 'asc', type: 'order', selected: true },\n    { label: this.translate.instant('yuv.sort.descending'), value: 'desc', type: 'order', selected: false }\n  ]);\n\n  #rememberSort = effect(() => {\n    const storageKey = this.storageKey();\n    if (storageKey) {\n      const storage = localStorage.getItem(storageKey);\n      if (storage) {\n        try {\n          const data = JSON.parse(storage);\n          this.sortFields.update((fields) => {\n            const updated = fields.map((field) =>\n              field.type === 'sort' && field.value === data.field\n                ? { ...field, selected: true }\n                : field.type === 'order' && field.value === data.order\n                  ? { ...field, selected: true }\n                  : { ...field, selected: false }\n            );\n\n            // Fallback: if no sort field matched, select the first one\n            const hasSortSelected = updated.some((opt) => opt.type === 'sort' && opt.selected);\n            if (!hasSortSelected) {\n              const firstSortIndex = updated.findIndex((opt) => opt.type === 'sort');\n              if (firstSortIndex !== -1) {\n                updated[firstSortIndex] = { ...updated[firstSortIndex], selected: true };\n              }\n            }\n\n            return updated;\n          });\n        } catch (error) {\n          console.error('Error parsing sort data from localStorage:', error);\n        }\n      }\n    }\n  });\n\n  #reEvaluate = signal<Date | null>(null);\n  sortFields = linkedSignal({\n    source: () => ({\n      sortOptions: this.sortOptions(),\n      orderOptions: this.orderOptions(),\n      selectedSortOption: this.selectedSortOption(),\n      evaluate: this.#reEvaluate()\n    }),\n    computation: ({ sortOptions, orderOptions, selectedSortOption }) => {\n      // Ensure selectedSortOption.field is present in sortOptions\n      if (selectedSortOption?.field && !sortOptions.includes(selectedSortOption.order)) {\n        orderOptions = orderOptions.map((order) =>\n          order.value === selectedSortOption.order ? { ...order, selected: true } : { ...order, selected: false }\n        );\n      }\n      return [\n        ...sortOptions.map((value, index) => ({\n          value,\n          label: this.#systemService.getLocalizedLabel(value) || value,\n          type: 'sort' as const,\n          selected: index === 0 // first sort option is default\n        })),\n        ...orderOptions\n      ];\n    }\n  });\n\n  constructor() {\n    this.translate.onLangChange.pipe(takeUntilDestroyed()).subscribe({ next: () => this.#reEvaluate.set(new Date()) });\n  }\n\n  selectSort(option: SortMenuOption): void {\n    this.sortFields.update((fields) =>\n      fields.map((field) => (field.type === option.type ? { ...field, selected: field.value === option.value } : field))\n    );\n    const selectedFields = this.sortFields().filter((field) => field.selected);\n    const fields = selectedFields.reduce(\n      (acc, field) => {\n        if (field.type === 'sort') acc.field = field.value;\n        if (field.type === 'order') acc.order = field.value as SortType;\n        return acc;\n      },\n      { field: '', order: 'asc' as SortType }\n    );\n\n    const storageKey = this.storageKey();\n    // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n    storageKey && localStorage.setItem(storageKey, JSON.stringify(fields));\n    this.sortChanged.emit(fields);\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}