@mesgflow/ui-kit 0.10.0 → 0.11.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"mesgflow-ui-kit-table.mjs","sources":["../../../projects/ui-kit/table/query-contract.model.ts","../../../projects/ui-kit/table/table-client-query.ts","../../../projects/ui-kit/table/table-column-resize.ts","../../../projects/ui-kit/table/table-columns-menu.ts","../../../projects/ui-kit/table/table-columns-menu.html","../../../projects/ui-kit/table/table-filter-labels.ts","../../../projects/ui-kit/table/table-filter.model.ts","../../../projects/ui-kit/table/table-filter-menu.ts","../../../projects/ui-kit/table/table-filter-menu.html","../../../projects/ui-kit/table/table-filter-bar.ts","../../../projects/ui-kit/table/table-filter-bar.html","../../../projects/ui-kit/table/table-page-jump.ts","../../../projects/ui-kit/table/table-page-jump.html","../../../projects/ui-kit/table/table-pagination.ts","../../../projects/ui-kit/table/table-pagination.html","../../../projects/ui-kit/table/table-virtual.ts","../../../projects/ui-kit/table/table.ts","../../../projects/ui-kit/table/table.html","../../../projects/ui-kit/table/mesgflow-ui-kit-table.ts"],"sourcesContent":["export enum SortDirection {\r\n Ascending = 0,\r\n Descending = 1,\r\n}\r\n\r\nexport enum FilterOperator {\r\n Equal = 0,\r\n NotEqual = 1,\r\n GreaterThan = 2,\r\n GreaterOrEqual = 3,\r\n LessThan = 4,\r\n LessOrEqual = 5,\r\n Contains = 6,\r\n StartsWith = 7,\r\n EndsWith = 8,\r\n In = 9,\r\n IsNull = 10,\r\n IsNotNull = 11,\r\n}\r\n\r\nexport enum FilterLogic {\r\n And = 0,\r\n Or = 1,\r\n}\r\n\r\nexport interface SortDescriptor {\r\n field: string;\r\n direction: SortDirection;\r\n}\r\n\r\nexport interface FilterCondition {\r\n field: string;\r\n operator: FilterOperator;\r\n value?: unknown;\r\n}\r\n\r\nexport interface FilterGroup {\r\n logic: FilterLogic;\r\n conditions?: FilterCondition[];\r\n groups?: FilterGroup[];\r\n}\r\n\r\nexport const DEFAULT_PAGE_SIZE = 20;\r\nexport const MAX_PAGE_SIZE = 100;\r\n\r\nexport interface PageRequest {\r\n pageNumber: number;\r\n pageSize: number;\r\n}\r\n\r\nexport interface PagedResult<T> {\r\n items: T[];\r\n pageNumber: number;\r\n pageSize: number;\r\n totalCount: number;\r\n totalPages: number;\r\n}\r\n\r\n/** Backend'e giden POST body — `PagedResult`'un istek tarafındaki karşılığı. */\r\nexport interface PagedRequest {\r\n page: PageRequest;\r\n filter?: FilterGroup;\r\n sort?: SortDescriptor[];\r\n}\r\n\r\n/**\r\n * `PagedRequest`'i backend'e giden JSON'un HER ZAMAN aynı şekilde serileştiği\r\n * bir forma indirger. Neden önemli: birçok backend (ör. bu kütüphanenin\r\n * geliştirildiği projedeki caching davranışı) sorgu cache anahtarını\r\n * `JsonSerializer.Serialize(request)` ÜZERİNDEN kuruyor — yani anlamca özdeş\r\n * ama söz dizimsel farklı iki payload (`sort: []` ile `sort` hiç yok; `filter`\r\n * içi boş `conditions: []` ile `filter` hiç yok; property sırası) SUNUCUDA\r\n * AYRI cache girdisi üretir ve invalidation'ın getirisini boşa çıkarır. Bu\r\n * fonksiyon üç şeyi garanti eder: (1) boş `sort`/`filter` her zaman\r\n * `undefined`, dizi değil, (2) `FilterGroup` içindeki boş `conditions`/`groups`\r\n * de `undefined`'a iner (özyinelemeli), (3) tüm nesneler SABİT anahtar\r\n * sırasıyla yeniden kurulur (JS'te string anahtarlı nesnelerde ekleme sırası\r\n * korunur, `JSON.stringify` bunu birebir yansıtır).\r\n */\r\nexport function canonicalPagedRequest(request: {\r\n page: PageRequest;\r\n filter?: FilterGroup;\r\n sort?: SortDescriptor[];\r\n}): PagedRequest {\r\n return {\r\n page: { pageNumber: request.page.pageNumber, pageSize: request.page.pageSize },\r\n filter: canonicalFilterGroup(request.filter),\r\n sort: request.sort?.length\r\n ? request.sort.map((s) => ({ field: s.field, direction: s.direction }))\r\n : undefined,\r\n };\r\n}\r\n\r\nfunction canonicalFilterGroup(group: FilterGroup | undefined): FilterGroup | undefined {\r\n if (!group) return undefined;\r\n\r\n const conditions = group.conditions?.length\r\n ? group.conditions.map((c) => ({ field: c.field, operator: c.operator, value: c.value }))\r\n : undefined;\r\n const groups = group.groups?.map(canonicalFilterGroup).filter((g): g is FilterGroup => !!g);\r\n\r\n if (!conditions && (!groups || groups.length === 0)) return undefined;\r\n\r\n const result: FilterGroup = { logic: group.logic };\r\n if (conditions) result.conditions = conditions;\r\n if (groups?.length) result.groups = groups;\r\n return result;\r\n}\r\n","import {\r\n FilterLogic,\r\n FilterOperator,\r\n SortDirection,\r\n type FilterCondition,\r\n type FilterGroup,\r\n type SortDescriptor,\r\n} from './query-contract.model';\r\n\r\n/**\r\n * `Table`'ın `[clientSide]=\"true\"` modunun sorgu motoru — \"backend'in\r\n * `FilterGroup`/`SortDescriptor` modelini elimde tutuyorum, gerçek sunucu\r\n * yerine bir diziye uyguluyorum\" işini yapıyor; tüketicinin backend'iyle AYNI\r\n * operatör sözleşmesini konuşacak şekilde tasarlandı — bu yüzden burada\r\n * `'between'` gibi UI'a özel sentetik bir operatör YOK: `table-filter.model.ts`'teki\r\n * `buildFilterGroup` çağrıldığı an tarih aralığını zaten gerçek\r\n * `GreaterOrEqual`/`LessOrEqual` çiftine çevirmiş oluyor.\r\n */\r\n\r\nfunction matchesCondition<T>(row: T, condition: FilterCondition): boolean {\r\n const value = (row as unknown as Record<string, unknown>)[condition.field];\r\n const target = condition.value;\r\n\r\n if (condition.operator === FilterOperator.IsNull)\r\n return value === null || value === undefined || value === '';\r\n if (condition.operator === FilterOperator.IsNotNull)\r\n return !(value === null || value === undefined || value === '');\r\n if (condition.operator === FilterOperator.In)\r\n return Array.isArray(target) && target.includes(value);\r\n\r\n // Backend string karşılaştırmalarını Postgres ILIKE (büyük/küçük harf\r\n // duyarsız) ile yapıyor — istemci tarafı aynı davranışı\r\n // `toLocaleLowerCase('tr')` ile taklit ediyor.\r\n if (typeof value === 'string' || typeof target === 'string') {\r\n const v = String(value ?? '').toLocaleLowerCase('tr');\r\n const t = String(target ?? '').toLocaleLowerCase('tr');\r\n switch (condition.operator) {\r\n case FilterOperator.Equal:\r\n return v === t;\r\n case FilterOperator.NotEqual:\r\n return v !== t;\r\n case FilterOperator.Contains:\r\n return v.includes(t);\r\n case FilterOperator.StartsWith:\r\n return v.startsWith(t);\r\n case FilterOperator.EndsWith:\r\n return v.endsWith(t);\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n switch (condition.operator) {\r\n case FilterOperator.Equal:\r\n return value === target;\r\n case FilterOperator.NotEqual:\r\n return value !== target;\r\n case FilterOperator.GreaterThan:\r\n return (value as never) > (target as never);\r\n case FilterOperator.GreaterOrEqual:\r\n return (value as never) >= (target as never);\r\n case FilterOperator.LessThan:\r\n return (value as never) < (target as never);\r\n case FilterOperator.LessOrEqual:\r\n return (value as never) <= (target as never);\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\nexport function matchesFilterGroup<T>(row: T, group: FilterGroup | undefined): boolean {\r\n if (!group) return true;\r\n const results = [\r\n ...(group.conditions ?? []).map((c) => matchesCondition(row, c)),\r\n ...(group.groups ?? []).map((g) => matchesFilterGroup(row, g)),\r\n ];\r\n if (results.length === 0) return true;\r\n return group.logic === FilterLogic.Or ? results.some(Boolean) : results.every(Boolean);\r\n}\r\n\r\n/** Backend `SortExpressionBuilder` gibi ilk alan `OrderBy`, gerisi `ThenBy` — çoklu sıralamayı basamak basamak uygular. */\r\nexport function sortRows<T>(rows: readonly T[], sort: readonly SortDescriptor[] | undefined): T[] {\r\n if (!sort?.length) return [...rows];\r\n return [...rows].sort((a, b) => {\r\n for (const { field, direction } of sort) {\r\n const av = (a as unknown as Record<string, unknown>)[field];\r\n const bv = (b as unknown as Record<string, unknown>)[field];\r\n if (av === bv) continue;\r\n const cmp = av! > bv! ? 1 : -1;\r\n return direction === SortDirection.Descending ? -cmp : cmp;\r\n }\r\n return 0;\r\n });\r\n}\r\n","import { Directive, ElementRef, inject, input, output } from '@angular/core';\r\n\r\nconst KEY_STEP = 16;\r\nconst KEY_STEP_LARGE = 64;\r\n\r\n/**\r\n * `<span mfTableResizeHandle [label]=\"...\" (widthChange)=\"...\" />` — başlık hücresinin sağ kenarındaki\r\n * sürükleme tutamacı. WAI-ARIA \"window splitter\" deseni: `role=\"separator\"` + odaklanabilir +\r\n * `aria-valuenow`; klavyede ←/→ 16px (Shift ile 64px), çift tık / Enter \"içeriğe sığdır\".\r\n *\r\n * Başlangıç genişliği HER hareketin başında ebeveyn `<th>`'nin GERÇEK ölçüsünden okunur —\r\n * tutamaç tablonun genişlik durumunu bilmek zorunda değil. Pointer capture sayesinde imleç\r\n * hücreden çıksa da sürükleme sürer. RTL'de yatay yön ters çevrilir.\r\n */\r\n@Directive({\r\n selector: '[mfTableResizeHandle]',\r\n host: {\r\n role: 'separator',\r\n 'aria-orientation': 'vertical',\r\n tabindex: '0',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.aria-valuenow]': 'width() ?? null',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n class:\r\n 'absolute inset-y-0 end-0 z-[3] w-2 cursor-col-resize touch-none select-none outline-none before:absolute before:inset-y-1.5 before:end-0 before:w-0.5 before:rounded-full before:bg-transparent before:transition-colors before:duration-fast hover:before:bg-border-strong focus-visible:before:bg-focus-ring active:before:bg-accent-fill',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'onPointerUp($event)',\r\n '(pointercancel)': 'onPointerUp($event)',\r\n '(keydown)': 'onKeydown($event)',\r\n '(dblclick)': 'autofit.emit()',\r\n '(click)': '$event.stopPropagation()',\r\n },\r\n})\r\nexport class TableResizeHandle {\r\n readonly label = input.required<string>();\r\n readonly width = input<number>();\r\n readonly min = input(80);\r\n /** ARIA üst sınırı — separator varsayılanı 100 olduğundan px değerleri için açıkça verilir. */\r\n readonly max = input(2000);\r\n\r\n /** İlk hareketten ÖNCE — tablo diğer kolonların genişliğini dondurur (bkz. `Table.freezeWidths`). */\r\n readonly resizeStart = output<void>();\r\n readonly widthChange = output<number>();\r\n readonly autofit = output<void>();\r\n\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private drag: { pointerId: number; startX: number; startWidth: number } | null = null;\r\n\r\n private cellWidth(): number {\r\n return this.host.nativeElement.parentElement?.getBoundingClientRect().width ?? 0;\r\n }\r\n\r\n private direction(): 1 | -1 {\r\n return getComputedStyle(this.host.nativeElement).direction === 'rtl' ? -1 : 1;\r\n }\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (event.button !== 0) return;\r\n event.preventDefault();\r\n this.resizeStart.emit();\r\n this.drag = { pointerId: event.pointerId, startX: event.clientX, startWidth: this.cellWidth() };\r\n this.host.nativeElement.setPointerCapture?.(event.pointerId);\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (!this.drag || event.pointerId !== this.drag.pointerId) return;\r\n const delta = (event.clientX - this.drag.startX) * this.direction();\r\n this.widthChange.emit(Math.max(this.min(), Math.round(this.drag.startWidth + delta)));\r\n }\r\n\r\n protected onPointerUp(event: PointerEvent): void {\r\n if (!this.drag || event.pointerId !== this.drag.pointerId) return;\r\n this.host.nativeElement.releasePointerCapture?.(event.pointerId);\r\n this.drag = null;\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Enter') {\r\n event.preventDefault();\r\n this.autofit.emit();\r\n return;\r\n }\r\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\r\n event.preventDefault();\r\n const step = (event.shiftKey ? KEY_STEP_LARGE : KEY_STEP) * this.direction();\r\n const delta = event.key === 'ArrowRight' ? step : -step;\r\n this.resizeStart.emit();\r\n const start = this.width() ?? this.cellWidth();\r\n this.widthChange.emit(Math.max(this.min(), Math.round(start + delta)));\r\n }\r\n}\r\n","import { CdkOverlayOrigin } from '@angular/cdk/overlay';\r\nimport { Component, computed, inject, input, output } from '@angular/core';\r\nimport { Checkbox } from '@mesgflow/ui-kit/checkbox';\r\nimport { MF_TABLE_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport type { TableColumn } from './table-column.model';\r\n\r\n/**\r\n * Toolbar'daki \"Kolonlar\" düğmesine bağlı basit bir görünürlük paneli.\r\n * Sunucuya HİÇBİR ŞEY göndermez — `Table` `hiddenColumns` sinyalini kendi\r\n * içinde tutar (bkz. table.ts), bu yalnızca o sinyali değiştiren bir UI.\r\n * `primary` işaretli kolon listede hiç görünmez — kimlik kolonu kapatılamaz.\r\n * Panel iskeleti `Popover`'a devredildi (bkz. plan Faz 1c).\r\n */\r\n@Component({\r\n selector: 'mf-table-columns-menu',\r\n imports: [Checkbox, Popover],\r\n host: { class: 'contents' },\r\n templateUrl: './table-columns-menu.html',\r\n})\r\nexport class TableColumnsMenu<T> {\r\n readonly columns = input.required<TableColumn<T>[]>();\r\n readonly hidden = input.required<ReadonlySet<string>>();\r\n readonly origin = input.required<CdkOverlayOrigin>();\r\n readonly open = input.required<boolean>();\r\n readonly label = input<string>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabel = computed(() => this.label() ?? this.tableLabels().columns);\r\n\r\n readonly hiddenChange = output<ReadonlySet<string>>();\r\n readonly closed = output<void>();\r\n\r\n protected readonly toggleable = computed(() =>\r\n this.columns().filter((c) => !c.primary && c.hideable !== false),\r\n );\r\n\r\n protected isHidden(field: string): boolean {\r\n return this.hidden().has(field);\r\n }\r\n\r\n protected toggle(field: string): void {\r\n const next = new Set(this.hidden());\r\n if (next.has(field)) next.delete(field);\r\n else next.add(field);\r\n this.hiddenChange.emit(next);\r\n }\r\n\r\n protected close(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-end\"\r\n padding=\"md\"\r\n panelClass=\"w-56\"\r\n (closed)=\"close()\"\r\n>\r\n <p class=\"mb-1 px-1.5 py-1 text-eyebrow text-fg-subtle\">{{ effectiveLabel() }}</p>\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (column of toggleable(); track column.field) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"!isHidden(column.field)\"\r\n (change)=\"toggle(column.field)\"\r\n />\r\n <span class=\"truncate\">{{ column.header }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n","import type { MfTableFilterLabels } from '@mesgflow/ui-kit/core';\r\nimport { FilterOperator } from './query-contract.model';\r\nimport type { TableFilterOperator } from './table-filter.model';\r\n\r\n/**\r\n * Filtre çubuğu + komut menüsünün metinlerinin şekli — `MfTableFilterLabels`\r\n * (bkz. `@mesgflow/ui-kit/core`'un `core/i18n/labels.ts`'i, `MF_TABLE_LABELS`\r\n * umbrella token'ının `filter` alt-alanı) bu dosyanın eski yerel\r\n * `TableFilterLabels`/`DEFAULT_TABLE_FILTER_LABELS`'ının yerini aldı —\r\n * `operatorLabel()` yardımcısı (aşağıda) TABLE'A ÖZGÜ kaldığı için burada\r\n * yaşamaya devam ediyor, sadece TİPİ artık core'dan geliyor.\r\n */\r\nexport type TableFilterLabels = MfTableFilterLabels;\r\n\r\nconst OPERATOR_KEY: Partial<Record<FilterOperator, keyof TableFilterLabels['operators']>> = {\r\n [FilterOperator.Equal]: 'equal',\r\n [FilterOperator.NotEqual]: 'notEqual',\r\n [FilterOperator.GreaterThan]: 'greaterThan',\r\n [FilterOperator.GreaterOrEqual]: 'greaterOrEqual',\r\n [FilterOperator.LessThan]: 'lessThan',\r\n [FilterOperator.LessOrEqual]: 'lessOrEqual',\r\n [FilterOperator.Contains]: 'contains',\r\n [FilterOperator.StartsWith]: 'startsWith',\r\n [FilterOperator.EndsWith]: 'endsWith',\r\n [FilterOperator.In]: 'in',\r\n [FilterOperator.IsNull]: 'isNull',\r\n [FilterOperator.IsNotNull]: 'isNotNull',\r\n};\r\n\r\nexport function operatorLabel(labels: TableFilterLabels, operator: TableFilterOperator): string {\r\n if (operator === 'between') return labels.operators.between;\r\n const key = OPERATOR_KEY[operator];\r\n return key ? labels.operators[key] : String(operator);\r\n}\r\n","import { startOfDay } from 'date-fns';\r\nimport {\r\n FilterLogic,\r\n FilterOperator,\r\n type FilterCondition,\r\n type FilterGroup,\r\n} from './query-contract.model';\r\nimport type { TableColumnFilterType } from './table-column.model';\r\n\r\n/**\r\n * UI seviyesinde bir operatör. `'between'` backend'de KARŞILIĞI OLMAYAN\r\n * sentetik bir değer: `FilterOperator` enum'unda `Between` yok (backend\r\n * sözleşmesinde de yok), bu yüzden bir tarih aralığı emit edilirken\r\n * `GreaterOrEqual` + `LessOrEqual` içeren küçük bir `And` grubuna çevriliyor\r\n * (bkz. `buildFilterGroup`). Kullanıcıya tek bir chip olarak görünür.\r\n */\r\nexport type TableFilterOperator = FilterOperator | 'between';\r\n\r\nexport interface AppliedFilter {\r\n id: string;\r\n field: string;\r\n operator: TableFilterOperator;\r\n /**\r\n * - `In` → değer DİZİSİ (çoklu seçim)\r\n * - `'between'` → `[from, to]` (ikisi de ISO tarih metni, biri null olabilir)\r\n * - `IsNull`/`IsNotNull` → değer yok (`null`)\r\n * - diğer → tek değer\r\n */\r\n value: unknown;\r\n}\r\n\r\n/** Tip başına filtre menüsünde sunulacak operatörler. `In` burada YOK — çoklu seçim ayrı bir jest (checkbox listesi), operatör dropdown'ında bir satır değil. */\r\nexport const OPERATORS_BY_TYPE: Record<TableColumnFilterType, TableFilterOperator[]> = {\r\n text: [\r\n FilterOperator.Contains,\r\n FilterOperator.Equal,\r\n FilterOperator.NotEqual,\r\n FilterOperator.StartsWith,\r\n FilterOperator.EndsWith,\r\n FilterOperator.IsNull,\r\n FilterOperator.IsNotNull,\r\n ],\r\n select: [FilterOperator.Equal, FilterOperator.NotEqual],\r\n boolean: [FilterOperator.Equal],\r\n date: [\r\n 'between',\r\n FilterOperator.GreaterOrEqual,\r\n FilterOperator.LessOrEqual,\r\n FilterOperator.Equal,\r\n ],\r\n};\r\n\r\nexport function defaultOperatorFor(type: TableColumnFilterType): TableFilterOperator {\r\n return OPERATORS_BY_TYPE[type][0]!;\r\n}\r\n\r\n/** `IsNull`/`IsNotNull` değer almaz — seçilir seçilmez uygulanır, değer kutusu gösterilmez. */\r\nexport function operatorNeedsValue(operator: TableFilterOperator): boolean {\r\n return operator !== FilterOperator.IsNull && operator !== FilterOperator.IsNotNull;\r\n}\r\n\r\n/**\r\n * Chip metninde operatör YAZILMAZ eğer o tip için varsayılan operatörse.\r\n * \"Rol: Yönetici\" okunur; \"Rol eşittir Yönetici\" aynı bilgiyi taşıyıp\r\n * üç kat yer kaplar. Varsayılandan sapma ise BİLGİ taşır ve gösterilir.\r\n */\r\nexport function isDefaultOperator(\r\n operator: TableFilterOperator,\r\n type: TableColumnFilterType,\r\n): boolean {\r\n return operator === defaultOperatorFor(type);\r\n}\r\n\r\n/**\r\n * `2026-09-01T00:00:00+03:00` — YEREL gün sınırı. `toISOString()` KULLANMA:\r\n * UTC'ye kaydırır, \"bugün\" filtresi saat farkı kadar yanlış güne düşer.\r\n * `export` — `dateToIso` (aşağıda) ve testler dışında artık DatePicker/\r\n * Calendar'ın ürettiği `Date` nesnelerini backend'in ISO metnine çeviren TEK\r\n * yer burası (bkz. `table-filter-menu.ts`).\r\n */\r\nexport function localIso(date: Date, endOfDay: boolean): string {\r\n const pad = (n: number, width = 2): string => String(n).padStart(width, '0');\r\n const time = endOfDay ? '23:59:59.999' : '00:00:00.000';\r\n const offsetMinutes = -date.getTimezoneOffset();\r\n const sign = offsetMinutes >= 0 ? '+' : '-';\r\n const absolute = Math.abs(offsetMinutes);\r\n const offset = `${sign}${pad(Math.floor(absolute / 60))}:${pad(absolute % 60)}`;\r\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${time}${offset}`;\r\n}\r\n\r\n/** `Calendar`'ın seçtiği bir günü backend'in beklediği ISO metnine çevirir — `localIso`'nun `Date`-girdili biçimi. */\r\nexport function dateToIso(date: Date, endOfDay: boolean): string {\r\n return localIso(date, endOfDay);\r\n}\r\n\r\n/** ISO metnini (ya da `null`/tanımsız değeri) `Calendar`'ın çalıştığı `Date`'e çevirir — gün sınırına (`startOfDay`) normalize edilir, saat bileşeni Calendar'ı ilgilendirmiyor. */\r\nexport function isoToDate(value: unknown): Date | null {\r\n if (typeof value !== 'string' || !value) return null;\r\n const date = new Date(value);\r\n return Number.isNaN(date.getTime()) ? null : startOfDay(date);\r\n}\r\n\r\nfunction toNode(filter: AppliedFilter): FilterCondition | FilterGroup {\r\n if (filter.operator === 'between') {\r\n const [from, to] = (filter.value as [string | null, string | null] | undefined) ?? [null, null];\r\n const conditions: FilterCondition[] = [];\r\n if (from)\r\n conditions.push({\r\n field: filter.field,\r\n operator: FilterOperator.GreaterOrEqual,\r\n value: from,\r\n });\r\n if (to)\r\n conditions.push({ field: filter.field, operator: FilterOperator.LessOrEqual, value: to });\r\n return { logic: FilterLogic.And, conditions };\r\n }\r\n\r\n if (!operatorNeedsValue(filter.operator)) {\r\n return { field: filter.field, operator: filter.operator };\r\n }\r\n\r\n // Çoklu seçim: TEK değer kaldıysa `In` yerine `Equal` gönderiyoruz — backend\r\n // ikisini de destekliyor ama `Equal` hem sorgu planı hem okunabilirlik için\r\n // daha dürüst.\r\n if (Array.isArray(filter.value)) {\r\n return filter.value.length === 1\r\n ? { field: filter.field, operator: FilterOperator.Equal, value: filter.value[0] }\r\n : { field: filter.field, operator: FilterOperator.In, value: filter.value };\r\n }\r\n\r\n return { field: filter.field, operator: filter.operator, value: filter.value };\r\n}\r\n\r\nfunction isGroup(node: FilterCondition | FilterGroup): node is FilterGroup {\r\n return 'logic' in node;\r\n}\r\n\r\n/**\r\n * Chip listesini backend'in `FilterGroup` ağacına çevirir. Tarih aralığı\r\n * chip'i kendi iç `And` grubunu getirdiği için ağaç derinliği en fazla\r\n * 3 olur — tipik backend sınırları (`MaxDepth = 5`, `MaxNodesPerGroup = 25`)\r\n * içinde rahat rahat kalıyoruz.\r\n */\r\nexport function buildFilterGroup(\r\n filters: readonly AppliedFilter[],\r\n logic: FilterLogic,\r\n): FilterGroup | undefined {\r\n if (filters.length === 0) return undefined;\r\n\r\n const nodes = filters.map(toNode);\r\n const conditions = nodes.filter((node): node is FilterCondition => !isGroup(node));\r\n const groups = nodes.filter(isGroup).filter((group) => (group.conditions?.length ?? 0) > 0);\r\n\r\n if (conditions.length === 0 && groups.length === 0) return undefined;\r\n // Tek bir alt grup varsa gereksiz sarmalayıcı üretme — payload'ı kanonik\r\n // tutuyoruz (backend cache anahtarı ham JSON string'i, bkz. query.model.ts).\r\n if (conditions.length === 0 && groups.length === 1) return groups[0];\r\n\r\n const result: FilterGroup = { logic };\r\n if (conditions.length) result.conditions = conditions;\r\n if (groups.length) result.groups = groups;\r\n return result;\r\n}\r\n","import { CdkOverlayOrigin } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { startOfMonth } from 'date-fns';\r\nimport { FilterOperator } from './query-contract.model';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Checkbox } from '@mesgflow/ui-kit/checkbox';\r\nimport { cn, MF_TABLE_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Input } from '@mesgflow/ui-kit/input';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { Select, type SelectOption } from '@mesgflow/ui-kit/select';\r\nimport { Calendar } from '@mesgflow/ui-kit/date-picker';\r\nimport { dateRangeForPreset, type DateRangePresetId } from '@mesgflow/ui-kit/date-picker';\r\nimport { operatorLabel as operatorLabelFor, type TableFilterLabels } from './table-filter-labels';\r\nimport {\r\n OPERATORS_BY_TYPE,\r\n dateToIso,\r\n defaultOperatorFor,\r\n isoToDate,\r\n operatorNeedsValue,\r\n type AppliedFilter,\r\n type TableFilterOperator,\r\n} from './table-filter.model';\r\nimport type { TableColumn, TableColumnFilterType } from './table-column.model';\r\n\r\n/**\r\n * Bir filtre kosulunun duzenleyicisi — IKI modda calisir, TEK bilesen:\r\n *\r\n * - **Ekleme** (`initial` = `null`): iki adim. Once alan arama listesi, alan\r\n * secilince ayni overlay icinde deger adimina gecer.\r\n * - **Duzenleme** (`initial` doldurulmus, bkz. `TableFilterBar` — her chip\r\n * kendi overlay'ini bu bilesenle acar): dogrudan deger adimiyla baslar,\r\n * alan sabit kalir (bir filtrenin ALANINI degistirmek olagan disi bir jest\r\n * — kullanici bunun yerine chip'i kaldirip yenisini ekler).\r\n *\r\n * Onay butonu YOK felsefesi tipe gore farkli uygulanir: `select`/`boolean`\r\n * checkbox'i her tik ANINDA `apply` emit eder ve overlay ACIK kalir (coklu\r\n * secim dogal akisi — kullanici birden cok kutuyu art arda isaretler).\r\n * `text`/`date` bir \"taahhut\" ani gerektirir (Enter / preset tik / Uygula) —\r\n * o anda hem `apply` HEM `closed` emit edilir.\r\n */\r\n@Component({\r\n selector: 'mf-table-filter-menu',\r\n imports: [Button, Icon, Checkbox, Input, Popover, Select, Calendar],\r\n host: { class: 'contents' },\r\n templateUrl: './table-filter-menu.html',\r\n})\r\nexport class TableFilterMenu<T> {\r\n readonly columns = input.required<TableColumn<T>[]>();\r\n readonly origin = input.required<CdkOverlayOrigin>();\r\n readonly open = input.required<boolean>();\r\n /** Doluysa duzenleme modu (alan sabit, adim='value'); `null` ise ekleme modu (adim='field'). */\r\n readonly initial = input<AppliedFilter | null>(null);\r\n readonly labels = input<TableFilterLabels>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(() => this.labels() ?? this.tableLabels().filter);\r\n\r\n /** Her zaman TAM bir `AppliedFilter` — ekleme modunda taze `id`, duzenlemede `initial.id` korunur. Ust bilesen (`TableFilterBar`) id'ye gore upsert yapar. */\r\n readonly apply = output<AppliedFilter>();\r\n /** Kaldirilan filtrenin id'si — checkbox listesi sifir secime inince (ekleme YA DA duzenleme modunda) emit edilir, ust bilesen o id'yi chip listesinden cikarir. */\r\n readonly remove = output<string>();\r\n readonly closed = output<void>();\r\n\r\n protected readonly step = signal<'field' | 'value'>('field');\r\n protected readonly fieldQuery = signal('');\r\n protected readonly fieldHighlighted = signal(0);\r\n protected readonly selectedField = signal<string | null>(null);\r\n protected readonly operator = signal<TableFilterOperator>(FilterOperator.Equal);\r\n /** `select`/`boolean` icin HER ZAMAN dizi (uzunluk 0/1/N) — tekil/coklu ayrimi yalnizca `toggleSelection`'da, emit aninda yapilir. */\r\n protected readonly selection = signal<unknown[]>([]);\r\n protected readonly textValue = signal('');\r\n protected readonly customDateOpen = signal(false);\r\n protected readonly dateFrom = signal<Date | null>(null);\r\n protected readonly dateTo = signal<Date | null>(null);\r\n /** `'start'` bir sonraki takvim tıklaması `dateFrom`'u YENİDEN başlatır (yeni oturum); `'end'` ikinci ucu belirler. */\r\n protected readonly datePickStage = signal<'start' | 'end'>('start');\r\n /** Fare ikinci ucun üzerinde gezinirken önizleme — bkz. `calendar.ts` `hoverEnd`. */\r\n protected readonly dateHoverEnd = signal<Date | null>(null);\r\n protected readonly calendarMonth = signal(startOfMonth(new Date()));\r\n /**\r\n * Ekleme modunda `initial()` HER ZAMAN `null` kalir — bu yuzden ayni \"ekleme\r\n * oturumu\" icinde art arda checkbox tiklamalari (bkz. `toggleSelection`)\r\n * kendi baslarina birden fazla YENI filtre olustururdu, ayni chip'i\r\n * GUNCELLEMEK yerine (gercek bulgu: \"Yonetici\" + \"Editor\" iki AYRI chip\r\n * olarak beliriyordu). Bu sinyal, bu oturumda uretilen ilk id'yi hatirlayip\r\n * sonraki her `emitApply`'de AYNI id'yi kullanmayi saglar — `reset()`\r\n * (yeni oturum) ve `selectField()` (farkli bir alana gecis) sifirlar.\r\n */\r\n private readonly draftId = signal<string | null>(null);\r\n\r\n private readonly fieldSearchEl = viewChild<ElementRef<HTMLInputElement>>('fieldSearchEl');\r\n\r\n protected readonly filterableColumns = computed(() => this.columns().filter((c) => !!c.filter));\r\n protected readonly filteredColumns = computed(() => {\r\n const q = this.fieldQuery().trim().toLocaleLowerCase('tr');\r\n const all = this.filterableColumns();\r\n if (!q) return all;\r\n return all.filter((c) => c.header.toLocaleLowerCase('tr').includes(q));\r\n });\r\n\r\n constructor() {\r\n // Overlay her acilista taze baslar — duzenleme modunda `initial`'dan,\r\n // ekleme modunda bostan. `open()` bir kez true'ya donduginde okunur;\r\n // sonraki her checkbox/metin degisikligi ARTIK kendi sinyallerinde yasar\r\n // (bu effect'in tekrar tetiklenip taslagi sifirlamamasi icin `open()`\r\n // DISINDA hicbir seye bagimli degil — `untracked` ile korunuyor).\r\n effect(() => {\r\n if (!this.open()) return;\r\n untracked(() => this.reset());\r\n });\r\n }\r\n\r\n private reset(): void {\r\n const init = this.initial();\r\n this.fieldQuery.set('');\r\n this.fieldHighlighted.set(0);\r\n this.customDateOpen.set(false);\r\n this.dateFrom.set(null);\r\n this.dateTo.set(null);\r\n this.datePickStage.set('start');\r\n this.dateHoverEnd.set(null);\r\n this.calendarMonth.set(startOfMonth(new Date()));\r\n\r\n if (!init) {\r\n this.step.set('field');\r\n this.selectedField.set(null);\r\n this.selection.set([]);\r\n this.textValue.set('');\r\n this.draftId.set(null);\r\n queueMicrotask(() => this.fieldSearchEl()?.nativeElement.focus());\r\n return;\r\n }\r\n\r\n this.step.set('value');\r\n this.selectedField.set(init.field);\r\n this.operator.set(init.operator);\r\n const type = this.filterTypeFor(init.field);\r\n if (type === 'select' || type === 'boolean') {\r\n this.selection.set(\r\n Array.isArray(init.value)\r\n ? init.value\r\n : init.value === null || init.value === undefined\r\n ? []\r\n : [init.value],\r\n );\r\n } else if (type === 'date' && init.operator === 'between') {\r\n const [from, to] = (init.value as [string | null, string | null] | undefined) ?? [null, null];\r\n const fromDate = isoToDate(from);\r\n const toDate = isoToDate(to);\r\n this.dateFrom.set(fromDate);\r\n this.dateTo.set(toDate);\r\n this.datePickStage.set(fromDate && !toDate ? 'end' : 'start');\r\n this.calendarMonth.set(startOfMonth(fromDate ?? new Date()));\r\n this.customDateOpen.set(true);\r\n } else {\r\n this.textValue.set(typeof init.value === 'string' ? init.value : '');\r\n }\r\n }\r\n\r\n private columnFor(field: string): TableColumn<T> | undefined {\r\n return this.columns().find((c) => c.field === field);\r\n }\r\n\r\n protected filterTypeFor(field: string): TableColumnFilterType {\r\n return this.columnFor(field)?.filter?.type ?? 'text';\r\n }\r\n\r\n protected fieldHeader(field: string): string {\r\n return this.columnFor(field)?.header ?? field;\r\n }\r\n\r\n /** `cn()` (twMerge) — base `bg-transparent` ve vurgulu `bg-surface-alt` AYNI class dizesinde çakışırsa (düz string birleştirmede olduğu gibi) hangisinin kazanacağı Tailwind'in derleme sırasına kalır; twMerge çakışan `bg-*` çiftini güvenle çözer. */\r\n protected fieldOptionClasses(index: number): string {\r\n return cn(\r\n 'flex w-full cursor-pointer appearance-none items-center justify-between gap-2 border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis',\r\n index === this.fieldHighlighted() && 'bg-surface-alt',\r\n );\r\n }\r\n\r\n protected operatorOptions(): SelectOption<TableFilterOperator>[] {\r\n const field = this.selectedField();\r\n if (!field) return [];\r\n const column = this.columnFor(field);\r\n const type = this.filterTypeFor(field);\r\n const operators = column?.filter?.operators ?? OPERATORS_BY_TYPE[type];\r\n return operators\r\n .filter((op) => op !== 'between')\r\n .map((op) => ({ label: operatorLabelFor(this.effectiveLabels(), op), value: op }));\r\n }\r\n\r\n protected selectOptions(): SelectOption<unknown>[] {\r\n const field = this.selectedField();\r\n if (!field) return [];\r\n return (this.columnFor(field)?.filter?.options ?? []).map((o) => ({\r\n label: o.label,\r\n value: o.value,\r\n }));\r\n }\r\n\r\n protected isSelected(value: unknown): boolean {\r\n return this.selection().includes(value);\r\n }\r\n\r\n /** Template'te magic-number karsilastirmasi (`operator() !== 10`) yerine — `IsNull`/`IsNotNull` deger kutusu gostermez. */\r\n protected currentOperatorNeedsValue(): boolean {\r\n return operatorNeedsValue(this.operator());\r\n }\r\n\r\n protected onFieldQueryKeydown(event: KeyboardEvent): void {\r\n const items = this.filteredColumns();\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.fieldHighlighted.update((i) => Math.min(items.length - 1, i + 1));\r\n } else if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.fieldHighlighted.update((i) => Math.max(0, i - 1));\r\n } else if (event.key === 'Enter') {\r\n event.preventDefault();\r\n const item = items[this.fieldHighlighted()];\r\n if (item) this.selectField(item.field);\r\n } else if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.closed.emit();\r\n }\r\n }\r\n\r\n protected selectField(field: string): void {\r\n this.selectedField.set(field);\r\n const type = this.filterTypeFor(field);\r\n this.operator.set(defaultOperatorFor(type));\r\n this.selection.set([]);\r\n this.textValue.set('');\r\n // Farkli bir alana gecis = yeni bir filtre taslagi — onceki alanda\r\n // uretilmis olabilecek id'yi TASIMA (bkz. draftId yorumu).\r\n this.draftId.set(null);\r\n this.step.set('value');\r\n }\r\n\r\n protected backToField(): void {\r\n this.step.set('field');\r\n this.fieldQuery.set('');\r\n this.fieldHighlighted.set(0);\r\n queueMicrotask(() => this.fieldSearchEl()?.nativeElement.focus());\r\n }\r\n\r\n /** `select`/`boolean` — her tik aninda uygular, overlay ACIK kalir (bkz. sinif yorumu). */\r\n protected toggleSelection(value: unknown): void {\r\n const field = this.selectedField();\r\n if (!field) return;\r\n const current = this.selection();\r\n const next = current.includes(value) ? current.filter((v) => v !== value) : [...current, value];\r\n this.selection.set(next);\r\n\r\n if (next.length === 0) {\r\n const id = this.initial()?.id ?? this.draftId();\r\n if (id) this.remove.emit(id);\r\n this.draftId.set(null);\r\n return;\r\n }\r\n const operator = next.length === 1 ? FilterOperator.Equal : FilterOperator.In;\r\n const value2 = next.length === 1 ? next[0] : next;\r\n this.emitApply(field, operator, value2, false);\r\n }\r\n\r\n protected onOperatorChange(operator: TableFilterOperator | null): void {\r\n if (operator === null) return;\r\n this.operator.set(operator);\r\n if (!operatorNeedsValue(operator)) this.commitText();\r\n }\r\n\r\n protected onTextInput(raw: string): void {\r\n this.textValue.set(raw);\r\n }\r\n\r\n protected commitText(): void {\r\n const field = this.selectedField();\r\n if (!field) return;\r\n const operator = this.operator();\r\n if (operatorNeedsValue(operator) && !this.textValue().trim()) return;\r\n this.emitApply(\r\n field,\r\n operator,\r\n operatorNeedsValue(operator) ? this.textValue().trim() : undefined,\r\n true,\r\n );\r\n }\r\n\r\n protected applyPreset(preset: DateRangePresetId): void {\r\n const field = this.selectedField();\r\n if (!field) return;\r\n const range = dateRangeForPreset(preset);\r\n this.emitApply(\r\n field,\r\n 'between',\r\n [dateToIso(range.start!, false), dateToIso(range.end!, true)],\r\n true,\r\n );\r\n }\r\n\r\n protected openCustomRange(): void {\r\n this.customDateOpen.set(true);\r\n }\r\n\r\n /** İki tıklamalı aralık seçimi — emsal: `date-range-picker.ts` `onDayPick` (aynı mantık, burada tek gömülü takvim). */\r\n protected onCalendarDayPick(day: Date): void {\r\n if (this.datePickStage() === 'start' || (this.dateFrom() && this.dateTo())) {\r\n this.dateFrom.set(day);\r\n this.dateTo.set(null);\r\n this.datePickStage.set('end');\r\n this.dateHoverEnd.set(null);\r\n return;\r\n }\r\n\r\n const start = this.dateFrom()!;\r\n if (day < start) {\r\n this.dateFrom.set(day);\r\n this.dateTo.set(start);\r\n } else {\r\n this.dateTo.set(day);\r\n }\r\n this.datePickStage.set('start');\r\n this.dateHoverEnd.set(null);\r\n }\r\n\r\n protected onCalendarDayHover(day: Date | null): void {\r\n this.dateHoverEnd.set(day);\r\n }\r\n\r\n protected commitCustomRange(): void {\r\n const field = this.selectedField();\r\n if (!field) return;\r\n const from = this.dateFrom();\r\n const to = this.dateTo();\r\n if (!from && !to) return;\r\n this.emitApply(\r\n field,\r\n 'between',\r\n [from ? dateToIso(from, false) : null, to ? dateToIso(to, true) : null],\r\n true,\r\n );\r\n }\r\n\r\n private emitApply(\r\n field: string,\r\n operator: TableFilterOperator,\r\n value: unknown,\r\n closeAfter: boolean,\r\n ): void {\r\n const id = this.initial()?.id ?? this.draftId() ?? crypto.randomUUID();\r\n if (!this.initial() && !this.draftId()) this.draftId.set(id);\r\n this.apply.emit({ id, field, operator, value });\r\n if (closeAfter) this.closed.emit();\r\n }\r\n\r\n protected close(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"md\"\r\n panelClass=\"w-72\"\r\n (closed)=\"close()\"\r\n>\r\n @if (step() === 'field') {\r\n <div class=\"relative mb-1.5\">\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"pointer-events-none absolute top-1/2 start-2 -translate-y-1/2 text-fg-subtle\"\r\n >search</span\r\n >\r\n <input\r\n mfInput\r\n #fieldSearchEl\r\n type=\"text\"\r\n class=\"ps-7 text-sm\"\r\n [placeholder]=\"effectiveLabels().searchField\"\r\n [value]=\"fieldQuery()\"\r\n (input)=\"fieldQuery.set($any($event.target).value)\"\r\n (keydown)=\"onFieldQueryKeydown($event)\"\r\n />\r\n </div>\r\n @if (filteredColumns().length === 0) {\r\n <p class=\"px-1.5 py-2 text-sm text-fg-subtle\">{{ effectiveLabels().noField }}</p>\r\n } @else {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (column of filteredColumns(); track column.field; let i = $index) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n [class]=\"fieldOptionClasses(i)\"\r\n (mouseenter)=\"fieldHighlighted.set(i)\"\r\n (click)=\"selectField(column.field)\"\r\n >\r\n {{ column.header }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n } @else {\r\n <div class=\"mb-1.5 flex items-center gap-1 px-0.5\">\r\n @if (!initial()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().back\"\r\n (click)=\"backToField()\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">arrow_back</span>\r\n </button>\r\n }\r\n <span class=\"text-sm font-medium text-fg\">{{ fieldHeader(selectedField() ?? '') }}</span>\r\n </div>\r\n\r\n @switch (filterTypeFor(selectedField() ?? '')) {\r\n @case ('select') {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('boolean') {\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('date') {\r\n <div class=\"flex flex-col gap-1\">\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('today')\"\r\n >\r\n {{ effectiveLabels().dateToday }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('last7')\"\r\n >\r\n {{ effectiveLabels().dateLast7 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('last30')\"\r\n >\r\n {{ effectiveLabels().dateLast30 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('thisMonth')\"\r\n >\r\n {{ effectiveLabels().dateThisMonth }}\r\n </button>\r\n @if (!customDateOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-accent transition-colors duration-fast ease-emphasis hover:bg-accent/5\"\r\n (click)=\"openCustomRange()\"\r\n >\r\n {{ effectiveLabels().dateCustom }}\r\n </button>\r\n } @else {\r\n <div class=\"mt-1 flex flex-col gap-2 border-t border-border pt-2\">\r\n <mf-calendar\r\n mode=\"range\"\r\n [(month)]=\"calendarMonth\"\r\n [rangeStart]=\"dateFrom()\"\r\n [rangeEnd]=\"dateTo()\"\r\n [hoverEnd]=\"dateHoverEnd()\"\r\n (dayPick)=\"onCalendarDayPick($event)\"\r\n (dayHover)=\"onCalendarDayHover($event)\"\r\n />\r\n <div class=\"flex justify-end\">\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n [disabled]=\"!dateFrom()\"\r\n (click)=\"commitCustomRange()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @default {\r\n <div class=\"flex flex-col gap-2\">\r\n <mf-select\r\n [options]=\"operatorOptions()\"\r\n [value]=\"operator()\"\r\n (valueChange)=\"onOperatorChange($event)\"\r\n size=\"sm\"\r\n [ariaLabel]=\"effectiveLabels().operator\"\r\n />\r\n @if (currentOperatorNeedsValue()) {\r\n <input\r\n mfInput\r\n type=\"text\"\r\n class=\"text-sm\"\r\n [attr.aria-label]=\"effectiveLabels().value\"\r\n [placeholder]=\"effectiveLabels().value\"\r\n [value]=\"textValue()\"\r\n (input)=\"onTextInput($any($event.target).value)\"\r\n (keydown.enter)=\"commitText()\"\r\n />\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-xs text-fg-subtle\">{{ effectiveLabels().enterHint }}</span>\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n (click)=\"commitText()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n</mf-popover>\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { FilterLogic } from './query-contract.model';\r\nimport { Chip } from '@mesgflow/ui-kit/chip';\r\nimport { MF_TABLE_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Select, type SelectOption } from '@mesgflow/ui-kit/select';\r\nimport { TableFilterMenu } from './table-filter-menu';\r\nimport { operatorLabel, type TableFilterLabels } from './table-filter-labels';\r\nimport { isDefaultOperator, type AppliedFilter } from './table-filter.model';\r\nimport type { TableColumn, TableColumnFilterType } from './table-column.model';\r\n\r\n/**\r\n * Toolbar'ın ALTINDA kalıcı bir satır — uygulanmış filtreler artık ikonun\r\n * köşesindeki bir sayı rozetinde değil, doğrudan burada, birer chip olarak\r\n * görünür (bkz. plan — kullanıcının onayladığı Linear/Attio dili). Chip'e\r\n * tıklamak değerini düzenler, `×` anında kaldırır. `TableFilterMenu` HEM\r\n * \"+ Filtre\" tetikleyicisinde (ekleme, `initial=null`) HEM her chip'te\r\n * (düzenleme, `initial=filter`) aynı bileşen — bkz. o dosyanın başındaki not.\r\n */\r\n@Component({\r\n selector: 'mf-table-filter-bar',\r\n host: { class: 'block' },\r\n imports: [OverlayModule, Chip, Icon, Select, TableFilterMenu],\r\n templateUrl: './table-filter-bar.html',\r\n})\r\nexport class TableFilterBar<T> {\r\n readonly columns = input.required<TableColumn<T>[]>();\r\n readonly filters = input.required<readonly AppliedFilter[]>();\r\n readonly logic = input.required<FilterLogic>();\r\n readonly labels = input<TableFilterLabels>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(() => this.labels() ?? this.tableLabels().filter);\r\n\r\n readonly filtersChange = output<AppliedFilter[]>();\r\n readonly logicChange = output<FilterLogic>();\r\n\r\n protected readonly addOpen = signal(false);\r\n protected readonly editingId = signal<string | null>(null);\r\n\r\n protected readonly FilterLogic = FilterLogic;\r\n protected readonly filterableColumns = computed(() => this.columns().filter((c) => !!c.filter));\r\n\r\n protected readonly logicOptions = computed<SelectOption<FilterLogic>[]>(() => [\r\n { label: this.effectiveLabels().and, value: FilterLogic.And },\r\n { label: this.effectiveLabels().or, value: FilterLogic.Or },\r\n ]);\r\n\r\n private columnFor(field: string): TableColumn<T> | undefined {\r\n return this.columns().find((c) => c.field === field);\r\n }\r\n\r\n protected fieldHeader(field: string): string {\r\n return this.columnFor(field)?.header ?? field;\r\n }\r\n\r\n private filterTypeFor(field: string): TableColumnFilterType {\r\n return this.columnFor(field)?.filter?.type ?? 'text';\r\n }\r\n\r\n /**\r\n * Chip metni: \"Alan: değer\" — operatör SADECE o tip için varsayılan\r\n * değilse eklenir (\"Rol: Yönetici\" okunur, \"Rol eşittir Yönetici\" aynı\r\n * bilgiyi taşıyıp gürültü ekler). Çoklu seçimde 3'ten fazla değer\r\n * \"A, B +2\" şeklinde kısaltılır — chip'in kendisi bir özet, tam liste\r\n * düzenleyicide zaten görünür.\r\n */\r\n protected chipText(filter: AppliedFilter): string {\r\n const header = this.fieldHeader(filter.field);\r\n const type = this.filterTypeFor(filter.field);\r\n const value = this.displayValue(filter, type);\r\n if (isDefaultOperator(filter.operator, type)) return `${header}: ${value}`;\r\n return `${header} ${operatorLabel(this.effectiveLabels(), filter.operator)} ${value}`;\r\n }\r\n\r\n private displayValue(filter: AppliedFilter, type: TableColumnFilterType): string {\r\n if (filter.operator === 'between') {\r\n const [from, to] = (filter.value as [string | null, string | null] | undefined) ?? [\r\n null,\r\n null,\r\n ];\r\n const f = from ? from.slice(0, 10) : '…';\r\n const t = to ? to.slice(0, 10) : '…';\r\n return `${f} – ${t}`;\r\n }\r\n if (filter.value === null || filter.value === undefined) return '';\r\n\r\n const optionLabel = (raw: unknown): string => {\r\n if (type !== 'select' && type !== 'boolean') return String(raw);\r\n return (\r\n this.columnFor(filter.field)?.filter?.options?.find((o) => o.value === raw)?.label ??\r\n String(raw)\r\n );\r\n };\r\n\r\n if (Array.isArray(filter.value)) {\r\n const labels = filter.value.map(optionLabel);\r\n if (labels.length <= 2) return labels.join(', ');\r\n return `${labels.slice(0, 2).join(', ')} +${labels.length - 2}`;\r\n }\r\n return optionLabel(filter.value);\r\n }\r\n\r\n protected onMenuApply(applied: AppliedFilter): void {\r\n const current = this.filters();\r\n const index = current.findIndex((f) => f.id === applied.id);\r\n const next =\r\n index === -1 ? [...current, applied] : current.map((f, i) => (i === index ? applied : f));\r\n this.filtersChange.emit(next);\r\n }\r\n\r\n protected removeFilter(id: string): void {\r\n this.filtersChange.emit(this.filters().filter((f) => f.id !== id));\r\n if (this.editingId() === id) this.editingId.set(null);\r\n }\r\n\r\n protected onLogicChange(logic: FilterLogic | null): void {\r\n if (logic === null) return;\r\n this.logicChange.emit(logic);\r\n }\r\n\r\n protected clearAll(): void {\r\n this.filtersChange.emit([]);\r\n this.editingId.set(null);\r\n }\r\n}\r\n","<div class=\"flex flex-wrap items-center gap-1.5 border-b border-border bg-surface-sunken px-4 py-2\">\r\n @if (filters().length > 1) {\r\n <mf-select\r\n [options]=\"logicOptions()\"\r\n [value]=\"logic()\"\r\n (valueChange)=\"onLogicChange($event)\"\r\n size=\"sm\"\r\n class=\"w-20\"\r\n />\r\n }\r\n\r\n @for (filter of filters(); track filter.id) {\r\n <mf-chip\r\n [removable]=\"true\"\r\n [removeLabel]=\"effectiveLabels().remove\"\r\n (removed)=\"removeFilter(filter.id)\"\r\n >\r\n <button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #chipOrigin=\"cdkOverlayOrigin\"\r\n class=\"max-w-[16rem] cursor-pointer appearance-none truncate border-0 bg-transparent p-0 text-start transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"editingId.set(filter.id)\"\r\n >\r\n {{ chipText(filter) }}\r\n </button>\r\n </mf-chip>\r\n <mf-table-filter-menu\r\n [columns]=\"columns()\"\r\n [origin]=\"chipOrigin\"\r\n [open]=\"editingId() === filter.id\"\r\n [initial]=\"filter\"\r\n [labels]=\"effectiveLabels()\"\r\n (apply)=\"onMenuApply($event)\"\r\n (remove)=\"removeFilter($event)\"\r\n (closed)=\"editingId.set(null)\"\r\n />\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #addOrigin=\"cdkOverlayOrigin\"\r\n class=\"inline-flex cursor-pointer appearance-none items-center gap-1 rounded-full border border-dashed border-border bg-transparent py-1 pe-2.5 ps-2 text-xs font-medium text-fg-muted transition-colors duration-fast ease-emphasis hover:border-border-strong hover:text-fg\"\r\n (click)=\"addOpen.set(!addOpen())\"\r\n >\r\n <span mfIcon [size]=\"14\">add</span>\r\n {{ effectiveLabels().addFilter }}\r\n </button>\r\n <mf-table-filter-menu\r\n [columns]=\"columns()\"\r\n [origin]=\"addOrigin\"\r\n [open]=\"addOpen()\"\r\n [labels]=\"effectiveLabels()\"\r\n (apply)=\"onMenuApply($event)\"\r\n (remove)=\"removeFilter($event)\"\r\n (closed)=\"addOpen.set(false)\"\r\n />\r\n\r\n @if (filters().length > 0) {\r\n <button\r\n type=\"button\"\r\n class=\"ms-auto appearance-none border-0 bg-transparent p-0 text-xs font-medium text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"clearAll()\"\r\n >\r\n {{ effectiveLabels().clearAll }}\r\n </button>\r\n }\r\n</div>\r\n","import { CdkOverlayOrigin } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n computed,\r\n ElementRef,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { MF_TABLE_LABELS, type MfTablePaginationLabels } from '@mesgflow/ui-kit/core';\r\nimport { Input } from '@mesgflow/ui-kit/input';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\n\r\n/**\r\n * Sayfalamadaki tıklanabilir \"…\" için küçük bir sayfaya-git popover'ı —\r\n * panel iskeleti `Popover`'a devredildi (bkz. plan Faz 1c) — kendi\r\n * `[origin]`/`[open]` input'ları, `(apply)`/`(closed)` output'ları aynı\r\n * kaldı, sadece CDK connected overlay/backdrop/ESC/animasyon artık\r\n * `Popover`'ın işi. Onay YALNIZCA submit'te (Enter / Git) — her tuş\r\n * vuruşunda backend'e istek atmaz (bkz. plan, rate limit notu).\r\n */\r\n@Component({\r\n selector: 'mf-table-page-jump',\r\n imports: [Button, Input, Popover],\r\n host: { class: 'contents' },\r\n templateUrl: './table-page-jump.html',\r\n})\r\nexport class TablePageJump {\r\n readonly origin = input.required<CdkOverlayOrigin>();\r\n readonly open = input.required<boolean>();\r\n readonly totalPages = input.required<number>();\r\n readonly labels = input<MfTablePaginationLabels>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(\r\n () => this.labels() ?? this.tableLabels().pagination,\r\n );\r\n\r\n readonly apply = output<number>();\r\n readonly closed = output<void>();\r\n\r\n protected readonly value = signal('');\r\n\r\n private readonly valueEl = viewChild<ElementRef<HTMLInputElement>>('valueEl');\r\n\r\n constructor() {\r\n // Overlay her açılışta taze başlar — bkz. table-filter-menu.ts'teki aynı desen.\r\n effect(() => {\r\n if (!this.open()) return;\r\n untracked(() => {\r\n this.value.set('');\r\n queueMicrotask(() => this.valueEl()?.nativeElement.focus());\r\n });\r\n });\r\n }\r\n\r\n protected onValueInput(raw: string): void {\r\n this.value.set(raw);\r\n }\r\n\r\n protected commit(): void {\r\n const parsed = Number(this.value());\r\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > this.totalPages()) return;\r\n this.apply.emit(parsed);\r\n }\r\n\r\n protected close(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom\"\r\n padding=\"md\"\r\n panelClass=\"w-44\"\r\n (closed)=\"close()\"\r\n>\r\n <p class=\"mb-1.5 px-0.5 text-eyebrow text-fg-subtle\">{{ effectiveLabels().jumpToPage }}</p>\r\n <div class=\"flex items-center gap-1.5\">\r\n <input\r\n mfInput\r\n #valueEl\r\n type=\"number\"\r\n class=\"text-sm\"\r\n min=\"1\"\r\n [max]=\"totalPages()\"\r\n [placeholder]=\"'1–' + totalPages()\"\r\n [value]=\"value()\"\r\n (input)=\"onValueInput($any($event.target).value)\"\r\n (keydown.enter)=\"commit()\"\r\n />\r\n <button mfButton tone=\"primary\" appearance=\"filled\" size=\"sm\" type=\"button\" (click)=\"commit()\">\r\n {{ effectiveLabels().go }}\r\n </button>\r\n </div>\r\n</mf-popover>\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n ElementRef,\r\n afterRenderEffect,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Select, type SelectOption } from '@mesgflow/ui-kit/select';\r\nimport {\r\n cn,\r\n MF_TABLE_LABELS,\r\n type MfTablePaginationLabels,\r\n focusRecipe,\r\n} from '@mesgflow/ui-kit/core';\r\nimport { TablePageJump } from './table-page-jump';\r\n\r\n/** GitHub PR listesi tarzı akıllı elips: toplam ≤7 sayfa tümü gösterilir, aksi halde 1, 2, current±1, son-1, son sabit + boşluklar elipsli. */\r\nfunction buildPageList(current: number, total: number): (number | 'ellipsis')[] {\r\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\r\n\r\n const keep = new Set<number>([1, 2, total - 1, total, current - 1, current, current + 1]);\r\n const sorted = [...keep].filter((p) => p >= 1 && p <= total).sort((a, b) => a - b);\r\n\r\n const result: (number | 'ellipsis')[] = [];\r\n let previous = 0;\r\n for (const page of sorted) {\r\n if (previous && page - previous > 1) result.push('ellipsis');\r\n result.push(page);\r\n previous = page;\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Her hücre AYNI dili konuşuyor: kendi `rounded-md` hit alanına sahip,\r\n * tek bir `focus-visible` mekanizmalı, bağımsız bir buton (bkz.\r\n * projects/ui-kit/README.md \"Focus — tek mekanizma\"). `h-9 w-9` mobilde dört okun\r\n * da 36px dokunma hedefi olmasını sağlıyor; `sm:h-8 sm:min-w-8` masaüstünde\r\n * yandaki `mf-select size=\"sm\"` ile hizalanıyor (`select.variants.ts`).\r\n */\r\nconst CELL_BASE =\r\n 'relative flex h-9 w-9 sm:h-8 sm:min-w-8 shrink-0 appearance-none items-center justify-center rounded-md border-0 bg-transparent px-2 ' +\r\n 'text-sm font-medium tabular-nums transition-colors duration-fast ease-emphasis active:scale-[0.99] ' +\r\n focusRecipe +\r\n ' ' +\r\n 'disabled:pointer-events-none disabled:opacity-50 disabled:active:scale-100';\r\n\r\n/**\r\n * Table'ın footer'ı — sol \"X–Y / toplam Z\" özet + sayfa-boyutu `Select`i,\r\n * sağda AYRIK/havadar bir gezinme grubu: ⏮ ‹ · numaralar · › ⏭. Eskiden\r\n * tek kenarlıklı bir segment grubuydu (bkz. git geçmişi) — artık dış çerçeve\r\n * yok, her hücre kendi bağımsız butonu. Aktif sayfa dolu yeşil blok DEĞİL,\r\n * `surface-alt` yüzey + alt kenarda **ray** — bu tasarım sisteminin\r\n * \"buradasın\" motifi (sidebar aktif öğe, aktif sekme, seçili tablo satırı ile\r\n * aynı dil).\r\n */\r\n@Component({\r\n selector: 'mf-table-pagination',\r\n host: { class: 'block' },\r\n imports: [Select, Icon, OverlayModule, TablePageJump],\r\n templateUrl: './table-pagination.html',\r\n})\r\nexport class TablePagination {\r\n readonly page = input.required<number>();\r\n readonly pageSize = input.required<number>();\r\n readonly total = input.required<number>();\r\n readonly pageSizeOptions = input<number[]>([10, 20, 50, 100]);\r\n readonly labels = input<MfTablePaginationLabels>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(\r\n () => this.labels() ?? this.tableLabels().pagination,\r\n );\r\n\r\n readonly pageChange = output<number>();\r\n readonly pageSizeChange = output<number>();\r\n\r\n protected readonly totalPages = computed(() =>\r\n Math.max(1, Math.ceil(this.total() / this.pageSize())),\r\n );\r\n protected readonly rangeStart = computed(() =>\r\n this.total() === 0 ? 0 : (this.page() - 1) * this.pageSize() + 1,\r\n );\r\n protected readonly rangeEnd = computed(() =>\r\n Math.min(this.page() * this.pageSize(), this.total()),\r\n );\r\n protected readonly pageItems = computed(() => buildPageList(this.page(), this.totalPages()));\r\n protected readonly pageSizeSelectOptions = computed<SelectOption<number>[]>(() =>\r\n this.pageSizeOptions().map((size) => ({ label: String(size), value: size })),\r\n );\r\n\r\n /** Aynı anda iki \"…\" olabilir (baştaki + sondaki) — açık olanın loop index'i, `null` = hiçbiri açık değil. */\r\n protected readonly jumpOpenIndex = signal<number | null>(null);\r\n\r\n private readonly navEl = viewChild<ElementRef<HTMLElement>>('nav');\r\n /** Signal DEĞİL — sadece odağın şu an `<nav>` içinde olup olmadığını izleyen düz bir bayrak (bkz. constructor'daki geri-odaklama notu). */\r\n private focusWithinNav = false;\r\n\r\n constructor() {\r\n /*\r\n * Ok tuşlarıyla ardışık gezinme: sayfa değişince o anki `[aria-current]`\r\n * butonu DOM'dan kalkabiliyor (pencere current±1'e göre kayıyor), odak\r\n * `<body>`'ye düşüyor ve bir sonraki ok tuşu artık `<nav>`'a ulaşmıyordu\r\n * (gerçek bulgu). Odak `<nav>` içindeyken her sayfa değişiminden sonra\r\n * yeni aktif sayfa butonuna (mobilde numaralar gizliyse `<nav>`'ın\r\n * kendisine) geri veriliyor.\r\n */\r\n afterRenderEffect(() => {\r\n this.page();\r\n if (!this.focusWithinNav) return;\r\n const nav = this.navEl()?.nativeElement;\r\n if (!nav || nav.contains(document.activeElement)) return;\r\n const activeBtn = nav.querySelector<HTMLButtonElement>('[aria-current=\"page\"]');\r\n (activeBtn ?? nav).focus();\r\n });\r\n }\r\n\r\n protected goTo(page: number): void {\r\n if (page < 1 || page > this.totalPages() || page === this.page()) return;\r\n this.pageChange.emit(page);\r\n }\r\n\r\n protected onPageSizeChange(size: number | null): void {\r\n if (size === null) return;\r\n this.pageSizeChange.emit(size);\r\n }\r\n\r\n protected cellClasses(active: boolean): string {\r\n return cn(\r\n CELL_BASE,\r\n active\r\n ? 'bg-surface-alt text-fg font-semibold'\r\n : 'text-fg-muted hover:bg-state-hover hover:text-fg',\r\n // Ray: aktif sayfanın alt kenarında 2px dolu marka rengi — dolu yeşil\r\n // BLOK değil (bu sistemin \"buradasın\" motifi, bkz. sınıf yorumu).\r\n // `inset-x-2` (8px), hücrenin `rounded-md` (8px) köşe yarıçapını tam\r\n // kurtarıyor — ray düz kenarda kalıyor.\r\n active &&\r\n \"after:absolute after:inset-x-2 after:bottom-0 after:h-0.5 after:rounded-full after:bg-accent-fill after:content-['']\",\r\n );\r\n }\r\n\r\n protected onNavKeydown(event: KeyboardEvent): void {\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n event.preventDefault();\r\n this.goTo(this.page() - 1);\r\n break;\r\n case 'ArrowRight':\r\n event.preventDefault();\r\n this.goTo(this.page() + 1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this.goTo(1);\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this.goTo(this.totalPages());\r\n break;\r\n }\r\n }\r\n\r\n protected onNavFocusIn(): void {\r\n this.focusWithinNav = true;\r\n }\r\n\r\n protected onNavFocusOut(): void {\r\n this.focusWithinNav = false;\r\n }\r\n\r\n protected toggleJump(index: number): void {\r\n this.jumpOpenIndex.update((current) => (current === index ? null : index));\r\n }\r\n\r\n protected onJumpApply(page: number): void {\r\n this.jumpOpenIndex.set(null);\r\n this.goTo(page);\r\n }\r\n}\r\n","<div class=\"flex flex-wrap items-center justify-between gap-3 px-4 py-3\">\r\n <div class=\"flex items-center gap-2 text-sm text-fg-subtle\">\r\n <span class=\"tabular-nums\"\r\n >{{ rangeStart() }}–{{ rangeEnd() }} / {{ total() }} {{ effectiveLabels().records }}</span\r\n >\r\n <span class=\"text-fg-subtle\">{{ effectiveLabels().perPage }}</span>\r\n <mf-select\r\n [options]=\"pageSizeSelectOptions()\"\r\n [value]=\"pageSize()\"\r\n (valueChange)=\"onPageSizeChange($event)\"\r\n size=\"sm\"\r\n [ariaLabel]=\"effectiveLabels().pageSizeAriaLabel\"\r\n class=\"w-20\"\r\n />\r\n </div>\r\n\r\n <nav\r\n #nav\r\n tabindex=\"-1\"\r\n class=\"flex shrink-0 flex-nowrap items-center gap-1.5 outline-none\"\r\n [attr.aria-label]=\"effectiveLabels().navAriaLabel\"\r\n (keydown)=\"onNavKeydown($event)\"\r\n (focusin)=\"onNavFocusIn()\"\r\n (focusout)=\"onNavFocusOut()\"\r\n >\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(false)\"\r\n [disabled]=\"page() === 1\"\r\n [attr.aria-label]=\"effectiveLabels().first\"\r\n (click)=\"goTo(1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">first_page</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(false)\"\r\n [disabled]=\"page() === 1\"\r\n [attr.aria-label]=\"effectiveLabels().previous\"\r\n (click)=\"goTo(page() - 1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">chevron_left</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"hidden items-center gap-0.5 sm:flex\">\r\n @for (item of pageItems(); track $index) {\r\n @if (item === 'ellipsis') {\r\n <button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #jumpOrigin=\"cdkOverlayOrigin\"\r\n [class]=\"cellClasses(false)\"\r\n [attr.aria-label]=\"effectiveLabels().jumpToPage\"\r\n (click)=\"toggleJump($index)\"\r\n >\r\n …\r\n </button>\r\n <mf-table-page-jump\r\n [origin]=\"jumpOrigin\"\r\n [open]=\"jumpOpenIndex() === $index\"\r\n [totalPages]=\"totalPages()\"\r\n [labels]=\"effectiveLabels()\"\r\n (apply)=\"onJumpApply($event)\"\r\n (closed)=\"jumpOpenIndex.set(null)\"\r\n />\r\n } @else {\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(item === page())\"\r\n [attr.aria-current]=\"item === page() ? 'page' : null\"\r\n (click)=\"goTo(item)\"\r\n >\r\n {{ item }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n <span class=\"flex h-9 shrink-0 items-center px-3 text-sm tabular-nums text-fg-muted sm:hidden\">\r\n {{ effectiveLabels().page }} {{ page() }} / {{ totalPages() }}\r\n </span>\r\n\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(false)\"\r\n [disabled]=\"page() === totalPages()\"\r\n [attr.aria-label]=\"effectiveLabels().next\"\r\n (click)=\"goTo(page() + 1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">chevron_right</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(false)\"\r\n [disabled]=\"page() === totalPages()\"\r\n [attr.aria-label]=\"effectiveLabels().last\"\r\n (click)=\"goTo(totalPages())\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">last_page</span>\r\n </button>\r\n </div>\r\n </nav>\r\n</div>\r\n","export interface VirtualWindow {\r\n /** Render edilecek ilk satırın indeksi (dahil). */\r\n start: number;\r\n /** Render edilecek son satırın indeksi (hariç). */\r\n end: number;\r\n /** Üst/alt boşluk satırlarının yüksekliği, px — kaydırma çubuğu tam liste boyunu korur. */\r\n top: number;\r\n bottom: number;\r\n}\r\n\r\n/**\r\n * Sabit satır yüksekliğiyle pencereleme — görünür aralık ± `overscan` satır. Saf fonksiyon;\r\n * `Table`'ın `virtual` modu bunu `scrollTop`/görünüm yüksekliği sinyalleriyle çağırır.\r\n * `<cdk-virtual-scroll-viewport>` yerine: tablo `<tr>`'leri bir viewport sarmalayıcısına\r\n * girince yapışkan başlık, `border-collapse` ve `colspan`'lı boş durum satırı bozuluyordu;\r\n * boşluk satırı (`<tr><td [style.height]>`) yaklaşımı tablo semantiğini aynen korur.\r\n */\r\nexport function virtualWindow(\r\n total: number,\r\n scrollTop: number,\r\n viewportHeight: number,\r\n rowHeight: number,\r\n overscan = 8,\r\n): VirtualWindow {\r\n if (total === 0 || rowHeight <= 0) return { start: 0, end: 0, top: 0, bottom: 0 };\r\n const first = Math.floor(Math.max(0, scrollTop) / rowHeight);\r\n const visible = Math.ceil(Math.max(0, viewportHeight) / rowHeight);\r\n const start = Math.min(total, Math.max(0, first - overscan));\r\n const end = Math.min(total, first + visible + overscan);\r\n return { start, end, top: start * rowHeight, bottom: (total - end) * rowHeight };\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n afterRenderEffect,\r\n booleanAttribute,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n type TemplateRef,\r\n} from '@angular/core';\r\nimport {\r\n DEFAULT_PAGE_SIZE,\r\n FilterLogic,\r\n FilterOperator,\r\n SortDirection,\r\n canonicalPagedRequest,\r\n type FilterGroup,\r\n type PageRequest,\r\n type PagedRequest,\r\n type SortDescriptor,\r\n} from './query-contract.model';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Checkbox } from '@mesgflow/ui-kit/checkbox';\r\nimport {\r\n cn,\r\n isRtl,\r\n MF_TABLE_LABELS,\r\n mergeLabels,\r\n type DeepPartial,\r\n type MfTableLabels,\r\n} from '@mesgflow/ui-kit/core';\r\nimport { EmptyState } from '@mesgflow/ui-kit/empty-state';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { SearchInput } from '@mesgflow/ui-kit/search-input';\r\nimport { Skeleton } from '@mesgflow/ui-kit/skeleton';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport { matchesFilterGroup, sortRows } from './table-client-query';\r\nimport { TableResizeHandle } from './table-column-resize';\r\nimport { TableColumnsMenu } from './table-columns-menu';\r\nimport { TableFilterBar } from './table-filter-bar';\r\nimport { buildFilterGroup, type AppliedFilter } from './table-filter.model';\r\nimport { TablePagination } from './table-pagination';\r\nimport type { TableColumn } from './table-column.model';\r\nimport { virtualWindow } from './table-virtual';\r\n\r\n/** Seçim/genişletme kolonlarının sabit genişliği (`w-10`) ve aksiyon kolonu (`w-20`), px. */\r\nconst LEADING_COL_PX = 40;\r\nconst ACTIONS_COL_PX = 80;\r\nconst FALLBACK_COL_PX = 160;\r\n/** Ölçülemeyen ortamda (SSR/jsdom) varsayılan satır yüksekliği — `bodyCellPad` ile uyumlu. */\r\nconst FALLBACK_ROW_PX = { comfortable: 57, compact: 45 } as const;\r\n\r\nlet tableIdSeq = 0;\r\n\r\nfunction sameRecord(a: Record<string, number>, b: Record<string, number>): boolean {\r\n const keys = Object.keys(a);\r\n return keys.length === Object.keys(b).length && keys.every((key) => a[key] === b[key]);\r\n}\r\n\r\n/**\r\n * Bu kitin premium data-table'ı.\r\n *\r\n * İKİ satırlık üst yapı:\r\n * 1. **Toolbar** — başlık + kayıt sayacı · her zaman açık arama (bir veri\r\n * tablosunda arama gizlenmez, bu bir navbar deseni) · Kolonlar/Yoğunluk\r\n * ikon kümesi · `[tableActions]` slotu (sayfanın GERÇEK aksiyonu, tek dolu\r\n * buton — Kolonlar/Yoğunluk kasıtlı olarak hayalet kalır, göz doğru yere\r\n * gitsin diye). Seçim modunda DA aynı kalır — eskiden seçim toolbar'ın\r\n * TAMAMINI yok ediyordu (gerçek bug, kullanıcı arama/filtre bağlamını\r\n * kaybediyordu).\r\n * 2. **Filtre/seçim şeridi** — filtrelenebilir kolon varsa HER ZAMAN görünür\r\n * (`TableFilterBar`, chip + \"+ Filtre\" komut menüsü — bkz. o dosya). Bir\r\n * satır seçilince bu şerit YERİNİ seçim aksiyonlarına bırakır (toolbar'ı\r\n * değil) — sağda \"N filtre\" rozeti filtre bağlamının kaybolmadığını\r\n * gösterir.\r\n *\r\n * `[clientSide]=\"true\"` verildiğinde Table gelen TAM diziyi kendisi\r\n * filtreler/sıralar/sayfalar (bkz. table-client-query.ts) ve `queryChange`\r\n * emit ETMEZ — backend'i sayfalanmayan uçlar için (tüketici artık kendi\r\n * `sortedRows`/`rows`/`total` boilerplate'ini yazmak zorunda kalmaz).\r\n */\r\n@Component({\r\n selector: 'mf-table',\r\n exportAs: 'mfTable',\r\n imports: [\r\n Button,\r\n Icon,\r\n Checkbox,\r\n Skeleton,\r\n EmptyState,\r\n NgTemplateOutlet,\r\n OverlayModule,\r\n TableFilterBar,\r\n TableColumnsMenu,\r\n TablePagination,\r\n TableResizeHandle,\r\n SearchInput,\r\n Tooltip,\r\n ],\r\n host: { class: 'block' },\r\n templateUrl: './table.html',\r\n})\r\nexport class Table<T> {\r\n /** Template'te `[class]=\"cn(...)\"` ile koşullu class birleştirmek için. */\r\n protected readonly cn = cn;\r\n\r\n readonly title = input('');\r\n readonly columns = input.required<TableColumn<T>[]>();\r\n /** Sunucu modunda SADECE geçerli sayfa; `[clientSide]=\"true\"` modunda TAM dizi (bkz. sınıf yorumu). */\r\n readonly data = input.required<readonly T[]>();\r\n readonly rowKey = input.required<keyof T & string>();\r\n readonly loading = input(false);\r\n /** Sunucu modunda zorunlu (toplam kayıt). `clientSide` modunda YOK SAYILIR — toplam `data().length`'ten türetilir. */\r\n readonly total = input(0);\r\n readonly pageSizeOptions = input<number[]>([10, 20, 50, 100]);\r\n readonly selectable = input(false);\r\n readonly searchable = input(true);\r\n readonly stickyHeader = input(false);\r\n /** `compact` yoğun listeler için satır başına dikey boşluğu daraltır. `model()` — toolbar'daki düğme TOGGLE eder, ama ekran isterse `[(density)]` ile de kontrol edebilir. */\r\n readonly density = model<'comfortable' | 'compact'>('comfortable');\r\n readonly rowActions = input<{ edit?: boolean; delete?: boolean }>({});\r\n /** true ise Table gelen `data()`'yı TAM liste sayar, kendi içinde filtreler/sıralar/sayfalar; `queryChange` emit edilmez (bkz. sınıf yorumu). */\r\n readonly clientSide = input(false);\r\n\r\n /**\r\n * Başlık kenarlarında sürükleme tutamacı (klavye: ←/→, çift tık/Enter: içeriğe sığdır).\r\n * İlk boyutlandırmada tüm görünür kolonların ölçülen genişliği dondurulur ve tablo\r\n * `table-layout: fixed`e geçer — aksi halde otomatik düzen, sürüklenen kolonun\r\n * kazandığını komşulardan geri alıp tutamacı imlecin altından kaçırıyordu.\r\n */\r\n readonly resizableColumns = input(false, { transform: booleanAttribute });\r\n /** Kolon genişlikleri (px, `field` → genişlik). `[(columnWidths)]` ile kalıcılaştırılabilir. */\r\n readonly columnWidths = model<Readonly<Record<string, number>>>({});\r\n\r\n /**\r\n * Verilirse her satırın başında bir aç/kapa düğmesi çıkar; açık satırın altında bu şablon\r\n * tam genişlikte render edilir (context: `{ $implicit: row }`). `virtual` ile birlikte\r\n * KULLANILMAZ — değişken yükseklikli satır sabit satır yüksekliği varsayımını bozar.\r\n */\r\n readonly expandedRowTemplate = input<TemplateRef<{ $implicit: T }>>();\r\n\r\n /**\r\n * Sayfalama yerine sanal kaydırma: TÜM satırlar tek listede, yalnızca görünen aralık\r\n * (± 8 satır) DOM'da. Başlık yapışkan, `aria-rowcount`/`aria-rowindex` tam listeyi\r\n * duyurur. Binlerce satırlık `clientSide` listeler için.\r\n */\r\n readonly virtual = input(false, { transform: booleanAttribute });\r\n /** `virtual` modunda kaydırma alanının yüksekliği (CSS uzunluğu). */\r\n readonly virtualHeight = input('32rem');\r\n\r\n /**\r\n * Table'ın TÜM chrome metinleri (arama placeholder'ı, boş/sonuç-yok\r\n * durumları, satır aksiyonları, yoğunluk düğmesi, filtre çubuğu + sayfalama\r\n * dahil — `filter`/`pagination` iç içe alt-alanlar) TEK bir grup input —\r\n * eskiden 16 ayrı `input()` + `filterLabels`/`paginationLabels` idi (bkz.\r\n * git geçmişi); `DeepPartial` olduğu için sadece değiştirmek istediğin\r\n * alanı geçebilirsin, kalanı `MF_TABLE_LABELS`'tan (bkz.\r\n * `provideMesgflowUi`) gelir.\r\n */\r\n readonly labels = input<DeepPartial<MfTableLabels>>();\r\n\r\n private readonly tableLabelsToken = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(() =>\r\n mergeLabels(this.tableLabelsToken(), this.labels()),\r\n );\r\n\r\n readonly queryChange = output<PagedRequest>();\r\n readonly selectionChange = output<T[]>();\r\n readonly edit = output<T>();\r\n readonly delete = output<T>();\r\n readonly rowDblClick = output<T>();\r\n /** Bir satır açıldı/kapandı — ayrıntıyı tembel yüklemek için. */\r\n readonly rowExpandedChange = output<{ row: T; expanded: boolean }>();\r\n\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly scroller = viewChild.required<ElementRef<HTMLElement>>('scroller');\r\n private readonly idPrefix = `mf-table-${++tableIdSeq}`;\r\n\r\n protected readonly pageState = signal<PageRequest>({\r\n pageNumber: 1,\r\n pageSize: DEFAULT_PAGE_SIZE,\r\n });\r\n protected readonly sortState = signal<SortDescriptor[]>([]);\r\n protected readonly searchTerm = signal('');\r\n protected readonly appliedFilters = signal<AppliedFilter[]>([]);\r\n protected readonly filterLogic = signal<FilterLogic>(FilterLogic.And);\r\n protected readonly selectedRows = signal<Map<unknown, T>>(new Map());\r\n protected readonly hiddenColumns = signal<Set<string>>(new Set());\r\n protected readonly columnsMenuOpen = signal(false);\r\n\r\n protected readonly FilterLogic = FilterLogic;\r\n\r\n /** Sabitlenen kolonlar (`pinned: 'left'`) verildikleri sırayla öne alınır. */\r\n protected readonly visibleColumns = computed(() => {\r\n const visible = this.columns().filter((c) => !this.hiddenColumns().has(c.field));\r\n return [\r\n ...visible.filter((c) => c.pinned === 'left'),\r\n ...visible.filter((c) => c.pinned !== 'left'),\r\n ];\r\n });\r\n protected readonly hasPinned = computed(() =>\r\n this.visibleColumns().some((c) => c.pinned === 'left'),\r\n );\r\n /** Sabit bölgenin sağ kenarı — ayırıcı gölge bu hücrede. Sabit kolon yoksa `null`. */\r\n protected readonly lastPinnedKey = computed(\r\n () =>\r\n this.visibleColumns()\r\n .filter((c) => c.pinned === 'left')\r\n .at(-1)?.field ?? null,\r\n );\r\n /** Ölçülen satır-başı ofsetleri (px, `inset-inline-start`) — anahtar: `field`, `__expand`, `__select`. */\r\n protected readonly pinOffsets = signal<Record<string, number>>({});\r\n /** Başlık hücrelerinin ölçülen genişliği — tutamacın `aria-valuenow`u dondurulmadan önce buradan. */\r\n private readonly measuredWidths = signal<Record<string, number>>({});\r\n\r\n protected readonly expandable = computed(() => !!this.expandedRowTemplate() && !this.virtual());\r\n protected readonly expandedKeys = signal<ReadonlySet<unknown>>(new Set());\r\n\r\n protected readonly fixedLayout = computed(() => Object.keys(this.columnWidths()).length > 0);\r\n /** Sabit düzende tablonun toplam genişliği — kolonlar kapsayıcıdan genişse yatay kaydırma doğar. */\r\n protected readonly tableWidth = computed(() => {\r\n if (!this.fixedLayout()) return null;\r\n const widths = this.columnWidths();\r\n const columns = this.visibleColumns().reduce(\r\n (sum, col) => sum + (widths[col.field] ?? FALLBACK_COL_PX),\r\n 0,\r\n );\r\n const leading =\r\n (this.selectable() ? LEADING_COL_PX : 0) + (this.expandable() ? LEADING_COL_PX : 0);\r\n return columns + leading + (this.hasRowActions() ? ACTIONS_COL_PX : 0);\r\n });\r\n\r\n private readonly scrollTop = signal(0);\r\n private readonly viewportHeight = signal(0);\r\n /** Kaydırma alanının görünür genişliği — ayrıntı satırı içeriği yatay kaydırmada bu genişlikte sabit kalır. */\r\n protected readonly viewportWidth = signal(0);\r\n private readonly measuredRowHeight = signal(0);\r\n /** Tablo/kapsayıcı yeniden boyutlandığında sabit kolon ofsetleri yeniden ölçülür. */\r\n private readonly layoutTick = signal(0);\r\n protected readonly hasFilterableColumns = computed(() => this.columns().some((c) => c.filter));\r\n protected readonly activeFilterCount = computed(() => this.appliedFilters().length);\r\n protected readonly isFiltered = computed(\r\n () => !!this.searchTerm().trim() || this.appliedFilters().length > 0,\r\n );\r\n protected readonly hasRowActions = computed(\r\n () => !!(this.rowActions().edit || this.rowActions().delete),\r\n );\r\n protected readonly columnSpan = computed(\r\n () =>\r\n this.visibleColumns().length +\r\n (this.selectable() ? 1 : 0) +\r\n (this.expandable() ? 1 : 0) +\r\n (this.hasRowActions() ? 1 : 0),\r\n );\r\n\r\n /** `clientSide` modunda `data()` TAM listedir — burada filtrelenip/sıralanıp/sayfalanır (bkz. table-client-query.ts). Sunucu modunda kullanılmaz. */\r\n private readonly clientResult = computed(() => {\r\n const rows = this.data();\r\n const filtered = this.isFiltered()\r\n ? rows.filter((row) => matchesFilterGroup(row, this.buildFilter()))\r\n : [...rows];\r\n const sorted = sortRows(filtered, this.sortState());\r\n if (this.virtual()) return { items: sorted, total: filtered.length };\r\n const { pageNumber, pageSize } = this.pageState();\r\n const start = (pageNumber - 1) * pageSize;\r\n return { items: sorted.slice(start, start + pageSize), total: filtered.length };\r\n });\r\n\r\n protected readonly rows = computed(() =>\r\n this.clientSide() ? this.clientResult().items : this.data(),\r\n );\r\n protected readonly rowsTotal = computed(() =>\r\n this.clientSide() ? this.clientResult().total : this.total(),\r\n );\r\n\r\n /** `virtual` modunda görünen aralık; değilse `null` (tüm `rows()` render edilir). */\r\n protected readonly virtualRange = computed(() => {\r\n if (!this.virtual()) return null;\r\n const rowHeight = this.measuredRowHeight() || FALLBACK_ROW_PX[this.density()];\r\n return virtualWindow(\r\n this.rows().length,\r\n this.scrollTop(),\r\n this.viewportHeight() || 600,\r\n rowHeight,\r\n );\r\n });\r\n protected readonly displayRows = computed(() => {\r\n const range = this.virtualRange();\r\n return range ? this.rows().slice(range.start, range.end) : this.rows();\r\n });\r\n protected readonly rowIndexOffset = computed(() => this.virtualRange()?.start ?? 0);\r\n protected readonly isStickyHeader = computed(() => this.stickyHeader() || this.virtual());\r\n\r\n protected readonly skeletonIndexes = computed(() =>\r\n Array.from({ length: Math.min(this.pageState().pageSize, 8) }, (_, i) => i),\r\n );\r\n /** `overflow-x-auto` HER ZAMAN gerekli (dar viewport'ta yatay kaydırma olmadan tablo taşıp sağdaki satır aksiyonlarını görünmez kılıyordu). `stickyHeader` ek olarak dikey kaydırma+sabit başlık ekliyor. */\r\n protected readonly scrollWrapperClasses = computed(() =>\r\n cn(\r\n 'overflow-x-auto',\r\n this.virtual() && 'overflow-y-auto overscroll-contain',\r\n this.stickyHeader() && !this.virtual() && 'max-h-[28rem] overflow-y-auto',\r\n ),\r\n );\r\n\r\n /*\r\n * `compact` eskiden `py-2`/`py-2`ydi — `comfortable`'a (py-2.5/py-3) çok\r\n * yakın durduğundan geçiş neredeyse fark edilmiyordu (gerçek kullanıcı\r\n * bulgusu: \"1px anca oynuyor, sık gibi durmuyor\"). Fark artık satır\r\n * başına ~16px'e çıkarıldı (60px → ~45px) — ikon/checkbox boyutları\r\n * (18-20px) hâlâ rahat sığıyor, taşma/kırpılma YOK (bkz. dev sunucuda\r\n * canlı ölçüm).\r\n */\r\n protected readonly headerCellPad = computed(() =>\r\n this.density() === 'compact' ? 'py-1.5' : 'py-2.5',\r\n );\r\n protected readonly bodyCellPad = computed(() => (this.density() === 'compact' ? 'py-1' : 'py-3'));\r\n\r\n protected readonly allChecked = computed(() => {\r\n const rows = this.rows();\r\n return rows.length > 0 && rows.every((row) => this.selectedRows().has(row[this.rowKey()]));\r\n });\r\n protected readonly indeterminate = computed(\r\n () => this.selectedRows().size > 0 && !this.allChecked(),\r\n );\r\n protected readonly selectedCount = computed(() => this.selectedRows().size);\r\n\r\n /** İlk yüklemede satır yoksa iskelet gösterilir. Sonraki her sorguda (arama/filtre/sayfa) satırlar YERİNDE kalır, sadece soluklaşır — eskiden HER sorguda tüm tablo iskelete dönüp \"yanıp sönüyordu\" (gerçek bulgu). */\r\n protected readonly showSkeleton = computed(() => this.loading() && this.rows().length === 0);\r\n protected readonly showStaleOverlay = computed(() => this.loading() && this.rows().length > 0);\r\n\r\n constructor() {\r\n // Sayfa/sıralama/filtre değişince `rows()` yeni bir referans alır —\r\n // önceki seçim artık görünürdeki satırlarla eşleşmeyebileceğinden temizlenir.\r\n effect(() => {\r\n this.rows();\r\n untracked(() => {\r\n this.selectedRows.set(new Map());\r\n // Yeni sonuç kümesi (arama/filtre/sıralama) — sanal listede eski kaydırma konumu anlamsız.\r\n if (this.virtual() && this.scrollTop() !== 0) {\r\n this.scroller().nativeElement.scrollTop = 0;\r\n this.scrollTop.set(0);\r\n }\r\n });\r\n });\r\n\r\n // Ölçüm: sabit kolon ofsetleri + sanal satır yüksekliği. Değer değişmedikçe yazılmaz\r\n // (render → ölçüm → set → render döngüsü tek turda durulur).\r\n afterRenderEffect({\r\n read: () => {\r\n this.visibleColumns();\r\n this.columnWidths();\r\n this.density();\r\n this.layoutTick();\r\n this.displayRows();\r\n const root = this.host.nativeElement;\r\n if (this.hasPinned()) {\r\n const next: Record<string, number> = {};\r\n const rtl = isRtl(root);\r\n root.querySelectorAll<HTMLElement>('thead th[data-pin]').forEach((th) => {\r\n // Satır başından uzaklık — RTL'de sağ kenardan (sabit kolonlar sağa yapışır).\r\n const table = th.offsetParent as HTMLElement | null;\r\n next[th.dataset['pin']!] = rtl\r\n ? (table?.offsetWidth ?? 0) - th.offsetLeft - th.offsetWidth\r\n : th.offsetLeft;\r\n });\r\n if (!sameRecord(next, untracked(this.pinOffsets))) this.pinOffsets.set(next);\r\n }\r\n if (this.resizableColumns()) {\r\n const widths: Record<string, number> = {};\r\n root.querySelectorAll<HTMLElement>('thead th[data-col]').forEach((th) => {\r\n widths[th.dataset['col']!] = Math.round(th.getBoundingClientRect().width);\r\n });\r\n if (!sameRecord(widths, untracked(this.measuredWidths))) this.measuredWidths.set(widths);\r\n }\r\n if (this.virtual()) {\r\n const row = root.querySelector<HTMLElement>('tbody tr[data-row]');\r\n const height = row?.getBoundingClientRect().height ?? 0;\r\n if (height > 0 && Math.abs(height - untracked(this.measuredRowHeight)) > 0.5)\r\n this.measuredRowHeight.set(height);\r\n }\r\n },\r\n });\r\n\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n const scroller = this.scroller().nativeElement;\r\n const observer = new ResizeObserver(() => {\r\n this.viewportHeight.set(scroller.clientHeight);\r\n this.viewportWidth.set(scroller.clientWidth);\r\n this.layoutTick.update((tick) => tick + 1);\r\n });\r\n observer.observe(scroller);\r\n const table = scroller.querySelector('table');\r\n if (table) observer.observe(table);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n protected onScroll(event: Event): void {\r\n if (!this.virtual()) return;\r\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\r\n }\r\n\r\n // ---- Kolon genişliği ----\r\n\r\n protected widthStyle(col: TableColumn<T>): string | null {\r\n const px = this.columnWidths()[col.field];\r\n return px ? `${px}px` : (col.width ?? null);\r\n }\r\n\r\n /** Tutamacın `aria-valuenow`u: kaydedilmiş > ölçülen > alt sınır. */\r\n protected currentWidth(col: TableColumn<T>): number {\r\n return (\r\n this.columnWidths()[col.field] || this.measuredWidths()[col.field] || (col.minWidth ?? 80)\r\n );\r\n }\r\n\r\n protected isResizable(col: TableColumn<T>): boolean {\r\n return this.resizableColumns() && col.resizable !== false;\r\n }\r\n\r\n protected resizeAriaLabel(col: TableColumn<T>): string {\r\n return `${this.effectiveLabels().resizeColumn}: ${col.header}`;\r\n }\r\n\r\n /** Henüz genişliği kaydedilmemiş görünür kolonları ölçülen genişlikte dondurur. */\r\n protected freezeWidths(): void {\r\n const current = { ...this.columnWidths() };\r\n let changed = false;\r\n this.host.nativeElement.querySelectorAll<HTMLElement>('thead th[data-col]').forEach((th) => {\r\n const field = th.dataset['col']!;\r\n if (current[field] !== undefined) return;\r\n current[field] = Math.round(th.getBoundingClientRect().width) || FALLBACK_COL_PX;\r\n changed = true;\r\n });\r\n if (changed) this.columnWidths.set(current);\r\n }\r\n\r\n protected onColumnResize(col: TableColumn<T>, width: number): void {\r\n this.columnWidths.update((widths) => ({ ...widths, [col.field]: width }));\r\n }\r\n\r\n /** İçeriğe sığdır: kolondaki en geniş hücre içeriği + yatay dolgu (`px-4` × 2). */\r\n protected autofitColumn(col: TableColumn<T>): void {\r\n this.freezeWidths();\r\n let widest = 0;\r\n this.host.nativeElement.querySelectorAll<HTMLElement>('[data-col]').forEach((cell) => {\r\n if (cell.dataset['col'] !== col.field) return;\r\n const content = cell.firstElementChild as HTMLElement | null;\r\n widest = Math.max(widest, content?.getBoundingClientRect().width ?? 0);\r\n });\r\n if (widest > 0) this.onColumnResize(col, Math.max(col.minWidth ?? 80, Math.ceil(widest + 32)));\r\n }\r\n\r\n // ---- Sabit kolonlar ----\r\n\r\n /** Sabitlenecek bir hücre mi? Öndeki seçim/genişletme kolonları, sabit kolon varsa onlarla gider. */\r\n protected isPinnedKey(key: string): boolean {\r\n if (!this.hasPinned()) return false;\r\n if (key === '__select' || key === '__expand') return true;\r\n return this.visibleColumns().some((c) => c.field === key && c.pinned === 'left');\r\n }\r\n\r\n protected pinStart(key: string): number | null {\r\n return this.isPinnedKey(key) ? (this.pinOffsets()[key] ?? 0) : null;\r\n }\r\n\r\n /** Başlık hücresinin sabitleme sınıfları (`thead` zaten opak `bg-surface-sunken`). */\r\n protected pinHeadClasses(key: string): string {\r\n if (!this.isPinnedKey(key)) return '';\r\n return cn('sticky z-[2] bg-surface-sunken', this.edgeShadow(key));\r\n }\r\n\r\n /** Gövde hücresi: opak zemin şart — altından kayan hücreler sızmasın (bkz. `rowBg`). */\r\n protected pinBodyClasses(key: string, row: T): string {\r\n if (!this.isPinnedKey(key)) return '';\r\n return cn('sticky z-[1]', this.rowBg(row), this.edgeShadow(key));\r\n }\r\n\r\n /** `border-collapse` altında kenarlıklar yapışkan hücreyle gitmez — içe gölge gider. */\r\n private edgeShadow(key: string): string {\r\n return key === this.lastPinnedKey()\r\n ? 'shadow-[inset_-1px_0_0_var(--mf-border)] rtl:shadow-[inset_1px_0_0_var(--mf-border)]'\r\n : '';\r\n }\r\n\r\n // ---- Satır genişletme ----\r\n\r\n protected isExpanded(row: T): boolean {\r\n return this.expandedKeys().has(row[this.rowKey()]);\r\n }\r\n\r\n protected toggleExpanded(row: T): void {\r\n const key = row[this.rowKey()];\r\n const next = new Set(this.expandedKeys());\r\n const expanded = !next.has(key);\r\n if (expanded) next.add(key);\r\n else next.delete(key);\r\n this.expandedKeys.set(next);\r\n this.rowExpandedChange.emit({ row, expanded });\r\n }\r\n\r\n protected expandedRowId(index: number): string {\r\n return `${this.idPrefix}-detail-${index}`;\r\n }\r\n\r\n protected expandAriaLabel(row: T): string {\r\n const labels = this.effectiveLabels();\r\n return this.withRowIdentity(row, this.isExpanded(row) ? labels.collapseRow : labels.expandRow);\r\n }\r\n\r\n protected trackByRow = (_: number, row: T): unknown => row[this.rowKey()];\r\n\r\n /** `type: 'numeric'` açıkça `align` verilmemişse sağa yaslanır; diğer tüm kolonlar `col.align`'a düşer (varsayılan sol). */\r\n protected resolvedAlign(col: TableColumn<T>): 'left' | 'center' | 'right' {\r\n return col.align ?? (col.type === 'numeric' ? 'right' : 'left');\r\n }\r\n\r\n protected alignClass(align: 'left' | 'center' | 'right'): string {\r\n return align === 'center' ? 'text-center' : align === 'right' ? 'text-end' : 'text-start';\r\n }\r\n\r\n /** Kimlik kolonu (`primary`) `text-fg font-medium` — göz bir satırda tutunacak bir çapa buluyor; diğer her hücre `text-fg-muted` kalır (eskiden HER hücre aynı ağırlıktaydı). */\r\n protected cellClasses(col: TableColumn<T>): string {\r\n return cn(\r\n col.primary ? 'text-fg font-medium' : 'text-fg-muted',\r\n col.type === 'numeric' && 'tabular-nums',\r\n !col.cellTemplate && 'truncate',\r\n );\r\n }\r\n\r\n /** `[title]` (kesilmiş metin için native tooltip) ve boş/`null` değerleri güvenle metne çevirir — Angular şablonları global `String()`'e erişemiyor. */\r\n protected cellText(row: T, col: TableColumn<T>): string {\r\n const value = row[col.field];\r\n return value === null || value === undefined ? '' : String(value);\r\n }\r\n\r\n /** Satır checkbox'ının erişilebilir adı — kimlik kolonundan (`primary`, yoksa ilk kolon) türetilir, tüm satırların AYNI \"Select row\" metnini taşımasını önler. */\r\n protected rowSelectAriaLabel(row: T): string {\r\n return this.withRowIdentity(row, this.effectiveLabels().selectRowAriaLabel);\r\n }\r\n\r\n /** \"Etiket: kimlik\" — kimlik kolonundan (`primary`, yoksa ilk kolon) türetilir. */\r\n private withRowIdentity(row: T, label: string): string {\r\n const col = this.columns().find((c) => c.primary) ?? this.columns()[0];\r\n const value = col ? this.cellText(row, col) : '';\r\n return value ? `${label}: ${value}` : label;\r\n }\r\n\r\n /**\r\n * Bu tazelemenin imza motiflerinden \"ray\": seçili satırın sol kenarında\r\n * 2px'lik dolu marka rengi çizgi. Kenarlık HER ZAMAN vardır (`border-s-2\r\n * border-s-transparent`), sadece rengi değişir — eskiden kenarlık sadece\r\n * SEÇİLİYKEN ekleniyordu, `border-collapse: collapse` altında bu 2px\r\n * gerçek yer kaplıyor ve her tıklamada ilk hücrenin içeriği 2px kayıyordu\r\n * (gerçek layout bug'ı, tarayıcıda `getBoundingClientRect` ile doğrulandı).\r\n * `group/row`: sağdaki sabit aksiyon hücresinin hover rengini satırla\r\n * senkron tutmak için (bkz. stickyActionClasses).\r\n */\r\n protected rowClasses(row: T): string {\r\n const selected = this.isChecked(row);\r\n return cn(\r\n 'group/row border-b border-b-hairline border-s-2 transition-colors duration-fast ease-emphasis',\r\n selected\r\n ? 'border-s-accent-fill bg-primary-tint'\r\n : 'border-s-transparent hover:bg-state-hover',\r\n this.showStaleOverlay() && 'opacity-60',\r\n );\r\n }\r\n\r\n /**\r\n * Sabit (sticky) aksiyon hücresi için — `rowClasses()`'ın aksine `bg-primary-tint`\r\n * DOĞRUDAN kullanılamaz: bu hücre yatay kaydırmada AYNI satırın diğer\r\n * hücrelerinin ÜSTÜNÜ kapatıyor, saydam bir zemin altındaki kaydırılmış\r\n * içeriği sızdırırdı (gerçek bir composite hatası). Bunun yerine OPAK\r\n * `bg-surface` + üstüne tint rengiyle boyanmış bir `background-image`\r\n * gradyanı — iki katman üst üste bindiğinde görsel sonuç `bg-primary-tint`\r\n * ile BİREBİR aynı, ama alttan hiçbir şey sızmaz. `--mf-primary-tint`\r\n * (`--color-primary-tint` DEĞİL) — arbitrary value içindeki `var()`\r\n * referansları Tailwind'in \"@theme inline\" tarama/eleme sezgisine bağlı,\r\n * `--mf-*` rol katmanı KENDİSİ her zaman `@layer base`'de KOŞULSUZ yazılır\r\n * (bkz. `tabs.variants.ts`'teki aynı karar).\r\n */\r\n protected rowBg(row: T): string {\r\n return this.isChecked(row)\r\n ? 'bg-surface bg-[linear-gradient(var(--mf-primary-tint),var(--mf-primary-tint))]'\r\n : 'bg-surface group-hover/row:bg-surface-alt';\r\n }\r\n\r\n protected stickyActionClasses(row: T): string {\r\n return cn(\r\n 'sticky end-0 z-[1] border-s border-border text-end',\r\n this.bodyCellPad(),\r\n this.rowBg(row),\r\n );\r\n }\r\n\r\n /** `SearchInput` kendi debounce'unu zaten uyguladı — burada gelen değer commit edilmiş (nihai). */\r\n protected onSearchCommit(value: string): void {\r\n this.searchTerm.set(value);\r\n this.pageState.update((p) => ({ ...p, pageNumber: 1 }));\r\n this.emitQuery();\r\n }\r\n\r\n /**\r\n * Düz tık: bu alanı TEK sıralama kriteri yapar (zaten TEK/birincil kriterse\r\n * yön döngüsü asc→desc→yok). Shift+tık: İKİNCİL sıralama ekler/döndürür/\r\n * kaldırır — backend en fazla 3 alan kabul ediyor (`SortExpressionBuilder.\r\n * MaxSortFields`). Eskiden çoklu sıralama YOKTU (yeni Table'ın eski\r\n * `shared/components/data-table`'a göre kaybettiği iki yetenekten biri).\r\n */\r\n protected onSortClick(column: TableColumn<T>, event?: MouseEvent): void {\r\n if (!column.sortable) return;\r\n const current = this.sortState();\r\n const index = current.findIndex((s) => s.field === column.field);\r\n\r\n if (!event?.shiftKey) {\r\n if (current.length === 1 && index === 0) {\r\n const next =\r\n current[0]!.direction === SortDirection.Ascending\r\n ? [{ field: column.field, direction: SortDirection.Descending }]\r\n : [];\r\n this.sortState.set(next);\r\n } else {\r\n this.sortState.set([{ field: column.field, direction: SortDirection.Ascending }]);\r\n }\r\n } else if (index === -1) {\r\n if (current.length >= 3) return;\r\n this.sortState.set([...current, { field: column.field, direction: SortDirection.Ascending }]);\r\n } else {\r\n const entry = current[index]!;\r\n this.sortState.set(\r\n entry.direction === SortDirection.Ascending\r\n ? current.map((s, i) => (i === index ? { ...s, direction: SortDirection.Descending } : s))\r\n : current.filter((_, i) => i !== index),\r\n );\r\n }\r\n this.emitQuery();\r\n }\r\n\r\n protected sortDirectionFor(field: string): SortDirection | null {\r\n return this.sortState().find((s) => s.field === field)?.direction ?? null;\r\n }\r\n\r\n /** WAI-ARIA `aria-sort` — ekran okuyucu sütunun sıralama yönünü duyurur (yalnızca sıralanabilir sütunlarda). */\r\n protected ariaSortFor(field: string): 'ascending' | 'descending' | 'none' {\r\n const dir = this.sortDirectionFor(field);\r\n return dir === 0 ? 'ascending' : dir === 1 ? 'descending' : 'none';\r\n }\r\n\r\n /** 1 tabanlı sıra konumu — yalnızca 2+ alan aktifken gösterilir (tekil sıralamada numara gürültü olurdu). */\r\n protected sortOrderFor(field: string): number | null {\r\n if (this.sortState().length < 2) return null;\r\n const index = this.sortState().findIndex((s) => s.field === field);\r\n return index === -1 ? null : index + 1;\r\n }\r\n\r\n protected onFiltersChange(filters: AppliedFilter[]): void {\r\n this.appliedFilters.set(filters);\r\n this.pageState.update((p) => ({ ...p, pageNumber: 1 }));\r\n this.emitQuery();\r\n }\r\n\r\n protected onFilterLogicChange(logic: FilterLogic): void {\r\n this.filterLogic.set(logic);\r\n if (this.appliedFilters().length > 1) this.emitQuery();\r\n }\r\n\r\n protected clearAllFilters(): void {\r\n this.searchTerm.set('');\r\n this.appliedFilters.set([]);\r\n this.pageState.update((p) => ({ ...p, pageNumber: 1 }));\r\n this.emitQuery();\r\n }\r\n\r\n protected onPageChange(page: number): void {\r\n this.pageState.update((p) => ({ ...p, pageNumber: page }));\r\n this.emitQuery();\r\n }\r\n\r\n protected onPageSizeChange(size: number): void {\r\n this.pageState.set({ pageNumber: 1, pageSize: size });\r\n this.emitQuery();\r\n }\r\n\r\n protected toggleDensity(): void {\r\n this.density.update((d) => (d === 'comfortable' ? 'compact' : 'comfortable'));\r\n }\r\n\r\n protected densityToggleTooltip(): string {\r\n const labels = this.effectiveLabels();\r\n return `${labels.density}: ${this.density() === 'comfortable' ? labels.densityCompact : labels.densityComfortable}`;\r\n }\r\n\r\n protected onHiddenColumnsChange(hidden: ReadonlySet<string>): void {\r\n this.hiddenColumns.set(new Set(hidden));\r\n }\r\n\r\n protected isChecked(row: T): boolean {\r\n return this.selectedRows().has(row[this.rowKey()]);\r\n }\r\n\r\n protected onCheckAll(checked: boolean): void {\r\n const next = new Map<unknown, T>();\r\n if (checked) for (const row of this.rows()) next.set(row[this.rowKey()], row);\r\n this.selectedRows.set(next);\r\n this.selectionChange.emit([...next.values()]);\r\n }\r\n\r\n protected onCheckRow(row: T, checked: boolean): void {\r\n const next = new Map(this.selectedRows());\r\n if (checked) next.set(row[this.rowKey()], row);\r\n else next.delete(row[this.rowKey()]);\r\n this.selectedRows.set(next);\r\n this.selectionChange.emit([...next.values()]);\r\n }\r\n\r\n protected clearSelection(): void {\r\n this.selectedRows.set(new Map());\r\n this.selectionChange.emit([]);\r\n }\r\n\r\n private buildFilter(): FilterGroup | undefined {\r\n const term = this.searchTerm().trim();\r\n const searchGroup = term ? this.searchGroupFor(term) : undefined;\r\n const chipGroup = buildFilterGroup(this.appliedFilters(), this.filterLogic());\r\n\r\n if (searchGroup && chipGroup)\r\n return { logic: FilterLogic.And, groups: [searchGroup, chipGroup] };\r\n return searchGroup ?? chipGroup;\r\n }\r\n\r\n private searchGroupFor(term: string): FilterGroup | undefined {\r\n const fields = this.columns()\r\n .filter((c) => c.searchable)\r\n .map((c) => c.field);\r\n if (!fields.length) return undefined;\r\n return {\r\n logic: FilterLogic.Or,\r\n conditions: fields.map((field) => ({\r\n field,\r\n operator: FilterOperator.Contains,\r\n value: term,\r\n })),\r\n };\r\n }\r\n\r\n private emitQuery(): void {\r\n if (this.clientSide()) return;\r\n this.queryChange.emit(\r\n canonicalPagedRequest({\r\n page: this.pageState(),\r\n sort: this.sortState(),\r\n filter: this.buildFilter(),\r\n }),\r\n );\r\n }\r\n}\r\n","<div class=\"relative overflow-hidden rounded-lg border border-hairline bg-surface\">\r\n @if (showStaleOverlay()) {\r\n <div\r\n class=\"pointer-events-none absolute inset-x-0 top-0 z-20 h-0.5 overflow-hidden bg-primary-tint\"\r\n aria-hidden=\"true\"\r\n >\r\n <div class=\"h-full w-1/4 animate-progress-slide bg-accent-fill\"></div>\r\n </div>\r\n }\r\n\r\n <!--\r\n Satır 1 — toolbar. Seçim modunda da AYNI kalır: eskiden bir satır\r\n seçilince başlık+arama+filtre tamamen kaybolup yerine \"N seçildi\"\r\n geliyordu (gerçek bug, kullanıcı arama/filtre bağlamını kaybediyordu).\r\n Artık sadece Satır 2 (aşağıda) seçim aksiyonlarına devrediliyor.\r\n -->\r\n <div class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3\">\r\n <div class=\"flex min-w-0 items-center gap-2.5\">\r\n @if (title()) {\r\n <h3 class=\"truncate font-display text-title text-fg\">{{ title() }}</h3>\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-1 flex-wrap items-center justify-end gap-2\">\r\n @if (searchable()) {\r\n <mf-search-input\r\n [collapsible]=\"false\"\r\n [value]=\"searchTerm()\"\r\n [placeholder]=\"effectiveLabels().searchPlaceholder\"\r\n [ariaLabel]=\"effectiveLabels().searchPlaceholder\"\r\n [loading]=\"loading()\"\r\n (valueChange)=\"onSearchCommit($event)\"\r\n />\r\n }\r\n\r\n <!-- Kolonlar + Yoğunluk: BİLEREK hayalet (text/icon) kalıyor — göz [tableActions]'daki gerçek CTA'ya gitsin diye (bkz. table.ts sınıf yorumu, toolbar hiyerarşisi bulgusu). -->\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #columnsOrigin=\"cdkOverlayOrigin\"\r\n [mfTooltip]=\"effectiveLabels().columns\"\r\n [attr.aria-label]=\"effectiveLabels().columns\"\r\n (click)=\"columnsMenuOpen.set(!columnsMenuOpen())\"\r\n >\r\n <span mfIcon [size]=\"18\">view_column</span>\r\n </button>\r\n <mf-table-columns-menu\r\n [columns]=\"columns()\"\r\n [hidden]=\"hiddenColumns()\"\r\n [origin]=\"columnsOrigin\"\r\n [open]=\"columnsMenuOpen()\"\r\n [label]=\"effectiveLabels().columns\"\r\n (hiddenChange)=\"onHiddenColumnsChange($event)\"\r\n (closed)=\"columnsMenuOpen.set(false)\"\r\n />\r\n\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [mfTooltip]=\"densityToggleTooltip()\"\r\n [attr.aria-label]=\"densityToggleTooltip()\"\r\n (click)=\"toggleDensity()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{\r\n density() === 'comfortable' ? 'density_medium' : 'density_small'\r\n }}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[tableActions]\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Satır 2 — ya filtre çubuğu ya seçim çubuğu, ASLA ikisi birden. -->\r\n @if (selectedCount() > 0) {\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border bg-surface-sunken px-4 py-2\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().clearSelection\"\r\n (click)=\"clearSelection()\"\r\n >\r\n <span mfIcon [size]=\"18\">close</span>\r\n </button>\r\n <span class=\"text-sm font-medium text-fg-muted tabular-nums\"\r\n >{{ selectedCount() }} {{ effectiveLabels().selectedCount }}</span\r\n >\r\n </div>\r\n <div class=\"flex items-center gap-2\">\r\n <ng-content select=\"[tableBulkActions]\" />\r\n @if (activeFilterCount() > 0) {\r\n <span\r\n class=\"inline-flex items-center gap-1 rounded-full bg-surface-alt px-2 py-0.5 text-xs text-fg-subtle\"\r\n >\r\n <span mfIcon [size]=\"12\">filter_list</span>\r\n {{ activeFilterCount() }} {{ effectiveLabels().filterCount }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n } @else if (hasFilterableColumns()) {\r\n <mf-table-filter-bar\r\n [columns]=\"columns()\"\r\n [filters]=\"appliedFilters()\"\r\n [logic]=\"filterLogic()\"\r\n [labels]=\"effectiveLabels().filter\"\r\n (filtersChange)=\"onFiltersChange($event)\"\r\n (logicChange)=\"onFilterLogicChange($event)\"\r\n />\r\n }\r\n\r\n <div\r\n #scroller\r\n [class]=\"scrollWrapperClasses()\"\r\n [style.max-height]=\"virtual() ? virtualHeight() : null\"\r\n (scroll)=\"onScroll($event)\"\r\n >\r\n <table\r\n [class]=\"cn('border-collapse text-sm', fixedLayout() ? 'min-w-full table-fixed' : 'w-full')\"\r\n [style.width.px]=\"tableWidth()\"\r\n [attr.aria-rowcount]=\"virtual() ? rows().length + 1 : null\"\r\n >\r\n <thead\r\n [class]=\"\r\n cn(\r\n 'bg-surface-sunken',\r\n isStickyHeader() ? 'sticky top-0 z-10 border-b border-border-strong' : ''\r\n )\r\n \"\r\n >\r\n <tr class=\"border-b border-hairline\" [attr.aria-rowindex]=\"virtual() ? 1 : null\">\r\n @if (selectable()) {\r\n <th\r\n data-pin=\"__select\"\r\n [class]=\"cn('w-10 px-4', headerCellPad(), pinHeadClasses('__select'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"allChecked()\"\r\n [indeterminate]=\"indeterminate()\"\r\n [attr.aria-label]=\"effectiveLabels().selectAllAriaLabel\"\r\n (change)=\"onCheckAll($any($event.target).checked)\"\r\n />\r\n </th>\r\n }\r\n @if (expandable()) {\r\n <th\r\n data-pin=\"__expand\"\r\n [class]=\"cn('w-10 px-1.5', headerCellPad(), pinHeadClasses('__expand'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <span class=\"sr-only\">{{ effectiveLabels().expandRow }}</span>\r\n </th>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <th\r\n [attr.data-col]=\"col.field\"\r\n [attr.aria-sort]=\"col.sortable ? ariaSortFor(col.field) : null\"\r\n [attr.data-pin]=\"col.pinned === 'left' ? col.field : null\"\r\n [class]=\"\r\n cn(\r\n 'group/th relative truncate px-4 text-eyebrow text-fg-subtle',\r\n headerCellPad(),\r\n alignClass(resolvedAlign(col)),\r\n pinHeadClasses(col.field)\r\n )\r\n \"\r\n [style.width]=\"widthStyle(col)\"\r\n [style.min-width.px]=\"col.minWidth ?? null\"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n >\r\n @if (col.sortable) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex appearance-none items-center gap-1 rounded-xs border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n (click)=\"onSortClick(col, $event)\"\r\n >\r\n <span>{{ col.header }}</span>\r\n @if (sortOrderFor(col.field); as order) {\r\n <span class=\"text-caption font-bold text-accent tabular-nums\">{{ order }}</span>\r\n }\r\n <span\r\n mfIcon\r\n [size]=\"14\"\r\n [class]=\"\r\n sortDirectionFor(col.field) !== null\r\n ? 'text-accent'\r\n : 'text-fg-subtle opacity-0 transition-opacity duration-fast group-hover/th:opacity-100'\r\n \"\r\n >\r\n @switch (sortDirectionFor(col.field)) {\r\n @case (0) {\r\n arrow_upward\r\n }\r\n @case (1) {\r\n arrow_downward\r\n }\r\n @default {\r\n unfold_more\r\n }\r\n }\r\n </span>\r\n </button>\r\n } @else {\r\n <span>{{ col.header }}</span>\r\n }\r\n @if (isResizable(col)) {\r\n <span\r\n mfTableResizeHandle\r\n [label]=\"resizeAriaLabel(col)\"\r\n [width]=\"currentWidth(col)\"\r\n [min]=\"col.minWidth ?? 80\"\r\n (resizeStart)=\"freezeWidths()\"\r\n (widthChange)=\"onColumnResize(col, $event)\"\r\n (autofit)=\"autofitColumn(col)\"\r\n ></span>\r\n }\r\n </th>\r\n }\r\n @if (hasRowActions()) {\r\n <th [class]=\"cn('sticky end-0 z-[1] w-20 bg-surface-sunken px-4', headerCellPad())\">\r\n <span class=\"sr-only\">{{ effectiveLabels().actionsColumnLabel }}</span>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (showSkeleton()) {\r\n @for (i of skeletonIndexes(); track i) {\r\n <tr class=\"border-b border-hairline\">\r\n @if (selectable()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"><div mfSkeleton class=\"h-4 w-4\"></div></td>\r\n }\r\n @if (expandable()) {\r\n <td [class]=\"cn('px-1.5', bodyCellPad())\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\">\r\n <div mfSkeleton class=\"h-4 w-full max-w-[10rem]\"></div>\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"></td>\r\n }\r\n </tr>\r\n }\r\n } @else if (rows().length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columnSpan()\" class=\"px-4 py-6\">\r\n <mf-empty-state\r\n class=\"block\"\r\n [title]=\"\r\n isFiltered() ? effectiveLabels().noResultsTitle : effectiveLabels().emptyTitle\r\n \"\r\n [description]=\"\r\n isFiltered()\r\n ? effectiveLabels().noResultsDescription\r\n : effectiveLabels().emptyDescription\r\n \"\r\n >\r\n <span icon mfIcon [size]=\"28\">{{ isFiltered() ? 'search_off' : 'inbox' }}</span>\r\n @if (isFiltered()) {\r\n <button\r\n action\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"primary\"\r\n type=\"button\"\r\n (click)=\"clearAllFilters()\"\r\n >\r\n {{ effectiveLabels().clearFilters }}\r\n </button>\r\n }\r\n </mf-empty-state>\r\n </td>\r\n </tr>\r\n } @else {\r\n @if (virtualRange(); as range) {\r\n @if (range.top > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.top\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n @for (row of displayRows(); track trackByRow($index, row)) {\r\n <tr\r\n data-row\r\n [class]=\"rowClasses(row)\"\r\n [attr.aria-rowindex]=\"virtual() ? rowIndexOffset() + $index + 2 : null\"\r\n (dblclick)=\"rowDblClick.emit(row)\"\r\n >\r\n @if (selectable()) {\r\n <td\r\n [class]=\"cn('px-4', bodyCellPad(), pinBodyClasses('__select', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isChecked(row)\"\r\n [attr.aria-label]=\"rowSelectAriaLabel(row)\"\r\n (change)=\"onCheckRow(row, $any($event.target).checked)\"\r\n />\r\n </td>\r\n }\r\n @if (expandable()) {\r\n <td\r\n [class]=\"cn('px-1.5', bodyCellPad(), pinBodyClasses('__expand', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex size-7 appearance-none items-center justify-center rounded-md border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n [attr.aria-expanded]=\"isExpanded(row)\"\r\n [attr.aria-controls]=\"isExpanded(row) ? expandedRowId($index) : null\"\r\n [attr.aria-label]=\"expandAriaLabel(row)\"\r\n (click)=\"toggleExpanded(row)\"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"transition-transform duration-base ease-emphasis rtl:-scale-x-100\"\r\n [class.rotate-90]=\"isExpanded(row)\"\r\n [class.rtl:-rotate-90]=\"isExpanded(row)\"\r\n >chevron_right</span\r\n >\r\n </button>\r\n </td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td\r\n [attr.data-col]=\"col.field\"\r\n [class]=\"\r\n cn(\r\n 'max-w-0 px-4',\r\n bodyCellPad(),\r\n cellClasses(col),\r\n alignClass(resolvedAlign(col)),\r\n pinBodyClasses(col.field, row)\r\n )\r\n \"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n [title]=\"!col.cellTemplate ? cellText(row, col) : null\"\r\n >\r\n @if (col.cellTemplate) {\r\n <ng-container\r\n *ngTemplateOutlet=\"col.cellTemplate; context: { $implicit: row }\"\r\n />\r\n } @else {\r\n <span>{{ row[col.field] }}</span>\r\n }\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"stickyActionClasses(row)\">\r\n <div\r\n class=\"flex items-center justify-end gap-1 opacity-100 [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover/row:opacity-100 group-focus-within/row:opacity-100\"\r\n >\r\n @if (rowActions().edit) {\r\n <!--\r\n `tone=\"info\"` (mavi) BİLEREK `neutral` DEĞİL — satır\r\n hover'ı zaten `bg-surface-alt` boyuyor (bkz. rowBg()),\r\n `neutral`'ın kendi `hover:bg-state-hover`'ı AYNI renk\r\n olduğundan buton üzerine gelince görsel hiçbir şey\r\n değişmiyordu (gerçek kullanıcı bulgusu). Delete'in\r\n `danger` (kırmızı ton) hover'ı bu sorunu yaşamıyordu —\r\n aynı mantık: Edit'e de arka planla çakışmayan kendi\r\n renk tonu (mavi `info/5`) verildi.\r\n -->\r\n <button\r\n mfButton\r\n tone=\"info\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().edit\"\r\n [mfTooltip]=\"effectiveLabels().edit\"\r\n (click)=\"edit.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">edit</span>\r\n </button>\r\n }\r\n @if (rowActions().delete) {\r\n <button\r\n mfButton\r\n tone=\"danger\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().delete\"\r\n [mfTooltip]=\"effectiveLabels().delete\"\r\n (click)=\"delete.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">delete</span>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n @if (expandable() && isExpanded(row)) {\r\n <tr [id]=\"expandedRowId($index)\" class=\"border-b border-b-hairline bg-surface-sunken\">\r\n <td [attr.colspan]=\"columnSpan()\" class=\"p-0\">\r\n <!-- Yatay kaydırmada ayrıntı görünür alanda sabit kalır (tablo genişliğiyle kaymaz). -->\r\n <div\r\n class=\"sticky start-0 box-border px-4 py-3\"\r\n [style.width.px]=\"viewportWidth() || null\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"expandedRowTemplate()!; context: { $implicit: row }\"\r\n />\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n @if (virtualRange(); as range) {\r\n @if (range.bottom > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.bottom\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"border-t border-border bg-surface-sunken\">\r\n @if (virtual()) {\r\n <p class=\"px-4 py-2.5 text-sm text-fg-muted tabular-nums\">\r\n {{ rowsTotal() }} {{ effectiveLabels().pagination.records }}\r\n </p>\r\n } @else {\r\n <mf-table-pagination\r\n [page]=\"pageState().pageNumber\"\r\n [pageSize]=\"pageState().pageSize\"\r\n [total]=\"rowsTotal()\"\r\n [pageSizeOptions]=\"pageSizeOptions()\"\r\n [labels]=\"effectiveLabels().pagination\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["operatorLabelFor"],"mappings":"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"}
1
+ {"version":3,"file":"mesgflow-ui-kit-table.mjs","sources":["../../../projects/ui-kit/table/query-contract.model.ts","../../../projects/ui-kit/table/table-client-query.ts","../../../projects/ui-kit/table/table-column-resize.ts","../../../projects/ui-kit/table/table-columns-menu.ts","../../../projects/ui-kit/table/table-columns-menu.html","../../../projects/ui-kit/table/table-filter-labels.ts","../../../projects/ui-kit/table/table-filter.model.ts","../../../projects/ui-kit/table/table-filter-menu.ts","../../../projects/ui-kit/table/table-filter-menu.html","../../../projects/ui-kit/table/table-filter-bar.ts","../../../projects/ui-kit/table/table-filter-bar.html","../../../projects/ui-kit/table/table-page-jump.ts","../../../projects/ui-kit/table/table-page-jump.html","../../../projects/ui-kit/table/table-pagination.ts","../../../projects/ui-kit/table/table-pagination.html","../../../projects/ui-kit/table/table-virtual.ts","../../../projects/ui-kit/table/table.ts","../../../projects/ui-kit/table/table.html","../../../projects/ui-kit/table/mesgflow-ui-kit-table.ts"],"sourcesContent":["export enum SortDirection {\r\n Ascending = 0,\r\n Descending = 1,\r\n}\r\n\r\nexport enum FilterOperator {\r\n Equal = 0,\r\n NotEqual = 1,\r\n GreaterThan = 2,\r\n GreaterOrEqual = 3,\r\n LessThan = 4,\r\n LessOrEqual = 5,\r\n Contains = 6,\r\n StartsWith = 7,\r\n EndsWith = 8,\r\n In = 9,\r\n IsNull = 10,\r\n IsNotNull = 11,\r\n}\r\n\r\nexport enum FilterLogic {\r\n And = 0,\r\n Or = 1,\r\n}\r\n\r\nexport interface SortDescriptor {\r\n field: string;\r\n direction: SortDirection;\r\n}\r\n\r\nexport interface FilterCondition {\r\n field: string;\r\n operator: FilterOperator;\r\n value?: unknown;\r\n}\r\n\r\nexport interface FilterGroup {\r\n logic: FilterLogic;\r\n conditions?: FilterCondition[];\r\n groups?: FilterGroup[];\r\n}\r\n\r\nexport const DEFAULT_PAGE_SIZE = 20;\r\nexport const MAX_PAGE_SIZE = 100;\r\n\r\nexport interface PageRequest {\r\n pageNumber: number;\r\n pageSize: number;\r\n}\r\n\r\nexport interface PagedResult<T> {\r\n items: T[];\r\n pageNumber: number;\r\n pageSize: number;\r\n totalCount: number;\r\n totalPages: number;\r\n}\r\n\r\n/** Backend'e giden POST body — `PagedResult`'un istek tarafındaki karşılığı. */\r\nexport interface PagedRequest {\r\n page: PageRequest;\r\n filter?: FilterGroup;\r\n sort?: SortDescriptor[];\r\n}\r\n\r\n/**\r\n * `PagedRequest`'i backend'e giden JSON'un HER ZAMAN aynı şekilde serileştiği\r\n * bir forma indirger. Neden önemli: birçok backend (ör. bu kütüphanenin\r\n * geliştirildiği projedeki caching davranışı) sorgu cache anahtarını\r\n * `JsonSerializer.Serialize(request)` ÜZERİNDEN kuruyor — yani anlamca özdeş\r\n * ama söz dizimsel farklı iki payload (`sort: []` ile `sort` hiç yok; `filter`\r\n * içi boş `conditions: []` ile `filter` hiç yok; property sırası) SUNUCUDA\r\n * AYRI cache girdisi üretir ve invalidation'ın getirisini boşa çıkarır. Bu\r\n * fonksiyon üç şeyi garanti eder: (1) boş `sort`/`filter` her zaman\r\n * `undefined`, dizi değil, (2) `FilterGroup` içindeki boş `conditions`/`groups`\r\n * de `undefined`'a iner (özyinelemeli), (3) tüm nesneler SABİT anahtar\r\n * sırasıyla yeniden kurulur (JS'te string anahtarlı nesnelerde ekleme sırası\r\n * korunur, `JSON.stringify` bunu birebir yansıtır).\r\n */\r\nexport function canonicalPagedRequest(request: {\r\n page: PageRequest;\r\n filter?: FilterGroup;\r\n sort?: SortDescriptor[];\r\n}): PagedRequest {\r\n return {\r\n page: { pageNumber: request.page.pageNumber, pageSize: request.page.pageSize },\r\n filter: canonicalFilterGroup(request.filter),\r\n sort: request.sort?.length\r\n ? request.sort.map((s) => ({ field: s.field, direction: s.direction }))\r\n : undefined,\r\n };\r\n}\r\n\r\nfunction canonicalFilterGroup(group: FilterGroup | undefined): FilterGroup | undefined {\r\n if (!group) return undefined;\r\n\r\n const conditions = group.conditions?.length\r\n ? group.conditions.map((c) => ({ field: c.field, operator: c.operator, value: c.value }))\r\n : undefined;\r\n const groups = group.groups?.map(canonicalFilterGroup).filter((g): g is FilterGroup => !!g);\r\n\r\n if (!conditions && (!groups || groups.length === 0)) return undefined;\r\n\r\n const result: FilterGroup = { logic: group.logic };\r\n if (conditions) result.conditions = conditions;\r\n if (groups?.length) result.groups = groups;\r\n return result;\r\n}\r\n","import {\r\n FilterLogic,\r\n FilterOperator,\r\n SortDirection,\r\n type FilterCondition,\r\n type FilterGroup,\r\n type SortDescriptor,\r\n} from './query-contract.model';\r\n\r\n/**\r\n * `Table`'ın `[clientSide]=\"true\"` modunun sorgu motoru — \"backend'in\r\n * `FilterGroup`/`SortDescriptor` modelini elimde tutuyorum, gerçek sunucu\r\n * yerine bir diziye uyguluyorum\" işini yapıyor; tüketicinin backend'iyle AYNI\r\n * operatör sözleşmesini konuşacak şekilde tasarlandı — bu yüzden burada\r\n * `'between'` gibi UI'a özel sentetik bir operatör YOK: `table-filter.model.ts`'teki\r\n * `buildFilterGroup` çağrıldığı an tarih aralığını zaten gerçek\r\n * `GreaterOrEqual`/`LessOrEqual` çiftine çevirmiş oluyor.\r\n */\r\n\r\nfunction matchesCondition<T>(row: T, condition: FilterCondition): boolean {\r\n const value = (row as unknown as Record<string, unknown>)[condition.field];\r\n const target = condition.value;\r\n\r\n if (condition.operator === FilterOperator.IsNull)\r\n return value === null || value === undefined || value === '';\r\n if (condition.operator === FilterOperator.IsNotNull)\r\n return !(value === null || value === undefined || value === '');\r\n if (condition.operator === FilterOperator.In)\r\n return Array.isArray(target) && target.includes(value);\r\n\r\n // Backend string karşılaştırmalarını Postgres ILIKE (büyük/küçük harf\r\n // duyarsız) ile yapıyor — istemci tarafı aynı davranışı\r\n // `toLocaleLowerCase('tr')` ile taklit ediyor.\r\n if (typeof value === 'string' || typeof target === 'string') {\r\n const v = String(value ?? '').toLocaleLowerCase('tr');\r\n const t = String(target ?? '').toLocaleLowerCase('tr');\r\n switch (condition.operator) {\r\n case FilterOperator.Equal:\r\n return v === t;\r\n case FilterOperator.NotEqual:\r\n return v !== t;\r\n case FilterOperator.Contains:\r\n return v.includes(t);\r\n case FilterOperator.StartsWith:\r\n return v.startsWith(t);\r\n case FilterOperator.EndsWith:\r\n return v.endsWith(t);\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n switch (condition.operator) {\r\n case FilterOperator.Equal:\r\n return value === target;\r\n case FilterOperator.NotEqual:\r\n return value !== target;\r\n case FilterOperator.GreaterThan:\r\n return (value as never) > (target as never);\r\n case FilterOperator.GreaterOrEqual:\r\n return (value as never) >= (target as never);\r\n case FilterOperator.LessThan:\r\n return (value as never) < (target as never);\r\n case FilterOperator.LessOrEqual:\r\n return (value as never) <= (target as never);\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\nexport function matchesFilterGroup<T>(row: T, group: FilterGroup | undefined): boolean {\r\n if (!group) return true;\r\n const results = [\r\n ...(group.conditions ?? []).map((c) => matchesCondition(row, c)),\r\n ...(group.groups ?? []).map((g) => matchesFilterGroup(row, g)),\r\n ];\r\n if (results.length === 0) return true;\r\n return group.logic === FilterLogic.Or ? results.some(Boolean) : results.every(Boolean);\r\n}\r\n\r\n/** Backend `SortExpressionBuilder` gibi ilk alan `OrderBy`, gerisi `ThenBy` — çoklu sıralamayı basamak basamak uygular. */\r\nexport function sortRows<T>(rows: readonly T[], sort: readonly SortDescriptor[] | undefined): T[] {\r\n if (!sort?.length) return [...rows];\r\n return [...rows].sort((a, b) => {\r\n for (const { field, direction } of sort) {\r\n const av = (a as unknown as Record<string, unknown>)[field];\r\n const bv = (b as unknown as Record<string, unknown>)[field];\r\n if (av === bv) continue;\r\n const cmp = av! > bv! ? 1 : -1;\r\n return direction === SortDirection.Descending ? -cmp : cmp;\r\n }\r\n return 0;\r\n });\r\n}\r\n","import { Directive, ElementRef, inject, input, output } from '@angular/core';\r\n\r\nconst KEY_STEP = 16;\r\nconst KEY_STEP_LARGE = 64;\r\n\r\n/**\r\n * `<span mfTableResizeHandle [label]=\"...\" (widthChange)=\"...\" />` — başlık hücresinin sağ kenarındaki\r\n * sürükleme tutamacı. WAI-ARIA \"window splitter\" deseni: `role=\"separator\"` + odaklanabilir +\r\n * `aria-valuenow`; klavyede ←/→ 16px (Shift ile 64px), çift tık / Enter \"içeriğe sığdır\".\r\n *\r\n * Başlangıç genişliği HER hareketin başında ebeveyn `<th>`'nin GERÇEK ölçüsünden okunur —\r\n * tutamaç tablonun genişlik durumunu bilmek zorunda değil. Pointer capture sayesinde imleç\r\n * hücreden çıksa da sürükleme sürer. RTL'de yatay yön ters çevrilir.\r\n */\r\n@Directive({\r\n selector: '[mfTableResizeHandle]',\r\n host: {\r\n role: 'separator',\r\n 'aria-orientation': 'vertical',\r\n tabindex: '0',\r\n '[attr.aria-label]': 'label()',\r\n '[attr.aria-valuenow]': 'width() ?? null',\r\n '[attr.aria-valuemin]': 'min()',\r\n '[attr.aria-valuemax]': 'max()',\r\n class:\r\n 'absolute inset-y-0 end-0 z-[3] w-2 cursor-col-resize touch-none select-none outline-none before:absolute before:inset-y-1.5 before:end-0 before:w-0.5 before:rounded-full before:bg-transparent before:transition-colors before:duration-fast hover:before:bg-border-strong focus-visible:before:bg-focus-ring active:before:bg-accent-fill',\r\n '(pointerdown)': 'onPointerDown($event)',\r\n '(pointermove)': 'onPointerMove($event)',\r\n '(pointerup)': 'onPointerUp($event)',\r\n '(pointercancel)': 'onPointerUp($event)',\r\n '(keydown)': 'onKeydown($event)',\r\n '(dblclick)': 'autofit.emit()',\r\n '(click)': '$event.stopPropagation()',\r\n },\r\n})\r\nexport class TableResizeHandle {\r\n readonly label = input.required<string>();\r\n readonly width = input<number>();\r\n readonly min = input(80);\r\n /** ARIA üst sınırı — separator varsayılanı 100 olduğundan px değerleri için açıkça verilir. */\r\n readonly max = input(2000);\r\n\r\n /** İlk hareketten ÖNCE — tablo diğer kolonların genişliğini dondurur (bkz. `Table.freezeWidths`). */\r\n readonly resizeStart = output<void>();\r\n readonly widthChange = output<number>();\r\n readonly autofit = output<void>();\r\n\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private drag: { pointerId: number; startX: number; startWidth: number } | null = null;\r\n\r\n private cellWidth(): number {\r\n return this.host.nativeElement.parentElement?.getBoundingClientRect().width ?? 0;\r\n }\r\n\r\n private direction(): 1 | -1 {\r\n return getComputedStyle(this.host.nativeElement).direction === 'rtl' ? -1 : 1;\r\n }\r\n\r\n protected onPointerDown(event: PointerEvent): void {\r\n if (event.button !== 0) return;\r\n event.preventDefault();\r\n this.resizeStart.emit();\r\n this.drag = { pointerId: event.pointerId, startX: event.clientX, startWidth: this.cellWidth() };\r\n this.host.nativeElement.setPointerCapture?.(event.pointerId);\r\n }\r\n\r\n protected onPointerMove(event: PointerEvent): void {\r\n if (!this.drag || event.pointerId !== this.drag.pointerId) return;\r\n const delta = (event.clientX - this.drag.startX) * this.direction();\r\n this.widthChange.emit(Math.max(this.min(), Math.round(this.drag.startWidth + delta)));\r\n }\r\n\r\n protected onPointerUp(event: PointerEvent): void {\r\n if (!this.drag || event.pointerId !== this.drag.pointerId) return;\r\n this.host.nativeElement.releasePointerCapture?.(event.pointerId);\r\n this.drag = null;\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Enter') {\r\n event.preventDefault();\r\n this.autofit.emit();\r\n return;\r\n }\r\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\r\n event.preventDefault();\r\n const step = (event.shiftKey ? KEY_STEP_LARGE : KEY_STEP) * this.direction();\r\n const delta = event.key === 'ArrowRight' ? step : -step;\r\n this.resizeStart.emit();\r\n const start = this.width() ?? this.cellWidth();\r\n this.widthChange.emit(Math.max(this.min(), Math.round(start + delta)));\r\n }\r\n}\r\n","import { CdkOverlayOrigin } from '@angular/cdk/overlay';\r\nimport { Component, computed, inject, input, output } from '@angular/core';\r\nimport { Checkbox } from '@mesgflow/ui-kit/checkbox';\r\nimport { MF_TABLE_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport type { TableColumn } from './table-column.model';\r\n\r\n/**\r\n * Toolbar'daki \"Kolonlar\" düğmesine bağlı basit bir görünürlük paneli.\r\n * Sunucuya HİÇBİR ŞEY göndermez — `Table` `hiddenColumns` sinyalini kendi\r\n * içinde tutar (bkz. table.ts), bu yalnızca o sinyali değiştiren bir UI.\r\n * `primary` işaretli kolon listede hiç görünmez — kimlik kolonu kapatılamaz.\r\n * Panel iskeleti `Popover`'a devredildi (bkz. plan Faz 1c).\r\n */\r\n@Component({\r\n selector: 'mf-table-columns-menu',\r\n imports: [Checkbox, Popover],\r\n host: { class: 'contents' },\r\n templateUrl: './table-columns-menu.html',\r\n})\r\nexport class TableColumnsMenu<T> {\r\n readonly columns = input.required<TableColumn<T>[]>();\r\n readonly hidden = input.required<ReadonlySet<string>>();\r\n readonly origin = input.required<CdkOverlayOrigin>();\r\n readonly open = input.required<boolean>();\r\n readonly label = input<string>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabel = computed(() => this.label() ?? this.tableLabels().columns);\r\n\r\n readonly hiddenChange = output<ReadonlySet<string>>();\r\n readonly closed = output<void>();\r\n\r\n protected readonly toggleable = computed(() =>\r\n this.columns().filter((c) => !c.primary && c.hideable !== false),\r\n );\r\n\r\n protected isHidden(field: string): boolean {\r\n return this.hidden().has(field);\r\n }\r\n\r\n protected toggle(field: string): void {\r\n const next = new Set(this.hidden());\r\n if (next.has(field)) next.delete(field);\r\n else next.add(field);\r\n this.hiddenChange.emit(next);\r\n }\r\n\r\n protected close(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-end\"\r\n padding=\"md\"\r\n panelClass=\"w-56\"\r\n (closed)=\"close()\"\r\n>\r\n <p class=\"mb-1 px-1.5 py-1 text-eyebrow text-fg-subtle\">{{ effectiveLabel() }}</p>\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (column of toggleable(); track column.field) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"!isHidden(column.field)\"\r\n (change)=\"toggle(column.field)\"\r\n />\r\n <span class=\"truncate\">{{ column.header }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n</mf-popover>\r\n","import type { MfTableFilterLabels } from '@mesgflow/ui-kit/core';\r\nimport { FilterOperator } from './query-contract.model';\r\nimport type { TableFilterOperator } from './table-filter.model';\r\n\r\n/**\r\n * Filtre çubuğu + komut menüsünün metinlerinin şekli — `MfTableFilterLabels`\r\n * (bkz. `@mesgflow/ui-kit/core`'un `core/i18n/labels.ts`'i, `MF_TABLE_LABELS`\r\n * umbrella token'ının `filter` alt-alanı) bu dosyanın eski yerel\r\n * `TableFilterLabels`/`DEFAULT_TABLE_FILTER_LABELS`'ının yerini aldı —\r\n * `operatorLabel()` yardımcısı (aşağıda) TABLE'A ÖZGÜ kaldığı için burada\r\n * yaşamaya devam ediyor, sadece TİPİ artık core'dan geliyor.\r\n */\r\nexport type TableFilterLabels = MfTableFilterLabels;\r\n\r\nconst OPERATOR_KEY: Partial<Record<FilterOperator, keyof TableFilterLabels['operators']>> = {\r\n [FilterOperator.Equal]: 'equal',\r\n [FilterOperator.NotEqual]: 'notEqual',\r\n [FilterOperator.GreaterThan]: 'greaterThan',\r\n [FilterOperator.GreaterOrEqual]: 'greaterOrEqual',\r\n [FilterOperator.LessThan]: 'lessThan',\r\n [FilterOperator.LessOrEqual]: 'lessOrEqual',\r\n [FilterOperator.Contains]: 'contains',\r\n [FilterOperator.StartsWith]: 'startsWith',\r\n [FilterOperator.EndsWith]: 'endsWith',\r\n [FilterOperator.In]: 'in',\r\n [FilterOperator.IsNull]: 'isNull',\r\n [FilterOperator.IsNotNull]: 'isNotNull',\r\n};\r\n\r\nexport function operatorLabel(labels: TableFilterLabels, operator: TableFilterOperator): string {\r\n if (operator === 'between') return labels.operators.between;\r\n const key = OPERATOR_KEY[operator];\r\n return key ? labels.operators[key] : String(operator);\r\n}\r\n","import { startOfDay } from 'date-fns';\r\nimport {\r\n FilterLogic,\r\n FilterOperator,\r\n type FilterCondition,\r\n type FilterGroup,\r\n} from './query-contract.model';\r\nimport type { TableColumnFilterType } from './table-column.model';\r\n\r\n/**\r\n * UI seviyesinde bir operatör. `'between'` backend'de KARŞILIĞI OLMAYAN\r\n * sentetik bir değer: `FilterOperator` enum'unda `Between` yok (backend\r\n * sözleşmesinde de yok), bu yüzden bir tarih aralığı emit edilirken\r\n * `GreaterOrEqual` + `LessOrEqual` içeren küçük bir `And` grubuna çevriliyor\r\n * (bkz. `buildFilterGroup`). Kullanıcıya tek bir chip olarak görünür.\r\n */\r\nexport type TableFilterOperator = FilterOperator | 'between';\r\n\r\nexport interface AppliedFilter {\r\n id: string;\r\n field: string;\r\n operator: TableFilterOperator;\r\n /**\r\n * - `In` → değer DİZİSİ (çoklu seçim)\r\n * - `'between'` → `[from, to]` (ikisi de ISO tarih metni, biri null olabilir)\r\n * - `IsNull`/`IsNotNull` → değer yok (`null`)\r\n * - diğer → tek değer\r\n */\r\n value: unknown;\r\n}\r\n\r\n/** Tip başına filtre menüsünde sunulacak operatörler. `In` burada YOK — çoklu seçim ayrı bir jest (checkbox listesi), operatör dropdown'ında bir satır değil. */\r\nexport const OPERATORS_BY_TYPE: Record<TableColumnFilterType, TableFilterOperator[]> = {\r\n text: [\r\n FilterOperator.Contains,\r\n FilterOperator.Equal,\r\n FilterOperator.NotEqual,\r\n FilterOperator.StartsWith,\r\n FilterOperator.EndsWith,\r\n FilterOperator.IsNull,\r\n FilterOperator.IsNotNull,\r\n ],\r\n select: [FilterOperator.Equal, FilterOperator.NotEqual],\r\n boolean: [FilterOperator.Equal],\r\n date: [\r\n 'between',\r\n FilterOperator.GreaterOrEqual,\r\n FilterOperator.LessOrEqual,\r\n FilterOperator.Equal,\r\n ],\r\n};\r\n\r\nexport function defaultOperatorFor(type: TableColumnFilterType): TableFilterOperator {\r\n return OPERATORS_BY_TYPE[type][0]!;\r\n}\r\n\r\n/** `IsNull`/`IsNotNull` değer almaz — seçilir seçilmez uygulanır, değer kutusu gösterilmez. */\r\nexport function operatorNeedsValue(operator: TableFilterOperator): boolean {\r\n return operator !== FilterOperator.IsNull && operator !== FilterOperator.IsNotNull;\r\n}\r\n\r\n/**\r\n * Chip metninde operatör YAZILMAZ eğer o tip için varsayılan operatörse.\r\n * \"Rol: Yönetici\" okunur; \"Rol eşittir Yönetici\" aynı bilgiyi taşıyıp\r\n * üç kat yer kaplar. Varsayılandan sapma ise BİLGİ taşır ve gösterilir.\r\n */\r\nexport function isDefaultOperator(\r\n operator: TableFilterOperator,\r\n type: TableColumnFilterType,\r\n): boolean {\r\n return operator === defaultOperatorFor(type);\r\n}\r\n\r\n/**\r\n * `2026-09-01T00:00:00+03:00` — YEREL gün sınırı. `toISOString()` KULLANMA:\r\n * UTC'ye kaydırır, \"bugün\" filtresi saat farkı kadar yanlış güne düşer.\r\n * `export` — `dateToIso` (aşağıda) ve testler dışında artık DatePicker/\r\n * Calendar'ın ürettiği `Date` nesnelerini backend'in ISO metnine çeviren TEK\r\n * yer burası (bkz. `table-filter-menu.ts`).\r\n */\r\nexport function localIso(date: Date, endOfDay: boolean): string {\r\n const pad = (n: number, width = 2): string => String(n).padStart(width, '0');\r\n const time = endOfDay ? '23:59:59.999' : '00:00:00.000';\r\n const offsetMinutes = -date.getTimezoneOffset();\r\n const sign = offsetMinutes >= 0 ? '+' : '-';\r\n const absolute = Math.abs(offsetMinutes);\r\n const offset = `${sign}${pad(Math.floor(absolute / 60))}:${pad(absolute % 60)}`;\r\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${time}${offset}`;\r\n}\r\n\r\n/** `Calendar`'ın seçtiği bir günü backend'in beklediği ISO metnine çevirir — `localIso`'nun `Date`-girdili biçimi. */\r\nexport function dateToIso(date: Date, endOfDay: boolean): string {\r\n return localIso(date, endOfDay);\r\n}\r\n\r\n/** ISO metnini (ya da `null`/tanımsız değeri) `Calendar`'ın çalıştığı `Date`'e çevirir — gün sınırına (`startOfDay`) normalize edilir, saat bileşeni Calendar'ı ilgilendirmiyor. */\r\nexport function isoToDate(value: unknown): Date | null {\r\n if (typeof value !== 'string' || !value) return null;\r\n const date = new Date(value);\r\n return Number.isNaN(date.getTime()) ? null : startOfDay(date);\r\n}\r\n\r\nfunction toNode(filter: AppliedFilter): FilterCondition | FilterGroup {\r\n if (filter.operator === 'between') {\r\n const [from, to] = (filter.value as [string | null, string | null] | undefined) ?? [null, null];\r\n const conditions: FilterCondition[] = [];\r\n if (from)\r\n conditions.push({\r\n field: filter.field,\r\n operator: FilterOperator.GreaterOrEqual,\r\n value: from,\r\n });\r\n if (to)\r\n conditions.push({ field: filter.field, operator: FilterOperator.LessOrEqual, value: to });\r\n return { logic: FilterLogic.And, conditions };\r\n }\r\n\r\n if (!operatorNeedsValue(filter.operator)) {\r\n return { field: filter.field, operator: filter.operator };\r\n }\r\n\r\n // Çoklu seçim: TEK değer kaldıysa `In` yerine `Equal` gönderiyoruz — backend\r\n // ikisini de destekliyor ama `Equal` hem sorgu planı hem okunabilirlik için\r\n // daha dürüst.\r\n if (Array.isArray(filter.value)) {\r\n return filter.value.length === 1\r\n ? { field: filter.field, operator: FilterOperator.Equal, value: filter.value[0] }\r\n : { field: filter.field, operator: FilterOperator.In, value: filter.value };\r\n }\r\n\r\n return { field: filter.field, operator: filter.operator, value: filter.value };\r\n}\r\n\r\nfunction isGroup(node: FilterCondition | FilterGroup): node is FilterGroup {\r\n return 'logic' in node;\r\n}\r\n\r\n/**\r\n * Chip listesini backend'in `FilterGroup` ağacına çevirir. Tarih aralığı\r\n * chip'i kendi iç `And` grubunu getirdiği için ağaç derinliği en fazla\r\n * 3 olur — tipik backend sınırları (`MaxDepth = 5`, `MaxNodesPerGroup = 25`)\r\n * içinde rahat rahat kalıyoruz.\r\n */\r\nexport function buildFilterGroup(\r\n filters: readonly AppliedFilter[],\r\n logic: FilterLogic,\r\n): FilterGroup | undefined {\r\n if (filters.length === 0) return undefined;\r\n\r\n const nodes = filters.map(toNode);\r\n const conditions = nodes.filter((node): node is FilterCondition => !isGroup(node));\r\n const groups = nodes.filter(isGroup).filter((group) => (group.conditions?.length ?? 0) > 0);\r\n\r\n if (conditions.length === 0 && groups.length === 0) return undefined;\r\n // Tek bir alt grup varsa gereksiz sarmalayıcı üretme — payload'ı kanonik\r\n // tutuyoruz (backend cache anahtarı ham JSON string'i, bkz. query.model.ts).\r\n if (conditions.length === 0 && groups.length === 1) return groups[0];\r\n\r\n const result: FilterGroup = { logic };\r\n if (conditions.length) result.conditions = conditions;\r\n if (groups.length) result.groups = groups;\r\n return result;\r\n}\r\n","import { CdkOverlayOrigin } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { startOfMonth } from 'date-fns';\r\nimport { FilterOperator } from './query-contract.model';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Checkbox } from '@mesgflow/ui-kit/checkbox';\r\nimport { cn, MF_TABLE_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Input } from '@mesgflow/ui-kit/input';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\nimport { Select, type SelectOption } from '@mesgflow/ui-kit/select';\r\nimport { Calendar } from '@mesgflow/ui-kit/date-picker';\r\nimport { dateRangeForPreset, type DateRangePresetId } from '@mesgflow/ui-kit/date-picker';\r\nimport { operatorLabel as operatorLabelFor, type TableFilterLabels } from './table-filter-labels';\r\nimport {\r\n OPERATORS_BY_TYPE,\r\n dateToIso,\r\n defaultOperatorFor,\r\n isoToDate,\r\n operatorNeedsValue,\r\n type AppliedFilter,\r\n type TableFilterOperator,\r\n} from './table-filter.model';\r\nimport type { TableColumn, TableColumnFilterType } from './table-column.model';\r\n\r\n/**\r\n * Bir filtre kosulunun duzenleyicisi — IKI modda calisir, TEK bilesen:\r\n *\r\n * - **Ekleme** (`initial` = `null`): iki adim. Once alan arama listesi, alan\r\n * secilince ayni overlay icinde deger adimina gecer.\r\n * - **Duzenleme** (`initial` doldurulmus, bkz. `TableFilterBar` — her chip\r\n * kendi overlay'ini bu bilesenle acar): dogrudan deger adimiyla baslar,\r\n * alan sabit kalir (bir filtrenin ALANINI degistirmek olagan disi bir jest\r\n * — kullanici bunun yerine chip'i kaldirip yenisini ekler).\r\n *\r\n * Onay butonu YOK felsefesi tipe gore farkli uygulanir: `select`/`boolean`\r\n * checkbox'i her tik ANINDA `apply` emit eder ve overlay ACIK kalir (coklu\r\n * secim dogal akisi — kullanici birden cok kutuyu art arda isaretler).\r\n * `text`/`date` bir \"taahhut\" ani gerektirir (Enter / preset tik / Uygula) —\r\n * o anda hem `apply` HEM `closed` emit edilir.\r\n */\r\n@Component({\r\n selector: 'mf-table-filter-menu',\r\n imports: [Button, Icon, Checkbox, Input, Popover, Select, Calendar],\r\n host: { class: 'contents' },\r\n templateUrl: './table-filter-menu.html',\r\n})\r\nexport class TableFilterMenu<T> {\r\n readonly columns = input.required<TableColumn<T>[]>();\r\n readonly origin = input.required<CdkOverlayOrigin>();\r\n readonly open = input.required<boolean>();\r\n /** Doluysa duzenleme modu (alan sabit, adim='value'); `null` ise ekleme modu (adim='field'). */\r\n readonly initial = input<AppliedFilter | null>(null);\r\n readonly labels = input<TableFilterLabels>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(() => this.labels() ?? this.tableLabels().filter);\r\n\r\n /** Her zaman TAM bir `AppliedFilter` — ekleme modunda taze `id`, duzenlemede `initial.id` korunur. Ust bilesen (`TableFilterBar`) id'ye gore upsert yapar. */\r\n readonly apply = output<AppliedFilter>();\r\n /** Kaldirilan filtrenin id'si — checkbox listesi sifir secime inince (ekleme YA DA duzenleme modunda) emit edilir, ust bilesen o id'yi chip listesinden cikarir. */\r\n readonly remove = output<string>();\r\n readonly closed = output<void>();\r\n\r\n protected readonly step = signal<'field' | 'value'>('field');\r\n protected readonly fieldQuery = signal('');\r\n protected readonly fieldHighlighted = signal(0);\r\n protected readonly selectedField = signal<string | null>(null);\r\n protected readonly operator = signal<TableFilterOperator>(FilterOperator.Equal);\r\n /** `select`/`boolean` icin HER ZAMAN dizi (uzunluk 0/1/N) — tekil/coklu ayrimi yalnizca `toggleSelection`'da, emit aninda yapilir. */\r\n protected readonly selection = signal<unknown[]>([]);\r\n protected readonly textValue = signal('');\r\n protected readonly customDateOpen = signal(false);\r\n protected readonly dateFrom = signal<Date | null>(null);\r\n protected readonly dateTo = signal<Date | null>(null);\r\n /** `'start'` bir sonraki takvim tıklaması `dateFrom`'u YENİDEN başlatır (yeni oturum); `'end'` ikinci ucu belirler. */\r\n protected readonly datePickStage = signal<'start' | 'end'>('start');\r\n /** Fare ikinci ucun üzerinde gezinirken önizleme — bkz. `calendar.ts` `hoverEnd`. */\r\n protected readonly dateHoverEnd = signal<Date | null>(null);\r\n protected readonly calendarMonth = signal(startOfMonth(new Date()));\r\n /**\r\n * Ekleme modunda `initial()` HER ZAMAN `null` kalir — bu yuzden ayni \"ekleme\r\n * oturumu\" icinde art arda checkbox tiklamalari (bkz. `toggleSelection`)\r\n * kendi baslarina birden fazla YENI filtre olustururdu, ayni chip'i\r\n * GUNCELLEMEK yerine (gercek bulgu: \"Yonetici\" + \"Editor\" iki AYRI chip\r\n * olarak beliriyordu). Bu sinyal, bu oturumda uretilen ilk id'yi hatirlayip\r\n * sonraki her `emitApply`'de AYNI id'yi kullanmayi saglar — `reset()`\r\n * (yeni oturum) ve `selectField()` (farkli bir alana gecis) sifirlar.\r\n */\r\n private readonly draftId = signal<string | null>(null);\r\n\r\n private readonly fieldSearchEl = viewChild<ElementRef<HTMLInputElement>>('fieldSearchEl');\r\n\r\n protected readonly filterableColumns = computed(() => this.columns().filter((c) => !!c.filter));\r\n protected readonly filteredColumns = computed(() => {\r\n const q = this.fieldQuery().trim().toLocaleLowerCase('tr');\r\n const all = this.filterableColumns();\r\n if (!q) return all;\r\n return all.filter((c) => c.header.toLocaleLowerCase('tr').includes(q));\r\n });\r\n\r\n constructor() {\r\n // Overlay her acilista taze baslar — duzenleme modunda `initial`'dan,\r\n // ekleme modunda bostan. `open()` bir kez true'ya donduginde okunur;\r\n // sonraki her checkbox/metin degisikligi ARTIK kendi sinyallerinde yasar\r\n // (bu effect'in tekrar tetiklenip taslagi sifirlamamasi icin `open()`\r\n // DISINDA hicbir seye bagimli degil — `untracked` ile korunuyor).\r\n effect(() => {\r\n if (!this.open()) return;\r\n untracked(() => this.reset());\r\n });\r\n }\r\n\r\n private reset(): void {\r\n const init = this.initial();\r\n this.fieldQuery.set('');\r\n this.fieldHighlighted.set(0);\r\n this.customDateOpen.set(false);\r\n this.dateFrom.set(null);\r\n this.dateTo.set(null);\r\n this.datePickStage.set('start');\r\n this.dateHoverEnd.set(null);\r\n this.calendarMonth.set(startOfMonth(new Date()));\r\n\r\n if (!init) {\r\n this.step.set('field');\r\n this.selectedField.set(null);\r\n this.selection.set([]);\r\n this.textValue.set('');\r\n this.draftId.set(null);\r\n queueMicrotask(() => this.fieldSearchEl()?.nativeElement.focus());\r\n return;\r\n }\r\n\r\n this.step.set('value');\r\n this.selectedField.set(init.field);\r\n this.operator.set(init.operator);\r\n const type = this.filterTypeFor(init.field);\r\n if (type === 'select' || type === 'boolean') {\r\n this.selection.set(\r\n Array.isArray(init.value)\r\n ? init.value\r\n : init.value === null || init.value === undefined\r\n ? []\r\n : [init.value],\r\n );\r\n } else if (type === 'date' && init.operator === 'between') {\r\n const [from, to] = (init.value as [string | null, string | null] | undefined) ?? [null, null];\r\n const fromDate = isoToDate(from);\r\n const toDate = isoToDate(to);\r\n this.dateFrom.set(fromDate);\r\n this.dateTo.set(toDate);\r\n this.datePickStage.set(fromDate && !toDate ? 'end' : 'start');\r\n this.calendarMonth.set(startOfMonth(fromDate ?? new Date()));\r\n this.customDateOpen.set(true);\r\n } else {\r\n this.textValue.set(typeof init.value === 'string' ? init.value : '');\r\n }\r\n }\r\n\r\n private columnFor(field: string): TableColumn<T> | undefined {\r\n return this.columns().find((c) => c.field === field);\r\n }\r\n\r\n protected filterTypeFor(field: string): TableColumnFilterType {\r\n return this.columnFor(field)?.filter?.type ?? 'text';\r\n }\r\n\r\n protected fieldHeader(field: string): string {\r\n return this.columnFor(field)?.header ?? field;\r\n }\r\n\r\n /** `cn()` (twMerge) — base `bg-transparent` ve vurgulu `bg-surface-alt` AYNI class dizesinde çakışırsa (düz string birleştirmede olduğu gibi) hangisinin kazanacağı Tailwind'in derleme sırasına kalır; twMerge çakışan `bg-*` çiftini güvenle çözer. */\r\n protected fieldOptionClasses(index: number): string {\r\n return cn(\r\n 'flex w-full cursor-pointer appearance-none items-center justify-between gap-2 border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis',\r\n index === this.fieldHighlighted() && 'bg-surface-alt',\r\n );\r\n }\r\n\r\n protected operatorOptions(): SelectOption<TableFilterOperator>[] {\r\n const field = this.selectedField();\r\n if (!field) return [];\r\n const column = this.columnFor(field);\r\n const type = this.filterTypeFor(field);\r\n const operators = column?.filter?.operators ?? OPERATORS_BY_TYPE[type];\r\n return operators\r\n .filter((op) => op !== 'between')\r\n .map((op) => ({ label: operatorLabelFor(this.effectiveLabels(), op), value: op }));\r\n }\r\n\r\n protected selectOptions(): SelectOption<unknown>[] {\r\n const field = this.selectedField();\r\n if (!field) return [];\r\n return (this.columnFor(field)?.filter?.options ?? []).map((o) => ({\r\n label: o.label,\r\n value: o.value,\r\n }));\r\n }\r\n\r\n protected isSelected(value: unknown): boolean {\r\n return this.selection().includes(value);\r\n }\r\n\r\n /** Template'te magic-number karsilastirmasi (`operator() !== 10`) yerine — `IsNull`/`IsNotNull` deger kutusu gostermez. */\r\n protected currentOperatorNeedsValue(): boolean {\r\n return operatorNeedsValue(this.operator());\r\n }\r\n\r\n protected onFieldQueryKeydown(event: KeyboardEvent): void {\r\n const items = this.filteredColumns();\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.fieldHighlighted.update((i) => Math.min(items.length - 1, i + 1));\r\n } else if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n this.fieldHighlighted.update((i) => Math.max(0, i - 1));\r\n } else if (event.key === 'Enter') {\r\n event.preventDefault();\r\n const item = items[this.fieldHighlighted()];\r\n if (item) this.selectField(item.field);\r\n } else if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.closed.emit();\r\n }\r\n }\r\n\r\n protected selectField(field: string): void {\r\n this.selectedField.set(field);\r\n const type = this.filterTypeFor(field);\r\n this.operator.set(defaultOperatorFor(type));\r\n this.selection.set([]);\r\n this.textValue.set('');\r\n // Farkli bir alana gecis = yeni bir filtre taslagi — onceki alanda\r\n // uretilmis olabilecek id'yi TASIMA (bkz. draftId yorumu).\r\n this.draftId.set(null);\r\n this.step.set('value');\r\n }\r\n\r\n protected backToField(): void {\r\n this.step.set('field');\r\n this.fieldQuery.set('');\r\n this.fieldHighlighted.set(0);\r\n queueMicrotask(() => this.fieldSearchEl()?.nativeElement.focus());\r\n }\r\n\r\n /** `select`/`boolean` — her tik aninda uygular, overlay ACIK kalir (bkz. sinif yorumu). */\r\n protected toggleSelection(value: unknown): void {\r\n const field = this.selectedField();\r\n if (!field) return;\r\n const current = this.selection();\r\n const next = current.includes(value) ? current.filter((v) => v !== value) : [...current, value];\r\n this.selection.set(next);\r\n\r\n if (next.length === 0) {\r\n const id = this.initial()?.id ?? this.draftId();\r\n if (id) this.remove.emit(id);\r\n this.draftId.set(null);\r\n return;\r\n }\r\n const operator = next.length === 1 ? FilterOperator.Equal : FilterOperator.In;\r\n const value2 = next.length === 1 ? next[0] : next;\r\n this.emitApply(field, operator, value2, false);\r\n }\r\n\r\n protected onOperatorChange(operator: TableFilterOperator | null): void {\r\n if (operator === null) return;\r\n this.operator.set(operator);\r\n if (!operatorNeedsValue(operator)) this.commitText();\r\n }\r\n\r\n protected onTextInput(raw: string): void {\r\n this.textValue.set(raw);\r\n }\r\n\r\n protected commitText(): void {\r\n const field = this.selectedField();\r\n if (!field) return;\r\n const operator = this.operator();\r\n if (operatorNeedsValue(operator) && !this.textValue().trim()) return;\r\n this.emitApply(\r\n field,\r\n operator,\r\n operatorNeedsValue(operator) ? this.textValue().trim() : undefined,\r\n true,\r\n );\r\n }\r\n\r\n protected applyPreset(preset: DateRangePresetId): void {\r\n const field = this.selectedField();\r\n if (!field) return;\r\n const range = dateRangeForPreset(preset);\r\n this.emitApply(\r\n field,\r\n 'between',\r\n [dateToIso(range.start!, false), dateToIso(range.end!, true)],\r\n true,\r\n );\r\n }\r\n\r\n protected openCustomRange(): void {\r\n this.customDateOpen.set(true);\r\n }\r\n\r\n /** İki tıklamalı aralık seçimi — emsal: `date-range-picker.ts` `onDayPick` (aynı mantık, burada tek gömülü takvim). */\r\n protected onCalendarDayPick(day: Date): void {\r\n if (this.datePickStage() === 'start' || (this.dateFrom() && this.dateTo())) {\r\n this.dateFrom.set(day);\r\n this.dateTo.set(null);\r\n this.datePickStage.set('end');\r\n this.dateHoverEnd.set(null);\r\n return;\r\n }\r\n\r\n const start = this.dateFrom()!;\r\n if (day < start) {\r\n this.dateFrom.set(day);\r\n this.dateTo.set(start);\r\n } else {\r\n this.dateTo.set(day);\r\n }\r\n this.datePickStage.set('start');\r\n this.dateHoverEnd.set(null);\r\n }\r\n\r\n protected onCalendarDayHover(day: Date | null): void {\r\n this.dateHoverEnd.set(day);\r\n }\r\n\r\n protected commitCustomRange(): void {\r\n const field = this.selectedField();\r\n if (!field) return;\r\n const from = this.dateFrom();\r\n const to = this.dateTo();\r\n if (!from && !to) return;\r\n this.emitApply(\r\n field,\r\n 'between',\r\n [from ? dateToIso(from, false) : null, to ? dateToIso(to, true) : null],\r\n true,\r\n );\r\n }\r\n\r\n private emitApply(\r\n field: string,\r\n operator: TableFilterOperator,\r\n value: unknown,\r\n closeAfter: boolean,\r\n ): void {\r\n const id = this.initial()?.id ?? this.draftId() ?? crypto.randomUUID();\r\n if (!this.initial() && !this.draftId()) this.draftId.set(id);\r\n this.apply.emit({ id, field, operator, value });\r\n if (closeAfter) this.closed.emit();\r\n }\r\n\r\n protected close(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom-start\"\r\n padding=\"md\"\r\n panelClass=\"w-72\"\r\n (closed)=\"close()\"\r\n>\r\n @if (step() === 'field') {\r\n <div class=\"relative mb-1.5\">\r\n <span\r\n mfIcon\r\n [size]=\"16\"\r\n class=\"pointer-events-none absolute top-1/2 start-2 -translate-y-1/2 text-fg-subtle\"\r\n >search</span\r\n >\r\n <input\r\n mfInput\r\n #fieldSearchEl\r\n type=\"text\"\r\n class=\"ps-7 text-sm\"\r\n [placeholder]=\"effectiveLabels().searchField\"\r\n [value]=\"fieldQuery()\"\r\n (input)=\"fieldQuery.set($any($event.target).value)\"\r\n (keydown)=\"onFieldQueryKeydown($event)\"\r\n />\r\n </div>\r\n @if (filteredColumns().length === 0) {\r\n <p class=\"px-1.5 py-2 text-sm text-fg-subtle\">{{ effectiveLabels().noField }}</p>\r\n } @else {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (column of filteredColumns(); track column.field; let i = $index) {\r\n <li>\r\n <button\r\n type=\"button\"\r\n [class]=\"fieldOptionClasses(i)\"\r\n (mouseenter)=\"fieldHighlighted.set(i)\"\r\n (click)=\"selectField(column.field)\"\r\n >\r\n {{ column.header }}\r\n </button>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n } @else {\r\n <div class=\"mb-1.5 flex items-center gap-1 px-0.5\">\r\n @if (!initial()) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().back\"\r\n (click)=\"backToField()\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">arrow_back</span>\r\n </button>\r\n }\r\n <span class=\"text-sm font-medium text-fg\">{{ fieldHeader(selectedField() ?? '') }}</span>\r\n </div>\r\n\r\n @switch (filterTypeFor(selectedField() ?? '')) {\r\n @case ('select') {\r\n <ul class=\"flex max-h-64 list-none flex-col gap-0.5 overflow-auto\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('boolean') {\r\n <ul class=\"flex list-none flex-col gap-0.5\">\r\n @for (option of selectOptions(); track option.label) {\r\n <li>\r\n <label\r\n class=\"flex cursor-pointer items-center gap-2 rounded-sm px-2.5 py-1.5 text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isSelected(option.value)\"\r\n (change)=\"toggleSelection(option.value)\"\r\n />\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n </label>\r\n </li>\r\n }\r\n </ul>\r\n }\r\n @case ('date') {\r\n <div class=\"flex flex-col gap-1\">\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('today')\"\r\n >\r\n {{ effectiveLabels().dateToday }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('last7')\"\r\n >\r\n {{ effectiveLabels().dateLast7 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('last30')\"\r\n >\r\n {{ effectiveLabels().dateLast30 }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-fg-muted transition-colors duration-fast ease-emphasis hover:bg-state-hover\"\r\n (click)=\"applyPreset('thisMonth')\"\r\n >\r\n {{ effectiveLabels().dateThisMonth }}\r\n </button>\r\n @if (!customDateOpen()) {\r\n <button\r\n type=\"button\"\r\n class=\"appearance-none border-0 bg-transparent rounded-sm px-2.5 py-1.5 text-start text-sm text-accent transition-colors duration-fast ease-emphasis hover:bg-accent/5\"\r\n (click)=\"openCustomRange()\"\r\n >\r\n {{ effectiveLabels().dateCustom }}\r\n </button>\r\n } @else {\r\n <div class=\"mt-1 flex flex-col gap-2 border-t border-border pt-2\">\r\n <mf-calendar\r\n mode=\"range\"\r\n [(month)]=\"calendarMonth\"\r\n [rangeStart]=\"dateFrom()\"\r\n [rangeEnd]=\"dateTo()\"\r\n [hoverEnd]=\"dateHoverEnd()\"\r\n (dayPick)=\"onCalendarDayPick($event)\"\r\n (dayHover)=\"onCalendarDayHover($event)\"\r\n />\r\n <div class=\"flex justify-end\">\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n [disabled]=\"!dateFrom()\"\r\n (click)=\"commitCustomRange()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @default {\r\n <div class=\"flex flex-col gap-2\">\r\n <mf-select\r\n [options]=\"operatorOptions()\"\r\n [value]=\"operator()\"\r\n (valueChange)=\"onOperatorChange($event)\"\r\n size=\"sm\"\r\n [ariaLabel]=\"effectiveLabels().operator\"\r\n />\r\n @if (currentOperatorNeedsValue()) {\r\n <input\r\n mfInput\r\n type=\"text\"\r\n class=\"text-sm\"\r\n [attr.aria-label]=\"effectiveLabels().value\"\r\n [placeholder]=\"effectiveLabels().value\"\r\n [value]=\"textValue()\"\r\n (input)=\"onTextInput($any($event.target).value)\"\r\n (keydown.enter)=\"commitText()\"\r\n />\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"text-xs text-fg-subtle\">{{ effectiveLabels().enterHint }}</span>\r\n <button\r\n mfButton\r\n tone=\"primary\"\r\n appearance=\"filled\"\r\n size=\"sm\"\r\n type=\"button\"\r\n (click)=\"commitText()\"\r\n >\r\n {{ effectiveLabels().apply }}\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n</mf-popover>\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { FilterLogic } from './query-contract.model';\r\nimport { Chip } from '@mesgflow/ui-kit/chip';\r\nimport { MF_TABLE_LABELS } from '@mesgflow/ui-kit/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Select, type SelectOption } from '@mesgflow/ui-kit/select';\r\nimport { TableFilterMenu } from './table-filter-menu';\r\nimport { operatorLabel, type TableFilterLabels } from './table-filter-labels';\r\nimport { isDefaultOperator, type AppliedFilter } from './table-filter.model';\r\nimport type { TableColumn, TableColumnFilterType } from './table-column.model';\r\n\r\n/**\r\n * Toolbar'ın ALTINDA kalıcı bir satır — uygulanmış filtreler artık ikonun\r\n * köşesindeki bir sayı rozetinde değil, doğrudan burada, birer chip olarak\r\n * görünür (bkz. plan — kullanıcının onayladığı Linear/Attio dili). Chip'e\r\n * tıklamak değerini düzenler, `×` anında kaldırır. `TableFilterMenu` HEM\r\n * \"+ Filtre\" tetikleyicisinde (ekleme, `initial=null`) HEM her chip'te\r\n * (düzenleme, `initial=filter`) aynı bileşen — bkz. o dosyanın başındaki not.\r\n */\r\n@Component({\r\n selector: 'mf-table-filter-bar',\r\n host: { class: 'block' },\r\n imports: [OverlayModule, Chip, Icon, Select, TableFilterMenu],\r\n templateUrl: './table-filter-bar.html',\r\n})\r\nexport class TableFilterBar<T> {\r\n readonly columns = input.required<TableColumn<T>[]>();\r\n readonly filters = input.required<readonly AppliedFilter[]>();\r\n readonly logic = input.required<FilterLogic>();\r\n readonly labels = input<TableFilterLabels>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(() => this.labels() ?? this.tableLabels().filter);\r\n\r\n readonly filtersChange = output<AppliedFilter[]>();\r\n readonly logicChange = output<FilterLogic>();\r\n\r\n protected readonly addOpen = signal(false);\r\n protected readonly editingId = signal<string | null>(null);\r\n\r\n protected readonly FilterLogic = FilterLogic;\r\n protected readonly filterableColumns = computed(() => this.columns().filter((c) => !!c.filter));\r\n\r\n protected readonly logicOptions = computed<SelectOption<FilterLogic>[]>(() => [\r\n { label: this.effectiveLabels().and, value: FilterLogic.And },\r\n { label: this.effectiveLabels().or, value: FilterLogic.Or },\r\n ]);\r\n\r\n private columnFor(field: string): TableColumn<T> | undefined {\r\n return this.columns().find((c) => c.field === field);\r\n }\r\n\r\n protected fieldHeader(field: string): string {\r\n return this.columnFor(field)?.header ?? field;\r\n }\r\n\r\n private filterTypeFor(field: string): TableColumnFilterType {\r\n return this.columnFor(field)?.filter?.type ?? 'text';\r\n }\r\n\r\n /**\r\n * Chip metni: \"Alan: değer\" — operatör SADECE o tip için varsayılan\r\n * değilse eklenir (\"Rol: Yönetici\" okunur, \"Rol eşittir Yönetici\" aynı\r\n * bilgiyi taşıyıp gürültü ekler). Çoklu seçimde 3'ten fazla değer\r\n * \"A, B +2\" şeklinde kısaltılır — chip'in kendisi bir özet, tam liste\r\n * düzenleyicide zaten görünür.\r\n */\r\n protected chipText(filter: AppliedFilter): string {\r\n const header = this.fieldHeader(filter.field);\r\n const type = this.filterTypeFor(filter.field);\r\n const value = this.displayValue(filter, type);\r\n if (isDefaultOperator(filter.operator, type)) return `${header}: ${value}`;\r\n return `${header} ${operatorLabel(this.effectiveLabels(), filter.operator)} ${value}`;\r\n }\r\n\r\n private displayValue(filter: AppliedFilter, type: TableColumnFilterType): string {\r\n if (filter.operator === 'between') {\r\n const [from, to] = (filter.value as [string | null, string | null] | undefined) ?? [\r\n null,\r\n null,\r\n ];\r\n const f = from ? from.slice(0, 10) : '…';\r\n const t = to ? to.slice(0, 10) : '…';\r\n return `${f} – ${t}`;\r\n }\r\n if (filter.value === null || filter.value === undefined) return '';\r\n\r\n const optionLabel = (raw: unknown): string => {\r\n if (type !== 'select' && type !== 'boolean') return String(raw);\r\n return (\r\n this.columnFor(filter.field)?.filter?.options?.find((o) => o.value === raw)?.label ??\r\n String(raw)\r\n );\r\n };\r\n\r\n if (Array.isArray(filter.value)) {\r\n const labels = filter.value.map(optionLabel);\r\n if (labels.length <= 2) return labels.join(', ');\r\n return `${labels.slice(0, 2).join(', ')} +${labels.length - 2}`;\r\n }\r\n return optionLabel(filter.value);\r\n }\r\n\r\n protected onMenuApply(applied: AppliedFilter): void {\r\n const current = this.filters();\r\n const index = current.findIndex((f) => f.id === applied.id);\r\n const next =\r\n index === -1 ? [...current, applied] : current.map((f, i) => (i === index ? applied : f));\r\n this.filtersChange.emit(next);\r\n }\r\n\r\n protected removeFilter(id: string): void {\r\n this.filtersChange.emit(this.filters().filter((f) => f.id !== id));\r\n if (this.editingId() === id) this.editingId.set(null);\r\n }\r\n\r\n protected onLogicChange(logic: FilterLogic | null): void {\r\n if (logic === null) return;\r\n this.logicChange.emit(logic);\r\n }\r\n\r\n protected clearAll(): void {\r\n this.filtersChange.emit([]);\r\n this.editingId.set(null);\r\n }\r\n}\r\n","<div class=\"flex flex-wrap items-center gap-1.5 border-b border-border bg-surface-sunken px-4 py-2\">\r\n @if (filters().length > 1) {\r\n <mf-select\r\n [options]=\"logicOptions()\"\r\n [value]=\"logic()\"\r\n (valueChange)=\"onLogicChange($event)\"\r\n size=\"sm\"\r\n class=\"w-20\"\r\n />\r\n }\r\n\r\n @for (filter of filters(); track filter.id) {\r\n <mf-chip\r\n [removable]=\"true\"\r\n [removeLabel]=\"effectiveLabels().remove\"\r\n (removed)=\"removeFilter(filter.id)\"\r\n >\r\n <button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #chipOrigin=\"cdkOverlayOrigin\"\r\n class=\"max-w-[16rem] cursor-pointer appearance-none truncate border-0 bg-transparent p-0 text-start transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"editingId.set(filter.id)\"\r\n >\r\n {{ chipText(filter) }}\r\n </button>\r\n </mf-chip>\r\n <mf-table-filter-menu\r\n [columns]=\"columns()\"\r\n [origin]=\"chipOrigin\"\r\n [open]=\"editingId() === filter.id\"\r\n [initial]=\"filter\"\r\n [labels]=\"effectiveLabels()\"\r\n (apply)=\"onMenuApply($event)\"\r\n (remove)=\"removeFilter($event)\"\r\n (closed)=\"editingId.set(null)\"\r\n />\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #addOrigin=\"cdkOverlayOrigin\"\r\n class=\"inline-flex cursor-pointer appearance-none items-center gap-1 rounded-full border border-dashed border-border bg-transparent py-1 pe-2.5 ps-2 text-xs font-medium text-fg-muted transition-colors duration-fast ease-emphasis hover:border-border-strong hover:text-fg\"\r\n (click)=\"addOpen.set(!addOpen())\"\r\n >\r\n <span mfIcon [size]=\"14\">add</span>\r\n {{ effectiveLabels().addFilter }}\r\n </button>\r\n <mf-table-filter-menu\r\n [columns]=\"columns()\"\r\n [origin]=\"addOrigin\"\r\n [open]=\"addOpen()\"\r\n [labels]=\"effectiveLabels()\"\r\n (apply)=\"onMenuApply($event)\"\r\n (remove)=\"removeFilter($event)\"\r\n (closed)=\"addOpen.set(false)\"\r\n />\r\n\r\n @if (filters().length > 0) {\r\n <button\r\n type=\"button\"\r\n class=\"ms-auto appearance-none border-0 bg-transparent p-0 text-xs font-medium text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n (click)=\"clearAll()\"\r\n >\r\n {{ effectiveLabels().clearAll }}\r\n </button>\r\n }\r\n</div>\r\n","import { CdkOverlayOrigin } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n computed,\r\n ElementRef,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { MF_TABLE_LABELS, type MfTablePaginationLabels } from '@mesgflow/ui-kit/core';\r\nimport { Input } from '@mesgflow/ui-kit/input';\r\nimport { Popover } from '@mesgflow/ui-kit/popover';\r\n\r\n/**\r\n * Sayfalamadaki tıklanabilir \"…\" için küçük bir sayfaya-git popover'ı —\r\n * panel iskeleti `Popover`'a devredildi (bkz. plan Faz 1c) — kendi\r\n * `[origin]`/`[open]` input'ları, `(apply)`/`(closed)` output'ları aynı\r\n * kaldı, sadece CDK connected overlay/backdrop/ESC/animasyon artık\r\n * `Popover`'ın işi. Onay YALNIZCA submit'te (Enter / Git) — her tuş\r\n * vuruşunda backend'e istek atmaz (bkz. plan, rate limit notu).\r\n */\r\n@Component({\r\n selector: 'mf-table-page-jump',\r\n imports: [Button, Input, Popover],\r\n host: { class: 'contents' },\r\n templateUrl: './table-page-jump.html',\r\n})\r\nexport class TablePageJump {\r\n readonly origin = input.required<CdkOverlayOrigin>();\r\n readonly open = input.required<boolean>();\r\n readonly totalPages = input.required<number>();\r\n readonly labels = input<MfTablePaginationLabels>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(\r\n () => this.labels() ?? this.tableLabels().pagination,\r\n );\r\n\r\n readonly apply = output<number>();\r\n readonly closed = output<void>();\r\n\r\n protected readonly value = signal('');\r\n\r\n private readonly valueEl = viewChild<ElementRef<HTMLInputElement>>('valueEl');\r\n\r\n constructor() {\r\n // Overlay her açılışta taze başlar — bkz. table-filter-menu.ts'teki aynı desen.\r\n effect(() => {\r\n if (!this.open()) return;\r\n untracked(() => {\r\n this.value.set('');\r\n queueMicrotask(() => this.valueEl()?.nativeElement.focus());\r\n });\r\n });\r\n }\r\n\r\n protected onValueInput(raw: string): void {\r\n this.value.set(raw);\r\n }\r\n\r\n protected commit(): void {\r\n const parsed = Number(this.value());\r\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > this.totalPages()) return;\r\n this.apply.emit(parsed);\r\n }\r\n\r\n protected close(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<mf-popover\r\n [origin]=\"origin()\"\r\n [open]=\"open()\"\r\n placement=\"bottom\"\r\n padding=\"md\"\r\n panelClass=\"w-44\"\r\n (closed)=\"close()\"\r\n>\r\n <p class=\"mb-1.5 px-0.5 text-eyebrow text-fg-subtle\">{{ effectiveLabels().jumpToPage }}</p>\r\n <div class=\"flex items-center gap-1.5\">\r\n <input\r\n mfInput\r\n #valueEl\r\n type=\"number\"\r\n class=\"text-sm\"\r\n min=\"1\"\r\n [max]=\"totalPages()\"\r\n [placeholder]=\"'1–' + totalPages()\"\r\n [value]=\"value()\"\r\n (input)=\"onValueInput($any($event.target).value)\"\r\n (keydown.enter)=\"commit()\"\r\n />\r\n <button mfButton tone=\"primary\" appearance=\"filled\" size=\"sm\" type=\"button\" (click)=\"commit()\">\r\n {{ effectiveLabels().go }}\r\n </button>\r\n </div>\r\n</mf-popover>\r\n","import { OverlayModule } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n ElementRef,\r\n afterRenderEffect,\r\n computed,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { Select, type SelectOption } from '@mesgflow/ui-kit/select';\r\nimport {\r\n cn,\r\n MF_TABLE_LABELS,\r\n type MfTablePaginationLabels,\r\n focusRecipe,\r\n} from '@mesgflow/ui-kit/core';\r\nimport { TablePageJump } from './table-page-jump';\r\n\r\n/** GitHub PR listesi tarzı akıllı elips: toplam ≤7 sayfa tümü gösterilir, aksi halde 1, 2, current±1, son-1, son sabit + boşluklar elipsli. */\r\nfunction buildPageList(current: number, total: number): (number | 'ellipsis')[] {\r\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\r\n\r\n const keep = new Set<number>([1, 2, total - 1, total, current - 1, current, current + 1]);\r\n const sorted = [...keep].filter((p) => p >= 1 && p <= total).sort((a, b) => a - b);\r\n\r\n const result: (number | 'ellipsis')[] = [];\r\n let previous = 0;\r\n for (const page of sorted) {\r\n if (previous && page - previous > 1) result.push('ellipsis');\r\n result.push(page);\r\n previous = page;\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Her hücre AYNI dili konuşuyor: kendi `rounded-md` hit alanına sahip,\r\n * tek bir `focus-visible` mekanizmalı, bağımsız bir buton (bkz.\r\n * projects/ui-kit/README.md \"Focus — tek mekanizma\"). `h-9 w-9` mobilde dört okun\r\n * da 36px dokunma hedefi olmasını sağlıyor; `sm:h-8 sm:min-w-8` masaüstünde\r\n * yandaki `mf-select size=\"sm\"` ile hizalanıyor (`select.variants.ts`).\r\n */\r\nconst CELL_BASE =\r\n 'relative flex h-9 w-9 sm:h-8 sm:min-w-8 shrink-0 appearance-none items-center justify-center rounded-md border-0 bg-transparent px-2 ' +\r\n 'text-sm font-medium tabular-nums transition-colors duration-fast ease-emphasis active:scale-[0.99] ' +\r\n focusRecipe +\r\n ' ' +\r\n 'disabled:pointer-events-none disabled:opacity-50 disabled:active:scale-100';\r\n\r\n/**\r\n * Table'ın footer'ı — sol \"X–Y / toplam Z\" özet + sayfa-boyutu `Select`i,\r\n * sağda AYRIK/havadar bir gezinme grubu: ⏮ ‹ · numaralar · › ⏭. Eskiden\r\n * tek kenarlıklı bir segment grubuydu (bkz. git geçmişi) — artık dış çerçeve\r\n * yok, her hücre kendi bağımsız butonu. Aktif sayfa dolu yeşil blok DEĞİL,\r\n * `surface-alt` yüzey + alt kenarda **ray** — bu tasarım sisteminin\r\n * \"buradasın\" motifi (sidebar aktif öğe, aktif sekme, seçili tablo satırı ile\r\n * aynı dil).\r\n */\r\n@Component({\r\n selector: 'mf-table-pagination',\r\n host: { class: 'block' },\r\n imports: [Select, Icon, OverlayModule, TablePageJump],\r\n templateUrl: './table-pagination.html',\r\n})\r\nexport class TablePagination {\r\n readonly page = input.required<number>();\r\n readonly pageSize = input.required<number>();\r\n readonly total = input.required<number>();\r\n readonly pageSizeOptions = input<number[]>([10, 20, 50, 100]);\r\n readonly labels = input<MfTablePaginationLabels>();\r\n\r\n private readonly tableLabels = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(\r\n () => this.labels() ?? this.tableLabels().pagination,\r\n );\r\n\r\n readonly pageChange = output<number>();\r\n readonly pageSizeChange = output<number>();\r\n\r\n protected readonly totalPages = computed(() =>\r\n Math.max(1, Math.ceil(this.total() / this.pageSize())),\r\n );\r\n protected readonly rangeStart = computed(() =>\r\n this.total() === 0 ? 0 : (this.page() - 1) * this.pageSize() + 1,\r\n );\r\n protected readonly rangeEnd = computed(() =>\r\n Math.min(this.page() * this.pageSize(), this.total()),\r\n );\r\n protected readonly pageItems = computed(() => buildPageList(this.page(), this.totalPages()));\r\n protected readonly pageSizeSelectOptions = computed<SelectOption<number>[]>(() =>\r\n this.pageSizeOptions().map((size) => ({ label: String(size), value: size })),\r\n );\r\n\r\n /** Aynı anda iki \"…\" olabilir (baştaki + sondaki) — açık olanın loop index'i, `null` = hiçbiri açık değil. */\r\n protected readonly jumpOpenIndex = signal<number | null>(null);\r\n\r\n private readonly navEl = viewChild<ElementRef<HTMLElement>>('nav');\r\n /** Signal DEĞİL — sadece odağın şu an `<nav>` içinde olup olmadığını izleyen düz bir bayrak (bkz. constructor'daki geri-odaklama notu). */\r\n private focusWithinNav = false;\r\n\r\n constructor() {\r\n /*\r\n * Ok tuşlarıyla ardışık gezinme: sayfa değişince o anki `[aria-current]`\r\n * butonu DOM'dan kalkabiliyor (pencere current±1'e göre kayıyor), odak\r\n * `<body>`'ye düşüyor ve bir sonraki ok tuşu artık `<nav>`'a ulaşmıyordu\r\n * (gerçek bulgu). Odak `<nav>` içindeyken her sayfa değişiminden sonra\r\n * yeni aktif sayfa butonuna (mobilde numaralar gizliyse `<nav>`'ın\r\n * kendisine) geri veriliyor.\r\n */\r\n afterRenderEffect(() => {\r\n this.page();\r\n if (!this.focusWithinNav) return;\r\n const nav = this.navEl()?.nativeElement;\r\n if (!nav || nav.contains(document.activeElement)) return;\r\n const activeBtn = nav.querySelector<HTMLButtonElement>('[aria-current=\"page\"]');\r\n (activeBtn ?? nav).focus();\r\n });\r\n }\r\n\r\n protected goTo(page: number): void {\r\n if (page < 1 || page > this.totalPages() || page === this.page()) return;\r\n this.pageChange.emit(page);\r\n }\r\n\r\n protected onPageSizeChange(size: number | null): void {\r\n if (size === null) return;\r\n this.pageSizeChange.emit(size);\r\n }\r\n\r\n protected cellClasses(active: boolean): string {\r\n return cn(\r\n CELL_BASE,\r\n active\r\n ? 'bg-surface-alt text-fg font-semibold'\r\n : 'text-fg-muted hover:bg-state-hover hover:text-fg',\r\n // Ray: aktif sayfanın alt kenarında 2px dolu marka rengi — dolu yeşil\r\n // BLOK değil (bu sistemin \"buradasın\" motifi, bkz. sınıf yorumu).\r\n // `inset-x-2` (8px), hücrenin `rounded-md` (8px) köşe yarıçapını tam\r\n // kurtarıyor — ray düz kenarda kalıyor.\r\n active &&\r\n \"after:absolute after:inset-x-2 after:bottom-0 after:h-0.5 after:rounded-full after:bg-accent-fill after:content-['']\",\r\n );\r\n }\r\n\r\n protected onNavKeydown(event: KeyboardEvent): void {\r\n switch (event.key) {\r\n case 'ArrowLeft':\r\n event.preventDefault();\r\n this.goTo(this.page() - 1);\r\n break;\r\n case 'ArrowRight':\r\n event.preventDefault();\r\n this.goTo(this.page() + 1);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this.goTo(1);\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this.goTo(this.totalPages());\r\n break;\r\n }\r\n }\r\n\r\n protected onNavFocusIn(): void {\r\n this.focusWithinNav = true;\r\n }\r\n\r\n protected onNavFocusOut(): void {\r\n this.focusWithinNav = false;\r\n }\r\n\r\n protected toggleJump(index: number): void {\r\n this.jumpOpenIndex.update((current) => (current === index ? null : index));\r\n }\r\n\r\n protected onJumpApply(page: number): void {\r\n this.jumpOpenIndex.set(null);\r\n this.goTo(page);\r\n }\r\n}\r\n","<div class=\"flex flex-wrap items-center justify-between gap-3 px-4 py-3\">\r\n <div class=\"flex items-center gap-2 text-sm text-fg-subtle\">\r\n <span class=\"tabular-nums\"\r\n >{{ rangeStart() }}–{{ rangeEnd() }} / {{ total() }} {{ effectiveLabels().records }}</span\r\n >\r\n <span class=\"text-fg-subtle\">{{ effectiveLabels().perPage }}</span>\r\n <mf-select\r\n [options]=\"pageSizeSelectOptions()\"\r\n [value]=\"pageSize()\"\r\n (valueChange)=\"onPageSizeChange($event)\"\r\n size=\"sm\"\r\n [ariaLabel]=\"effectiveLabels().pageSizeAriaLabel\"\r\n class=\"w-20\"\r\n />\r\n </div>\r\n\r\n <nav\r\n #nav\r\n tabindex=\"-1\"\r\n class=\"flex shrink-0 flex-nowrap items-center gap-1.5 outline-none\"\r\n [attr.aria-label]=\"effectiveLabels().navAriaLabel\"\r\n (keydown)=\"onNavKeydown($event)\"\r\n (focusin)=\"onNavFocusIn()\"\r\n (focusout)=\"onNavFocusOut()\"\r\n >\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(false)\"\r\n [disabled]=\"page() === 1\"\r\n [attr.aria-label]=\"effectiveLabels().first\"\r\n (click)=\"goTo(1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">first_page</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(false)\"\r\n [disabled]=\"page() === 1\"\r\n [attr.aria-label]=\"effectiveLabels().previous\"\r\n (click)=\"goTo(page() - 1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">chevron_left</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"hidden items-center gap-0.5 sm:flex\">\r\n @for (item of pageItems(); track $index) {\r\n @if (item === 'ellipsis') {\r\n <button\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #jumpOrigin=\"cdkOverlayOrigin\"\r\n [class]=\"cellClasses(false)\"\r\n [attr.aria-label]=\"effectiveLabels().jumpToPage\"\r\n (click)=\"toggleJump($index)\"\r\n >\r\n …\r\n </button>\r\n <mf-table-page-jump\r\n [origin]=\"jumpOrigin\"\r\n [open]=\"jumpOpenIndex() === $index\"\r\n [totalPages]=\"totalPages()\"\r\n [labels]=\"effectiveLabels()\"\r\n (apply)=\"onJumpApply($event)\"\r\n (closed)=\"jumpOpenIndex.set(null)\"\r\n />\r\n } @else {\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(item === page())\"\r\n [attr.aria-current]=\"item === page() ? 'page' : null\"\r\n (click)=\"goTo(item)\"\r\n >\r\n {{ item }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n\r\n <span class=\"flex h-9 shrink-0 items-center px-3 text-sm tabular-nums text-fg-muted sm:hidden\">\r\n {{ effectiveLabels().page }} {{ page() }} / {{ totalPages() }}\r\n </span>\r\n\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(false)\"\r\n [disabled]=\"page() === totalPages()\"\r\n [attr.aria-label]=\"effectiveLabels().next\"\r\n (click)=\"goTo(page() + 1)\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">chevron_right</span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n [class]=\"cellClasses(false)\"\r\n [disabled]=\"page() === totalPages()\"\r\n [attr.aria-label]=\"effectiveLabels().last\"\r\n (click)=\"goTo(totalPages())\"\r\n >\r\n <span mfIcon [size]=\"16\" class=\"rtl:-scale-x-100\">last_page</span>\r\n </button>\r\n </div>\r\n </nav>\r\n</div>\r\n","export interface VirtualWindow {\r\n /** Render edilecek ilk satırın indeksi (dahil). */\r\n start: number;\r\n /** Render edilecek son satırın indeksi (hariç). */\r\n end: number;\r\n /** Üst/alt boşluk satırlarının yüksekliği, px — kaydırma çubuğu tam liste boyunu korur. */\r\n top: number;\r\n bottom: number;\r\n}\r\n\r\n/**\r\n * Sabit satır yüksekliğiyle pencereleme — görünür aralık ± `overscan` satır. Saf fonksiyon;\r\n * `Table`'ın `virtual` modu bunu `scrollTop`/görünüm yüksekliği sinyalleriyle çağırır.\r\n * `<cdk-virtual-scroll-viewport>` yerine: tablo `<tr>`'leri bir viewport sarmalayıcısına\r\n * girince yapışkan başlık, `border-collapse` ve `colspan`'lı boş durum satırı bozuluyordu;\r\n * boşluk satırı (`<tr><td [style.height]>`) yaklaşımı tablo semantiğini aynen korur.\r\n */\r\nexport function virtualWindow(\r\n total: number,\r\n scrollTop: number,\r\n viewportHeight: number,\r\n rowHeight: number,\r\n overscan = 8,\r\n): VirtualWindow {\r\n if (total === 0 || rowHeight <= 0) return { start: 0, end: 0, top: 0, bottom: 0 };\r\n const first = Math.floor(Math.max(0, scrollTop) / rowHeight);\r\n const visible = Math.ceil(Math.max(0, viewportHeight) / rowHeight);\r\n const start = Math.min(total, Math.max(0, first - overscan));\r\n const end = Math.min(total, first + visible + overscan);\r\n return { start, end, top: start * rowHeight, bottom: (total - end) * rowHeight };\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n afterNextRender,\r\n afterRenderEffect,\r\n booleanAttribute,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n untracked,\r\n viewChild,\r\n type TemplateRef,\r\n} from '@angular/core';\r\nimport {\r\n DEFAULT_PAGE_SIZE,\r\n FilterLogic,\r\n FilterOperator,\r\n SortDirection,\r\n canonicalPagedRequest,\r\n type FilterGroup,\r\n type PageRequest,\r\n type PagedRequest,\r\n type SortDescriptor,\r\n} from './query-contract.model';\r\nimport { Button } from '@mesgflow/ui-kit/button';\r\nimport { Checkbox } from '@mesgflow/ui-kit/checkbox';\r\nimport {\r\n cn,\r\n isRtl,\r\n MF_TABLE_LABELS,\r\n mergeLabels,\r\n type DeepPartial,\r\n type MfTableLabels,\r\n} from '@mesgflow/ui-kit/core';\r\nimport { EmptyState } from '@mesgflow/ui-kit/empty-state';\r\nimport { Icon } from '@mesgflow/ui-kit/icon';\r\nimport { SearchInput } from '@mesgflow/ui-kit/search-input';\r\nimport { Skeleton } from '@mesgflow/ui-kit/skeleton';\r\nimport { Tooltip } from '@mesgflow/ui-kit/tooltip';\r\nimport { matchesFilterGroup, sortRows } from './table-client-query';\r\nimport { TableResizeHandle } from './table-column-resize';\r\nimport { TableColumnsMenu } from './table-columns-menu';\r\nimport { TableFilterBar } from './table-filter-bar';\r\nimport { buildFilterGroup, type AppliedFilter } from './table-filter.model';\r\nimport { TablePagination } from './table-pagination';\r\nimport type { TableColumn } from './table-column.model';\r\nimport { virtualWindow } from './table-virtual';\r\n\r\n/** Seçim/genişletme kolonlarının sabit genişliği (`w-10`) ve aksiyon kolonu (`w-20`), px. */\r\nconst LEADING_COL_PX = 40;\r\nconst ACTIONS_COL_PX = 80;\r\nconst FALLBACK_COL_PX = 160;\r\n/** Ölçülemeyen ortamda (SSR/jsdom) varsayılan satır yüksekliği — `bodyCellPad` ile uyumlu. */\r\nconst FALLBACK_ROW_PX = { comfortable: 57, compact: 45 } as const;\r\n\r\nlet tableIdSeq = 0;\r\n\r\nfunction sameRecord(a: Record<string, number>, b: Record<string, number>): boolean {\r\n const keys = Object.keys(a);\r\n return keys.length === Object.keys(b).length && keys.every((key) => a[key] === b[key]);\r\n}\r\n\r\n/**\r\n * Bu kitin premium data-table'ı.\r\n *\r\n * İKİ satırlık üst yapı:\r\n * 1. **Toolbar** — başlık + kayıt sayacı · her zaman açık arama (bir veri\r\n * tablosunda arama gizlenmez, bu bir navbar deseni) · Kolonlar/Yoğunluk\r\n * ikon kümesi · `[tableActions]` slotu (sayfanın GERÇEK aksiyonu, tek dolu\r\n * buton — Kolonlar/Yoğunluk kasıtlı olarak hayalet kalır, göz doğru yere\r\n * gitsin diye). Seçim modunda DA aynı kalır — eskiden seçim toolbar'ın\r\n * TAMAMINI yok ediyordu (gerçek bug, kullanıcı arama/filtre bağlamını\r\n * kaybediyordu).\r\n * 2. **Filtre/seçim şeridi** — filtrelenebilir kolon varsa HER ZAMAN görünür\r\n * (`TableFilterBar`, chip + \"+ Filtre\" komut menüsü — bkz. o dosya). Bir\r\n * satır seçilince bu şerit YERİNİ seçim aksiyonlarına bırakır (toolbar'ı\r\n * değil) — sağda \"N filtre\" rozeti filtre bağlamının kaybolmadığını\r\n * gösterir.\r\n *\r\n * `[clientSide]=\"true\"` verildiğinde Table gelen TAM diziyi kendisi\r\n * filtreler/sıralar/sayfalar (bkz. table-client-query.ts) ve `queryChange`\r\n * emit ETMEZ — backend'i sayfalanmayan uçlar için (tüketici artık kendi\r\n * `sortedRows`/`rows`/`total` boilerplate'ini yazmak zorunda kalmaz).\r\n */\r\n@Component({\r\n selector: 'mf-table',\r\n exportAs: 'mfTable',\r\n imports: [\r\n Button,\r\n Icon,\r\n Checkbox,\r\n Skeleton,\r\n EmptyState,\r\n NgTemplateOutlet,\r\n OverlayModule,\r\n TableFilterBar,\r\n TableColumnsMenu,\r\n TablePagination,\r\n TableResizeHandle,\r\n SearchInput,\r\n Tooltip,\r\n ],\r\n host: { class: 'block' },\r\n templateUrl: './table.html',\r\n})\r\nexport class Table<T> {\r\n /** Template'te `[class]=\"cn(...)\"` ile koşullu class birleştirmek için. */\r\n protected readonly cn = cn;\r\n\r\n readonly title = input('');\r\n readonly columns = input.required<TableColumn<T>[]>();\r\n /** Sunucu modunda SADECE geçerli sayfa; `[clientSide]=\"true\"` modunda TAM dizi (bkz. sınıf yorumu). */\r\n readonly data = input.required<readonly T[]>();\r\n readonly rowKey = input.required<keyof T & string>();\r\n readonly loading = input(false);\r\n /** Sunucu modunda zorunlu (toplam kayıt). `clientSide` modunda YOK SAYILIR — toplam `data().length`'ten türetilir. */\r\n readonly total = input(0);\r\n readonly pageSizeOptions = input<number[]>([10, 20, 50, 100]);\r\n readonly selectable = input(false);\r\n readonly searchable = input(true);\r\n readonly stickyHeader = input(false);\r\n /** `compact` yoğun listeler için satır başına dikey boşluğu daraltır. `model()` — toolbar'daki düğme TOGGLE eder, ama ekran isterse `[(density)]` ile de kontrol edebilir. */\r\n readonly density = model<'comfortable' | 'compact'>('comfortable');\r\n readonly rowActions = input<{ edit?: boolean; delete?: boolean }>({});\r\n /** true ise Table gelen `data()`'yı TAM liste sayar, kendi içinde filtreler/sıralar/sayfalar; `queryChange` emit edilmez (bkz. sınıf yorumu). */\r\n readonly clientSide = input(false);\r\n\r\n /**\r\n * Başlık kenarlarında sürükleme tutamacı (klavye: ←/→, çift tık/Enter: içeriğe sığdır).\r\n * İlk boyutlandırmada tüm görünür kolonların ölçülen genişliği dondurulur ve tablo\r\n * `table-layout: fixed`e geçer — aksi halde otomatik düzen, sürüklenen kolonun\r\n * kazandığını komşulardan geri alıp tutamacı imlecin altından kaçırıyordu.\r\n */\r\n readonly resizableColumns = input(false, { transform: booleanAttribute });\r\n /** Kolon genişlikleri (px, `field` → genişlik). `[(columnWidths)]` ile kalıcılaştırılabilir. */\r\n readonly columnWidths = model<Readonly<Record<string, number>>>({});\r\n\r\n /**\r\n * Verilirse her satırın başında bir aç/kapa düğmesi çıkar; açık satırın altında bu şablon\r\n * tam genişlikte render edilir (context: `{ $implicit: row }`). `virtual` ile birlikte\r\n * KULLANILMAZ — değişken yükseklikli satır sabit satır yüksekliği varsayımını bozar.\r\n */\r\n readonly expandedRowTemplate = input<TemplateRef<{ $implicit: T }>>();\r\n\r\n /**\r\n * Sayfalama yerine sanal kaydırma: TÜM satırlar tek listede, yalnızca görünen aralık\r\n * (± 8 satır) DOM'da. Başlık yapışkan, `aria-rowcount`/`aria-rowindex` tam listeyi\r\n * duyurur. Binlerce satırlık `clientSide` listeler için.\r\n */\r\n readonly virtual = input(false, { transform: booleanAttribute });\r\n /** `virtual` modunda kaydırma alanının yüksekliği (CSS uzunluğu). */\r\n readonly virtualHeight = input('32rem');\r\n\r\n /**\r\n * Table'ın TÜM chrome metinleri (arama placeholder'ı, boş/sonuç-yok\r\n * durumları, satır aksiyonları, yoğunluk düğmesi, filtre çubuğu + sayfalama\r\n * dahil — `filter`/`pagination` iç içe alt-alanlar) TEK bir grup input —\r\n * eskiden 16 ayrı `input()` + `filterLabels`/`paginationLabels` idi (bkz.\r\n * git geçmişi); `DeepPartial` olduğu için sadece değiştirmek istediğin\r\n * alanı geçebilirsin, kalanı `MF_TABLE_LABELS`'tan (bkz.\r\n * `provideMesgflowUi`) gelir.\r\n */\r\n readonly labels = input<DeepPartial<MfTableLabels>>();\r\n\r\n private readonly tableLabelsToken = inject(MF_TABLE_LABELS);\r\n protected readonly effectiveLabels = computed(() =>\r\n mergeLabels(this.tableLabelsToken(), this.labels()),\r\n );\r\n\r\n readonly queryChange = output<PagedRequest>();\r\n readonly selectionChange = output<T[]>();\r\n readonly edit = output<T>();\r\n readonly delete = output<T>();\r\n readonly rowDblClick = output<T>();\r\n /** Bir satır açıldı/kapandı — ayrıntıyı tembel yüklemek için. */\r\n readonly rowExpandedChange = output<{ row: T; expanded: boolean }>();\r\n\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly scroller = viewChild.required<ElementRef<HTMLElement>>('scroller');\r\n private readonly idPrefix = `mf-table-${++tableIdSeq}`;\r\n\r\n /*\r\n * Sorgu durumu — beşi de `model()`: verilmezse tablo durumunu kendisi tutar\r\n * (eski davranış); `[(page)]`/`[(sort)]`/`[(search)]`/`[(filters)]`/\r\n * `[(filterLogic)]` ile bağlanırsa dıştan (ör. URL query param'larından)\r\n * yazılabilir ve arayüz (footer sayfası, sıralama okları, filtre chip'leri,\r\n * arama kutusu) senkron olur. Dıştan yazma `queryChange` YAYMAZ (döngü\r\n * olmasın — dışarıdaki zaten yeni durumu biliyor, yüklemeyi kendisi başlatır);\r\n * kullanıcı etkileşimi modelleri günceller VE `queryChange`'i bir kez yayar.\r\n */\r\n readonly page = model<PageRequest>({ pageNumber: 1, pageSize: DEFAULT_PAGE_SIZE });\r\n readonly sort = model<SortDescriptor[]>([]);\r\n readonly search = model('');\r\n readonly filters = model<AppliedFilter[]>([]);\r\n readonly filterLogic = model<FilterLogic>(FilterLogic.And);\r\n protected readonly selectedRows = signal<Map<unknown, T>>(new Map());\r\n protected readonly hiddenColumns = signal<Set<string>>(new Set());\r\n protected readonly columnsMenuOpen = signal(false);\r\n\r\n protected readonly FilterLogic = FilterLogic;\r\n\r\n /** Sabitlenen kolonlar (`pinned: 'left'`) verildikleri sırayla öne alınır. */\r\n protected readonly visibleColumns = computed(() => {\r\n const visible = this.columns().filter((c) => !this.hiddenColumns().has(c.field));\r\n return [\r\n ...visible.filter((c) => c.pinned === 'left'),\r\n ...visible.filter((c) => c.pinned !== 'left'),\r\n ];\r\n });\r\n protected readonly hasPinned = computed(() =>\r\n this.visibleColumns().some((c) => c.pinned === 'left'),\r\n );\r\n /** Sabit bölgenin sağ kenarı — ayırıcı gölge bu hücrede. Sabit kolon yoksa `null`. */\r\n protected readonly lastPinnedKey = computed(\r\n () =>\r\n this.visibleColumns()\r\n .filter((c) => c.pinned === 'left')\r\n .at(-1)?.field ?? null,\r\n );\r\n /** Ölçülen satır-başı ofsetleri (px, `inset-inline-start`) — anahtar: `field`, `__expand`, `__select`. */\r\n protected readonly pinOffsets = signal<Record<string, number>>({});\r\n /** Başlık hücrelerinin ölçülen genişliği — tutamacın `aria-valuenow`u dondurulmadan önce buradan. */\r\n private readonly measuredWidths = signal<Record<string, number>>({});\r\n\r\n protected readonly expandable = computed(() => !!this.expandedRowTemplate() && !this.virtual());\r\n protected readonly expandedKeys = signal<ReadonlySet<unknown>>(new Set());\r\n\r\n protected readonly fixedLayout = computed(() => Object.keys(this.columnWidths()).length > 0);\r\n /** Sabit düzende tablonun toplam genişliği — kolonlar kapsayıcıdan genişse yatay kaydırma doğar. */\r\n protected readonly tableWidth = computed(() => {\r\n if (!this.fixedLayout()) return null;\r\n const widths = this.columnWidths();\r\n const columns = this.visibleColumns().reduce(\r\n (sum, col) => sum + (widths[col.field] ?? FALLBACK_COL_PX),\r\n 0,\r\n );\r\n const leading =\r\n (this.selectable() ? LEADING_COL_PX : 0) + (this.expandable() ? LEADING_COL_PX : 0);\r\n return columns + leading + (this.hasRowActions() ? ACTIONS_COL_PX : 0);\r\n });\r\n\r\n private readonly scrollTop = signal(0);\r\n private readonly viewportHeight = signal(0);\r\n /** Kaydırma alanının görünür genişliği — ayrıntı satırı içeriği yatay kaydırmada bu genişlikte sabit kalır. */\r\n protected readonly viewportWidth = signal(0);\r\n private readonly measuredRowHeight = signal(0);\r\n /** Tablo/kapsayıcı yeniden boyutlandığında sabit kolon ofsetleri yeniden ölçülür. */\r\n private readonly layoutTick = signal(0);\r\n protected readonly hasFilterableColumns = computed(() => this.columns().some((c) => c.filter));\r\n protected readonly activeFilterCount = computed(() => this.filters().length);\r\n protected readonly isFiltered = computed(\r\n () => !!this.search().trim() || this.filters().length > 0,\r\n );\r\n protected readonly hasRowActions = computed(\r\n () => !!(this.rowActions().edit || this.rowActions().delete),\r\n );\r\n protected readonly columnSpan = computed(\r\n () =>\r\n this.visibleColumns().length +\r\n (this.selectable() ? 1 : 0) +\r\n (this.expandable() ? 1 : 0) +\r\n (this.hasRowActions() ? 1 : 0),\r\n );\r\n\r\n /** `clientSide` modunda `data()` TAM listedir — burada filtrelenip/sıralanıp/sayfalanır (bkz. table-client-query.ts). Sunucu modunda kullanılmaz. */\r\n private readonly clientResult = computed(() => {\r\n const rows = this.data();\r\n const filtered = this.isFiltered()\r\n ? rows.filter((row) => matchesFilterGroup(row, this.buildFilter()))\r\n : [...rows];\r\n const sorted = sortRows(filtered, this.sort());\r\n if (this.virtual()) return { items: sorted, total: filtered.length };\r\n const { pageNumber, pageSize } = this.page();\r\n const start = (pageNumber - 1) * pageSize;\r\n return { items: sorted.slice(start, start + pageSize), total: filtered.length };\r\n });\r\n\r\n protected readonly rows = computed(() =>\r\n this.clientSide() ? this.clientResult().items : this.data(),\r\n );\r\n protected readonly rowsTotal = computed(() =>\r\n this.clientSide() ? this.clientResult().total : this.total(),\r\n );\r\n\r\n /** `virtual` modunda görünen aralık; değilse `null` (tüm `rows()` render edilir). */\r\n protected readonly virtualRange = computed(() => {\r\n if (!this.virtual()) return null;\r\n const rowHeight = this.measuredRowHeight() || FALLBACK_ROW_PX[this.density()];\r\n return virtualWindow(\r\n this.rows().length,\r\n this.scrollTop(),\r\n this.viewportHeight() || 600,\r\n rowHeight,\r\n );\r\n });\r\n protected readonly displayRows = computed(() => {\r\n const range = this.virtualRange();\r\n return range ? this.rows().slice(range.start, range.end) : this.rows();\r\n });\r\n protected readonly rowIndexOffset = computed(() => this.virtualRange()?.start ?? 0);\r\n protected readonly isStickyHeader = computed(() => this.stickyHeader() || this.virtual());\r\n\r\n protected readonly skeletonIndexes = computed(() =>\r\n Array.from({ length: Math.min(this.page().pageSize, 8) }, (_, i) => i),\r\n );\r\n /** `overflow-x-auto` HER ZAMAN gerekli (dar viewport'ta yatay kaydırma olmadan tablo taşıp sağdaki satır aksiyonlarını görünmez kılıyordu). `stickyHeader` ek olarak dikey kaydırma+sabit başlık ekliyor. */\r\n protected readonly scrollWrapperClasses = computed(() =>\r\n cn(\r\n 'overflow-x-auto',\r\n this.virtual() && 'overflow-y-auto overscroll-contain',\r\n this.stickyHeader() && !this.virtual() && 'max-h-[28rem] overflow-y-auto',\r\n ),\r\n );\r\n\r\n /*\r\n * `compact` eskiden `py-2`/`py-2`ydi — `comfortable`'a (py-2.5/py-3) çok\r\n * yakın durduğundan geçiş neredeyse fark edilmiyordu (gerçek kullanıcı\r\n * bulgusu: \"1px anca oynuyor, sık gibi durmuyor\"). Fark artık satır\r\n * başına ~16px'e çıkarıldı (60px → ~45px) — ikon/checkbox boyutları\r\n * (18-20px) hâlâ rahat sığıyor, taşma/kırpılma YOK (bkz. dev sunucuda\r\n * canlı ölçüm).\r\n */\r\n protected readonly headerCellPad = computed(() =>\r\n this.density() === 'compact' ? 'py-1.5' : 'py-2.5',\r\n );\r\n protected readonly bodyCellPad = computed(() => (this.density() === 'compact' ? 'py-1' : 'py-3'));\r\n\r\n protected readonly allChecked = computed(() => {\r\n const rows = this.rows();\r\n return rows.length > 0 && rows.every((row) => this.selectedRows().has(row[this.rowKey()]));\r\n });\r\n protected readonly indeterminate = computed(\r\n () => this.selectedRows().size > 0 && !this.allChecked(),\r\n );\r\n protected readonly selectedCount = computed(() => this.selectedRows().size);\r\n\r\n /** İlk yüklemede satır yoksa iskelet gösterilir. Sonraki her sorguda (arama/filtre/sayfa) satırlar YERİNDE kalır, sadece soluklaşır — eskiden HER sorguda tüm tablo iskelete dönüp \"yanıp sönüyordu\" (gerçek bulgu). */\r\n protected readonly showSkeleton = computed(() => this.loading() && this.rows().length === 0);\r\n protected readonly showStaleOverlay = computed(() => this.loading() && this.rows().length > 0);\r\n\r\n constructor() {\r\n // Sayfa/sıralama/filtre değişince `rows()` yeni bir referans alır —\r\n // önceki seçim artık görünürdeki satırlarla eşleşmeyebileceğinden temizlenir.\r\n effect(() => {\r\n this.rows();\r\n untracked(() => {\r\n this.selectedRows.set(new Map());\r\n // Yeni sonuç kümesi (arama/filtre/sıralama) — sanal listede eski kaydırma konumu anlamsız.\r\n if (this.virtual() && this.scrollTop() !== 0) {\r\n this.scroller().nativeElement.scrollTop = 0;\r\n this.scrollTop.set(0);\r\n }\r\n });\r\n });\r\n\r\n // Ölçüm: sabit kolon ofsetleri + sanal satır yüksekliği. Değer değişmedikçe yazılmaz\r\n // (render → ölçüm → set → render döngüsü tek turda durulur).\r\n afterRenderEffect({\r\n read: () => {\r\n this.visibleColumns();\r\n this.columnWidths();\r\n this.density();\r\n this.layoutTick();\r\n this.displayRows();\r\n const root = this.host.nativeElement;\r\n if (this.hasPinned()) {\r\n const next: Record<string, number> = {};\r\n const rtl = isRtl(root);\r\n root.querySelectorAll<HTMLElement>('thead th[data-pin]').forEach((th) => {\r\n // Satır başından uzaklık — RTL'de sağ kenardan (sabit kolonlar sağa yapışır).\r\n const table = th.offsetParent as HTMLElement | null;\r\n next[th.dataset['pin']!] = rtl\r\n ? (table?.offsetWidth ?? 0) - th.offsetLeft - th.offsetWidth\r\n : th.offsetLeft;\r\n });\r\n if (!sameRecord(next, untracked(this.pinOffsets))) this.pinOffsets.set(next);\r\n }\r\n if (this.resizableColumns()) {\r\n const widths: Record<string, number> = {};\r\n root.querySelectorAll<HTMLElement>('thead th[data-col]').forEach((th) => {\r\n widths[th.dataset['col']!] = Math.round(th.getBoundingClientRect().width);\r\n });\r\n if (!sameRecord(widths, untracked(this.measuredWidths))) this.measuredWidths.set(widths);\r\n }\r\n if (this.virtual()) {\r\n const row = root.querySelector<HTMLElement>('tbody tr[data-row]');\r\n const height = row?.getBoundingClientRect().height ?? 0;\r\n if (height > 0 && Math.abs(height - untracked(this.measuredRowHeight)) > 0.5)\r\n this.measuredRowHeight.set(height);\r\n }\r\n },\r\n });\r\n\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n if (typeof ResizeObserver === 'undefined') return;\r\n const scroller = this.scroller().nativeElement;\r\n const observer = new ResizeObserver(() => {\r\n this.viewportHeight.set(scroller.clientHeight);\r\n this.viewportWidth.set(scroller.clientWidth);\r\n this.layoutTick.update((tick) => tick + 1);\r\n });\r\n observer.observe(scroller);\r\n const table = scroller.querySelector('table');\r\n if (table) observer.observe(table);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n protected onScroll(event: Event): void {\r\n if (!this.virtual()) return;\r\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\r\n }\r\n\r\n // ---- Kolon genişliği ----\r\n\r\n protected widthStyle(col: TableColumn<T>): string | null {\r\n const px = this.columnWidths()[col.field];\r\n return px ? `${px}px` : (col.width ?? null);\r\n }\r\n\r\n /** Tutamacın `aria-valuenow`u: kaydedilmiş > ölçülen > alt sınır. */\r\n protected currentWidth(col: TableColumn<T>): number {\r\n return (\r\n this.columnWidths()[col.field] || this.measuredWidths()[col.field] || (col.minWidth ?? 80)\r\n );\r\n }\r\n\r\n protected isResizable(col: TableColumn<T>): boolean {\r\n return this.resizableColumns() && col.resizable !== false;\r\n }\r\n\r\n protected resizeAriaLabel(col: TableColumn<T>): string {\r\n return `${this.effectiveLabels().resizeColumn}: ${col.header}`;\r\n }\r\n\r\n /** Henüz genişliği kaydedilmemiş görünür kolonları ölçülen genişlikte dondurur. */\r\n protected freezeWidths(): void {\r\n const current = { ...this.columnWidths() };\r\n let changed = false;\r\n this.host.nativeElement.querySelectorAll<HTMLElement>('thead th[data-col]').forEach((th) => {\r\n const field = th.dataset['col']!;\r\n if (current[field] !== undefined) return;\r\n current[field] = Math.round(th.getBoundingClientRect().width) || FALLBACK_COL_PX;\r\n changed = true;\r\n });\r\n if (changed) this.columnWidths.set(current);\r\n }\r\n\r\n protected onColumnResize(col: TableColumn<T>, width: number): void {\r\n this.columnWidths.update((widths) => ({ ...widths, [col.field]: width }));\r\n }\r\n\r\n /** İçeriğe sığdır: kolondaki en geniş hücre içeriği + yatay dolgu (`px-4` × 2). */\r\n protected autofitColumn(col: TableColumn<T>): void {\r\n this.freezeWidths();\r\n let widest = 0;\r\n this.host.nativeElement.querySelectorAll<HTMLElement>('[data-col]').forEach((cell) => {\r\n if (cell.dataset['col'] !== col.field) return;\r\n const content = cell.firstElementChild as HTMLElement | null;\r\n widest = Math.max(widest, content?.getBoundingClientRect().width ?? 0);\r\n });\r\n if (widest > 0) this.onColumnResize(col, Math.max(col.minWidth ?? 80, Math.ceil(widest + 32)));\r\n }\r\n\r\n // ---- Sabit kolonlar ----\r\n\r\n /** Sabitlenecek bir hücre mi? Öndeki seçim/genişletme kolonları, sabit kolon varsa onlarla gider. */\r\n protected isPinnedKey(key: string): boolean {\r\n if (!this.hasPinned()) return false;\r\n if (key === '__select' || key === '__expand') return true;\r\n return this.visibleColumns().some((c) => c.field === key && c.pinned === 'left');\r\n }\r\n\r\n protected pinStart(key: string): number | null {\r\n return this.isPinnedKey(key) ? (this.pinOffsets()[key] ?? 0) : null;\r\n }\r\n\r\n /** Başlık hücresinin sabitleme sınıfları (`thead` zaten opak `bg-surface-sunken`). */\r\n protected pinHeadClasses(key: string): string {\r\n if (!this.isPinnedKey(key)) return '';\r\n return cn('sticky z-[2] bg-surface-sunken', this.edgeShadow(key));\r\n }\r\n\r\n /** Gövde hücresi: opak zemin şart — altından kayan hücreler sızmasın (bkz. `rowBg`). */\r\n protected pinBodyClasses(key: string, row: T): string {\r\n if (!this.isPinnedKey(key)) return '';\r\n return cn('sticky z-[1]', this.rowBg(row), this.edgeShadow(key));\r\n }\r\n\r\n /** `border-collapse` altında kenarlıklar yapışkan hücreyle gitmez — içe gölge gider. */\r\n private edgeShadow(key: string): string {\r\n return key === this.lastPinnedKey()\r\n ? 'shadow-[inset_-1px_0_0_var(--mf-border)] rtl:shadow-[inset_1px_0_0_var(--mf-border)]'\r\n : '';\r\n }\r\n\r\n // ---- Satır genişletme ----\r\n\r\n protected isExpanded(row: T): boolean {\r\n return this.expandedKeys().has(row[this.rowKey()]);\r\n }\r\n\r\n protected toggleExpanded(row: T): void {\r\n const key = row[this.rowKey()];\r\n const next = new Set(this.expandedKeys());\r\n const expanded = !next.has(key);\r\n if (expanded) next.add(key);\r\n else next.delete(key);\r\n this.expandedKeys.set(next);\r\n this.rowExpandedChange.emit({ row, expanded });\r\n }\r\n\r\n protected expandedRowId(index: number): string {\r\n return `${this.idPrefix}-detail-${index}`;\r\n }\r\n\r\n protected expandAriaLabel(row: T): string {\r\n const labels = this.effectiveLabels();\r\n return this.withRowIdentity(row, this.isExpanded(row) ? labels.collapseRow : labels.expandRow);\r\n }\r\n\r\n protected trackByRow = (_: number, row: T): unknown => row[this.rowKey()];\r\n\r\n /** `type: 'numeric'` açıkça `align` verilmemişse sağa yaslanır; diğer tüm kolonlar `col.align`'a düşer (varsayılan sol). */\r\n protected resolvedAlign(col: TableColumn<T>): 'left' | 'center' | 'right' {\r\n return col.align ?? (col.type === 'numeric' ? 'right' : 'left');\r\n }\r\n\r\n protected alignClass(align: 'left' | 'center' | 'right'): string {\r\n return align === 'center' ? 'text-center' : align === 'right' ? 'text-end' : 'text-start';\r\n }\r\n\r\n /** Kimlik kolonu (`primary`) `text-fg font-medium` — göz bir satırda tutunacak bir çapa buluyor; diğer her hücre `text-fg-muted` kalır (eskiden HER hücre aynı ağırlıktaydı). */\r\n protected cellClasses(col: TableColumn<T>): string {\r\n return cn(\r\n col.primary ? 'text-fg font-medium' : 'text-fg-muted',\r\n col.type === 'numeric' && 'tabular-nums',\r\n !col.cellTemplate && 'truncate',\r\n );\r\n }\r\n\r\n /** `[title]` (kesilmiş metin için native tooltip) ve boş/`null` değerleri güvenle metne çevirir — Angular şablonları global `String()`'e erişemiyor. */\r\n protected cellText(row: T, col: TableColumn<T>): string {\r\n const value = row[col.field];\r\n return value === null || value === undefined ? '' : String(value);\r\n }\r\n\r\n /** Satır checkbox'ının erişilebilir adı — kimlik kolonundan (`primary`, yoksa ilk kolon) türetilir, tüm satırların AYNI \"Select row\" metnini taşımasını önler. */\r\n protected rowSelectAriaLabel(row: T): string {\r\n return this.withRowIdentity(row, this.effectiveLabels().selectRowAriaLabel);\r\n }\r\n\r\n /** \"Etiket: kimlik\" — kimlik kolonundan (`primary`, yoksa ilk kolon) türetilir. */\r\n private withRowIdentity(row: T, label: string): string {\r\n const col = this.columns().find((c) => c.primary) ?? this.columns()[0];\r\n const value = col ? this.cellText(row, col) : '';\r\n return value ? `${label}: ${value}` : label;\r\n }\r\n\r\n /**\r\n * Bu tazelemenin imza motiflerinden \"ray\": seçili satırın sol kenarında\r\n * 2px'lik dolu marka rengi çizgi. Kenarlık HER ZAMAN vardır (`border-s-2\r\n * border-s-transparent`), sadece rengi değişir — eskiden kenarlık sadece\r\n * SEÇİLİYKEN ekleniyordu, `border-collapse: collapse` altında bu 2px\r\n * gerçek yer kaplıyor ve her tıklamada ilk hücrenin içeriği 2px kayıyordu\r\n * (gerçek layout bug'ı, tarayıcıda `getBoundingClientRect` ile doğrulandı).\r\n * `group/row`: sağdaki sabit aksiyon hücresinin hover rengini satırla\r\n * senkron tutmak için (bkz. stickyActionClasses).\r\n */\r\n protected rowClasses(row: T): string {\r\n const selected = this.isChecked(row);\r\n return cn(\r\n 'group/row border-b border-b-hairline border-s-2 transition-colors duration-fast ease-emphasis',\r\n selected\r\n ? 'border-s-accent-fill bg-primary-tint'\r\n : 'border-s-transparent hover:bg-state-hover',\r\n this.showStaleOverlay() && 'opacity-60',\r\n );\r\n }\r\n\r\n /**\r\n * Sabit (sticky) aksiyon hücresi için — `rowClasses()`'ın aksine `bg-primary-tint`\r\n * DOĞRUDAN kullanılamaz: bu hücre yatay kaydırmada AYNI satırın diğer\r\n * hücrelerinin ÜSTÜNÜ kapatıyor, saydam bir zemin altındaki kaydırılmış\r\n * içeriği sızdırırdı (gerçek bir composite hatası). Bunun yerine OPAK\r\n * `bg-surface` + üstüne tint rengiyle boyanmış bir `background-image`\r\n * gradyanı — iki katman üst üste bindiğinde görsel sonuç `bg-primary-tint`\r\n * ile BİREBİR aynı, ama alttan hiçbir şey sızmaz. `--mf-primary-tint`\r\n * (`--color-primary-tint` DEĞİL) — arbitrary value içindeki `var()`\r\n * referansları Tailwind'in \"@theme inline\" tarama/eleme sezgisine bağlı,\r\n * `--mf-*` rol katmanı KENDİSİ her zaman `@layer base`'de KOŞULSUZ yazılır\r\n * (bkz. `tabs.variants.ts`'teki aynı karar).\r\n */\r\n protected rowBg(row: T): string {\r\n return this.isChecked(row)\r\n ? 'bg-surface bg-[linear-gradient(var(--mf-primary-tint),var(--mf-primary-tint))]'\r\n : 'bg-surface group-hover/row:bg-surface-alt';\r\n }\r\n\r\n protected stickyActionClasses(row: T): string {\r\n return cn(\r\n 'sticky end-0 z-[1] border-s border-border text-end',\r\n this.bodyCellPad(),\r\n this.rowBg(row),\r\n );\r\n }\r\n\r\n /** `SearchInput` kendi debounce'unu zaten uyguladı — burada gelen değer commit edilmiş (nihai). */\r\n protected onSearchCommit(value: string): void {\r\n this.search.set(value);\r\n this.page.update((p) => ({ ...p, pageNumber: 1 }));\r\n this.emitQuery();\r\n }\r\n\r\n /**\r\n * Düz tık: bu alanı TEK sıralama kriteri yapar (zaten TEK/birincil kriterse\r\n * yön döngüsü asc→desc→yok). Shift+tık: İKİNCİL sıralama ekler/döndürür/\r\n * kaldırır — backend en fazla 3 alan kabul ediyor (`SortExpressionBuilder.\r\n * MaxSortFields`). Eskiden çoklu sıralama YOKTU (yeni Table'ın eski\r\n * `shared/components/data-table`'a göre kaybettiği iki yetenekten biri).\r\n */\r\n protected onSortClick(column: TableColumn<T>, event?: MouseEvent): void {\r\n if (!column.sortable) return;\r\n const current = this.sort();\r\n const index = current.findIndex((s) => s.field === column.field);\r\n\r\n if (!event?.shiftKey) {\r\n if (current.length === 1 && index === 0) {\r\n const next =\r\n current[0]!.direction === SortDirection.Ascending\r\n ? [{ field: column.field, direction: SortDirection.Descending }]\r\n : [];\r\n this.sort.set(next);\r\n } else {\r\n this.sort.set([{ field: column.field, direction: SortDirection.Ascending }]);\r\n }\r\n } else if (index === -1) {\r\n if (current.length >= 3) return;\r\n this.sort.set([...current, { field: column.field, direction: SortDirection.Ascending }]);\r\n } else {\r\n const entry = current[index]!;\r\n this.sort.set(\r\n entry.direction === SortDirection.Ascending\r\n ? current.map((s, i) => (i === index ? { ...s, direction: SortDirection.Descending } : s))\r\n : current.filter((_, i) => i !== index),\r\n );\r\n }\r\n this.emitQuery();\r\n }\r\n\r\n protected sortDirectionFor(field: string): SortDirection | null {\r\n return this.sort().find((s) => s.field === field)?.direction ?? null;\r\n }\r\n\r\n /** WAI-ARIA `aria-sort` — ekran okuyucu sütunun sıralama yönünü duyurur (yalnızca sıralanabilir sütunlarda). */\r\n protected ariaSortFor(field: string): 'ascending' | 'descending' | 'none' {\r\n const dir = this.sortDirectionFor(field);\r\n return dir === 0 ? 'ascending' : dir === 1 ? 'descending' : 'none';\r\n }\r\n\r\n /** 1 tabanlı sıra konumu — yalnızca 2+ alan aktifken gösterilir (tekil sıralamada numara gürültü olurdu). */\r\n protected sortOrderFor(field: string): number | null {\r\n if (this.sort().length < 2) return null;\r\n const index = this.sort().findIndex((s) => s.field === field);\r\n return index === -1 ? null : index + 1;\r\n }\r\n\r\n protected onFiltersChange(filters: AppliedFilter[]): void {\r\n this.filters.set(filters);\r\n this.page.update((p) => ({ ...p, pageNumber: 1 }));\r\n this.emitQuery();\r\n }\r\n\r\n protected onFilterLogicChange(logic: FilterLogic): void {\r\n this.filterLogic.set(logic);\r\n if (this.filters().length > 1) this.emitQuery();\r\n }\r\n\r\n protected clearAllFilters(): void {\r\n this.search.set('');\r\n this.filters.set([]);\r\n this.page.update((p) => ({ ...p, pageNumber: 1 }));\r\n this.emitQuery();\r\n }\r\n\r\n protected onPageChange(page: number): void {\r\n this.page.update((p) => ({ ...p, pageNumber: page }));\r\n this.emitQuery();\r\n }\r\n\r\n protected onPageSizeChange(size: number): void {\r\n this.page.set({ pageNumber: 1, pageSize: size });\r\n this.emitQuery();\r\n }\r\n\r\n protected toggleDensity(): void {\r\n this.density.update((d) => (d === 'comfortable' ? 'compact' : 'comfortable'));\r\n }\r\n\r\n protected densityToggleTooltip(): string {\r\n const labels = this.effectiveLabels();\r\n return `${labels.density}: ${this.density() === 'comfortable' ? labels.densityCompact : labels.densityComfortable}`;\r\n }\r\n\r\n protected onHiddenColumnsChange(hidden: ReadonlySet<string>): void {\r\n this.hiddenColumns.set(new Set(hidden));\r\n }\r\n\r\n protected isChecked(row: T): boolean {\r\n return this.selectedRows().has(row[this.rowKey()]);\r\n }\r\n\r\n protected onCheckAll(checked: boolean): void {\r\n const next = new Map<unknown, T>();\r\n if (checked) for (const row of this.rows()) next.set(row[this.rowKey()], row);\r\n this.selectedRows.set(next);\r\n this.selectionChange.emit([...next.values()]);\r\n }\r\n\r\n protected onCheckRow(row: T, checked: boolean): void {\r\n const next = new Map(this.selectedRows());\r\n if (checked) next.set(row[this.rowKey()], row);\r\n else next.delete(row[this.rowKey()]);\r\n this.selectedRows.set(next);\r\n this.selectionChange.emit([...next.values()]);\r\n }\r\n\r\n protected clearSelection(): void {\r\n this.selectedRows.set(new Map());\r\n this.selectionChange.emit([]);\r\n }\r\n\r\n private buildFilter(): FilterGroup | undefined {\r\n const term = this.search().trim();\r\n const searchGroup = term ? this.searchGroupFor(term) : undefined;\r\n const chipGroup = buildFilterGroup(this.filters(), this.filterLogic());\r\n\r\n if (searchGroup && chipGroup)\r\n return { logic: FilterLogic.And, groups: [searchGroup, chipGroup] };\r\n return searchGroup ?? chipGroup;\r\n }\r\n\r\n private searchGroupFor(term: string): FilterGroup | undefined {\r\n const fields = this.columns()\r\n .filter((c) => c.searchable)\r\n .map((c) => c.field);\r\n if (!fields.length) return undefined;\r\n return {\r\n logic: FilterLogic.Or,\r\n conditions: fields.map((field) => ({\r\n field,\r\n operator: FilterOperator.Contains,\r\n value: term,\r\n })),\r\n };\r\n }\r\n\r\n private emitQuery(): void {\r\n if (this.clientSide()) return;\r\n this.queryChange.emit(\r\n canonicalPagedRequest({\r\n page: this.page(),\r\n sort: this.sort(),\r\n filter: this.buildFilter(),\r\n }),\r\n );\r\n }\r\n}\r\n","<div class=\"relative overflow-hidden rounded-lg border border-hairline bg-surface\">\r\n @if (showStaleOverlay()) {\r\n <div\r\n class=\"pointer-events-none absolute inset-x-0 top-0 z-20 h-0.5 overflow-hidden bg-primary-tint\"\r\n aria-hidden=\"true\"\r\n >\r\n <div class=\"h-full w-1/4 animate-progress-slide bg-accent-fill\"></div>\r\n </div>\r\n }\r\n\r\n <!--\r\n Satır 1 — toolbar. Seçim modunda da AYNI kalır: eskiden bir satır\r\n seçilince başlık+arama+filtre tamamen kaybolup yerine \"N seçildi\"\r\n geliyordu (gerçek bug, kullanıcı arama/filtre bağlamını kaybediyordu).\r\n Artık sadece Satır 2 (aşağıda) seçim aksiyonlarına devrediliyor.\r\n -->\r\n <div class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3\">\r\n <div class=\"flex min-w-0 items-center gap-2.5\">\r\n @if (title()) {\r\n <h3 class=\"truncate font-display text-title text-fg\">{{ title() }}</h3>\r\n }\r\n </div>\r\n\r\n <div class=\"flex flex-1 flex-wrap items-center justify-end gap-2\">\r\n @if (searchable()) {\r\n <mf-search-input\r\n [collapsible]=\"false\"\r\n [value]=\"search()\"\r\n [placeholder]=\"effectiveLabels().searchPlaceholder\"\r\n [ariaLabel]=\"effectiveLabels().searchPlaceholder\"\r\n [loading]=\"loading()\"\r\n (valueChange)=\"onSearchCommit($event)\"\r\n />\r\n }\r\n\r\n <!-- Kolonlar + Yoğunluk: BİLEREK hayalet (text/icon) kalıyor — göz [tableActions]'daki gerçek CTA'ya gitsin diye (bkz. table.ts sınıf yorumu, toolbar hiyerarşisi bulgusu). -->\r\n <div class=\"flex items-center gap-0.5\">\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n cdkOverlayOrigin\r\n #columnsOrigin=\"cdkOverlayOrigin\"\r\n [mfTooltip]=\"effectiveLabels().columns\"\r\n [attr.aria-label]=\"effectiveLabels().columns\"\r\n (click)=\"columnsMenuOpen.set(!columnsMenuOpen())\"\r\n >\r\n <span mfIcon [size]=\"18\">view_column</span>\r\n </button>\r\n <mf-table-columns-menu\r\n [columns]=\"columns()\"\r\n [hidden]=\"hiddenColumns()\"\r\n [origin]=\"columnsOrigin\"\r\n [open]=\"columnsMenuOpen()\"\r\n [label]=\"effectiveLabels().columns\"\r\n (hiddenChange)=\"onHiddenColumnsChange($event)\"\r\n (closed)=\"columnsMenuOpen.set(false)\"\r\n />\r\n\r\n <button\r\n mfButton\r\n tone=\"neutral\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [mfTooltip]=\"densityToggleTooltip()\"\r\n [attr.aria-label]=\"densityToggleTooltip()\"\r\n (click)=\"toggleDensity()\"\r\n >\r\n <span mfIcon [size]=\"18\">{{\r\n density() === 'comfortable' ? 'density_medium' : 'density_small'\r\n }}</span>\r\n </button>\r\n </div>\r\n\r\n <ng-content select=\"[tableActions]\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Satır 2 — ya filtre çubuğu ya seçim çubuğu, ASLA ikisi birden. -->\r\n @if (selectedCount() > 0) {\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-3 border-b border-border bg-surface-sunken px-4 py-2\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex items-center justify-center appearance-none border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:text-fg\"\r\n [attr.aria-label]=\"effectiveLabels().clearSelection\"\r\n (click)=\"clearSelection()\"\r\n >\r\n <span mfIcon [size]=\"18\">close</span>\r\n </button>\r\n <span class=\"text-sm font-medium text-fg-muted tabular-nums\"\r\n >{{ selectedCount() }} {{ effectiveLabels().selectedCount }}</span\r\n >\r\n </div>\r\n <div class=\"flex items-center gap-2\">\r\n <ng-content select=\"[tableBulkActions]\" />\r\n @if (activeFilterCount() > 0) {\r\n <span\r\n class=\"inline-flex items-center gap-1 rounded-full bg-surface-alt px-2 py-0.5 text-xs text-fg-subtle\"\r\n >\r\n <span mfIcon [size]=\"12\">filter_list</span>\r\n {{ activeFilterCount() }} {{ effectiveLabels().filterCount }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n } @else if (hasFilterableColumns()) {\r\n <mf-table-filter-bar\r\n [columns]=\"columns()\"\r\n [filters]=\"filters()\"\r\n [logic]=\"filterLogic()\"\r\n [labels]=\"effectiveLabels().filter\"\r\n (filtersChange)=\"onFiltersChange($event)\"\r\n (logicChange)=\"onFilterLogicChange($event)\"\r\n />\r\n }\r\n\r\n <div\r\n #scroller\r\n [class]=\"scrollWrapperClasses()\"\r\n [style.max-height]=\"virtual() ? virtualHeight() : null\"\r\n (scroll)=\"onScroll($event)\"\r\n >\r\n <table\r\n [class]=\"cn('border-collapse text-sm', fixedLayout() ? 'min-w-full table-fixed' : 'w-full')\"\r\n [style.width.px]=\"tableWidth()\"\r\n [attr.aria-rowcount]=\"virtual() ? rows().length + 1 : null\"\r\n >\r\n <thead\r\n [class]=\"\r\n cn(\r\n 'bg-surface-sunken',\r\n isStickyHeader() ? 'sticky top-0 z-10 border-b border-border-strong' : ''\r\n )\r\n \"\r\n >\r\n <tr class=\"border-b border-hairline\" [attr.aria-rowindex]=\"virtual() ? 1 : null\">\r\n @if (selectable()) {\r\n <th\r\n data-pin=\"__select\"\r\n [class]=\"cn('w-10 px-4', headerCellPad(), pinHeadClasses('__select'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"allChecked()\"\r\n [indeterminate]=\"indeterminate()\"\r\n [attr.aria-label]=\"effectiveLabels().selectAllAriaLabel\"\r\n (change)=\"onCheckAll($any($event.target).checked)\"\r\n />\r\n </th>\r\n }\r\n @if (expandable()) {\r\n <th\r\n data-pin=\"__expand\"\r\n [class]=\"cn('w-10 px-1.5', headerCellPad(), pinHeadClasses('__expand'))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <span class=\"sr-only\">{{ effectiveLabels().expandRow }}</span>\r\n </th>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <th\r\n [attr.data-col]=\"col.field\"\r\n [attr.aria-sort]=\"col.sortable ? ariaSortFor(col.field) : null\"\r\n [attr.data-pin]=\"col.pinned === 'left' ? col.field : null\"\r\n [class]=\"\r\n cn(\r\n 'group/th relative truncate px-4 text-eyebrow text-fg-subtle',\r\n headerCellPad(),\r\n alignClass(resolvedAlign(col)),\r\n pinHeadClasses(col.field)\r\n )\r\n \"\r\n [style.width]=\"widthStyle(col)\"\r\n [style.min-width.px]=\"col.minWidth ?? null\"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n >\r\n @if (col.sortable) {\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex appearance-none items-center gap-1 rounded-xs border-0 bg-transparent p-0 transition-colors duration-fast ease-emphasis hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n (click)=\"onSortClick(col, $event)\"\r\n >\r\n <span>{{ col.header }}</span>\r\n @if (sortOrderFor(col.field); as order) {\r\n <span class=\"text-caption font-bold text-accent tabular-nums\">{{ order }}</span>\r\n }\r\n <span\r\n mfIcon\r\n [size]=\"14\"\r\n [class]=\"\r\n sortDirectionFor(col.field) !== null\r\n ? 'text-accent'\r\n : 'text-fg-subtle opacity-0 transition-opacity duration-fast group-hover/th:opacity-100'\r\n \"\r\n >\r\n @switch (sortDirectionFor(col.field)) {\r\n @case (0) {\r\n arrow_upward\r\n }\r\n @case (1) {\r\n arrow_downward\r\n }\r\n @default {\r\n unfold_more\r\n }\r\n }\r\n </span>\r\n </button>\r\n } @else {\r\n <span>{{ col.header }}</span>\r\n }\r\n @if (isResizable(col)) {\r\n <span\r\n mfTableResizeHandle\r\n [label]=\"resizeAriaLabel(col)\"\r\n [width]=\"currentWidth(col)\"\r\n [min]=\"col.minWidth ?? 80\"\r\n (resizeStart)=\"freezeWidths()\"\r\n (widthChange)=\"onColumnResize(col, $event)\"\r\n (autofit)=\"autofitColumn(col)\"\r\n ></span>\r\n }\r\n </th>\r\n }\r\n @if (hasRowActions()) {\r\n <th [class]=\"cn('sticky end-0 z-[1] w-20 bg-surface-sunken px-4', headerCellPad())\">\r\n <span class=\"sr-only\">{{ effectiveLabels().actionsColumnLabel }}</span>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (showSkeleton()) {\r\n @for (i of skeletonIndexes(); track i) {\r\n <tr class=\"border-b border-hairline\">\r\n @if (selectable()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"><div mfSkeleton class=\"h-4 w-4\"></div></td>\r\n }\r\n @if (expandable()) {\r\n <td [class]=\"cn('px-1.5', bodyCellPad())\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\">\r\n <div mfSkeleton class=\"h-4 w-full max-w-[10rem]\"></div>\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"cn('px-4', bodyCellPad())\"></td>\r\n }\r\n </tr>\r\n }\r\n } @else if (rows().length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columnSpan()\" class=\"px-4 py-6\">\r\n <mf-empty-state\r\n class=\"block\"\r\n [title]=\"\r\n isFiltered() ? effectiveLabels().noResultsTitle : effectiveLabels().emptyTitle\r\n \"\r\n [description]=\"\r\n isFiltered()\r\n ? effectiveLabels().noResultsDescription\r\n : effectiveLabels().emptyDescription\r\n \"\r\n >\r\n <span icon mfIcon [size]=\"28\">{{ isFiltered() ? 'search_off' : 'inbox' }}</span>\r\n @if (isFiltered()) {\r\n <button\r\n action\r\n mfButton\r\n appearance=\"text\"\r\n tone=\"primary\"\r\n type=\"button\"\r\n (click)=\"clearAllFilters()\"\r\n >\r\n {{ effectiveLabels().clearFilters }}\r\n </button>\r\n }\r\n </mf-empty-state>\r\n </td>\r\n </tr>\r\n } @else {\r\n @if (virtualRange(); as range) {\r\n @if (range.top > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.top\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n @for (row of displayRows(); track trackByRow($index, row)) {\r\n <tr\r\n data-row\r\n [class]=\"rowClasses(row)\"\r\n [attr.aria-rowindex]=\"virtual() ? rowIndexOffset() + $index + 2 : null\"\r\n (dblclick)=\"rowDblClick.emit(row)\"\r\n >\r\n @if (selectable()) {\r\n <td\r\n [class]=\"cn('px-4', bodyCellPad(), pinBodyClasses('__select', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__select')\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n mfCheckbox\r\n [checked]=\"isChecked(row)\"\r\n [attr.aria-label]=\"rowSelectAriaLabel(row)\"\r\n (change)=\"onCheckRow(row, $any($event.target).checked)\"\r\n />\r\n </td>\r\n }\r\n @if (expandable()) {\r\n <td\r\n [class]=\"cn('px-1.5', bodyCellPad(), pinBodyClasses('__expand', row))\"\r\n [style.inset-inline-start.px]=\"pinStart('__expand')\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"inline-flex size-7 appearance-none items-center justify-center rounded-md border-0 bg-transparent p-0 text-fg-subtle transition-colors duration-fast ease-emphasis hover:bg-state-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus-ring\"\r\n [attr.aria-expanded]=\"isExpanded(row)\"\r\n [attr.aria-controls]=\"isExpanded(row) ? expandedRowId($index) : null\"\r\n [attr.aria-label]=\"expandAriaLabel(row)\"\r\n (click)=\"toggleExpanded(row)\"\r\n >\r\n <span\r\n mfIcon\r\n [size]=\"18\"\r\n class=\"transition-transform duration-base ease-emphasis rtl:-scale-x-100\"\r\n [class.rotate-90]=\"isExpanded(row)\"\r\n [class.rtl:-rotate-90]=\"isExpanded(row)\"\r\n >chevron_right</span\r\n >\r\n </button>\r\n </td>\r\n }\r\n @for (col of visibleColumns(); track col.field) {\r\n <td\r\n [attr.data-col]=\"col.field\"\r\n [class]=\"\r\n cn(\r\n 'max-w-0 px-4',\r\n bodyCellPad(),\r\n cellClasses(col),\r\n alignClass(resolvedAlign(col)),\r\n pinBodyClasses(col.field, row)\r\n )\r\n \"\r\n [style.inset-inline-start.px]=\"pinStart(col.field)\"\r\n [title]=\"!col.cellTemplate ? cellText(row, col) : null\"\r\n >\r\n @if (col.cellTemplate) {\r\n <ng-container\r\n *ngTemplateOutlet=\"col.cellTemplate; context: { $implicit: row }\"\r\n />\r\n } @else {\r\n <span>{{ row[col.field] }}</span>\r\n }\r\n </td>\r\n }\r\n @if (hasRowActions()) {\r\n <td [class]=\"stickyActionClasses(row)\">\r\n <div\r\n class=\"flex items-center justify-end gap-1 opacity-100 [@media(hover:hover)]:opacity-0 [@media(hover:hover)]:group-hover/row:opacity-100 group-focus-within/row:opacity-100\"\r\n >\r\n @if (rowActions().edit) {\r\n <!--\r\n `tone=\"info\"` (mavi) BİLEREK `neutral` DEĞİL — satır\r\n hover'ı zaten `bg-surface-alt` boyuyor (bkz. rowBg()),\r\n `neutral`'ın kendi `hover:bg-state-hover`'ı AYNI renk\r\n olduğundan buton üzerine gelince görsel hiçbir şey\r\n değişmiyordu (gerçek kullanıcı bulgusu). Delete'in\r\n `danger` (kırmızı ton) hover'ı bu sorunu yaşamıyordu —\r\n aynı mantık: Edit'e de arka planla çakışmayan kendi\r\n renk tonu (mavi `info/5`) verildi.\r\n -->\r\n <button\r\n mfButton\r\n tone=\"info\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().edit\"\r\n [mfTooltip]=\"effectiveLabels().edit\"\r\n (click)=\"edit.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">edit</span>\r\n </button>\r\n }\r\n @if (rowActions().delete) {\r\n <button\r\n mfButton\r\n tone=\"danger\"\r\n appearance=\"text\"\r\n size=\"icon\"\r\n shape=\"square\"\r\n type=\"button\"\r\n [attr.aria-label]=\"effectiveLabels().delete\"\r\n [mfTooltip]=\"effectiveLabels().delete\"\r\n (click)=\"delete.emit(row)\"\r\n >\r\n <span mfIcon [size]=\"18\">delete</span>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n }\r\n </tr>\r\n @if (expandable() && isExpanded(row)) {\r\n <tr [id]=\"expandedRowId($index)\" class=\"border-b border-b-hairline bg-surface-sunken\">\r\n <td [attr.colspan]=\"columnSpan()\" class=\"p-0\">\r\n <!-- Yatay kaydırmada ayrıntı görünür alanda sabit kalır (tablo genişliğiyle kaymaz). -->\r\n <div\r\n class=\"sticky start-0 box-border px-4 py-3\"\r\n [style.width.px]=\"viewportWidth() || null\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"expandedRowTemplate()!; context: { $implicit: row }\"\r\n />\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n @if (virtualRange(); as range) {\r\n @if (range.bottom > 0) {\r\n <tr aria-hidden=\"true\">\r\n <td\r\n class=\"border-0 p-0\"\r\n [attr.colspan]=\"columnSpan()\"\r\n [style.height.px]=\"range.bottom\"\r\n ></td>\r\n </tr>\r\n }\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div class=\"border-t border-border bg-surface-sunken\">\r\n @if (virtual()) {\r\n <p class=\"px-4 py-2.5 text-sm text-fg-muted tabular-nums\">\r\n {{ rowsTotal() }} {{ effectiveLabels().pagination.records }}\r\n </p>\r\n } @else {\r\n <mf-table-pagination\r\n [page]=\"page().pageNumber\"\r\n [pageSize]=\"page().pageSize\"\r\n [total]=\"rowsTotal()\"\r\n [pageSizeOptions]=\"pageSizeOptions()\"\r\n [labels]=\"effectiveLabels().pagination\"\r\n (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["operatorLabelFor"],"mappings":"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"}