@ynput/ayon-frontend-shared 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/dist/ProjectTreeTable.cjs.js +1 -1
  2. package/dist/ProjectTreeTable.es.js +247 -243
  3. package/dist/_virtual/index.cjs22.js +1 -1
  4. package/dist/_virtual/index.cjs23.js +1 -1
  5. package/dist/_virtual/index.cjs24.js +1 -1
  6. package/dist/_virtual/index.cjs4.js +1 -1
  7. package/dist/_virtual/index.cjs5.js +1 -1
  8. package/dist/_virtual/index.cjs6.js +1 -1
  9. package/dist/_virtual/index.cjs8.js +1 -1
  10. package/dist/_virtual/index.es22.js +3 -3
  11. package/dist/_virtual/index.es23.js +5 -5
  12. package/dist/_virtual/index.es24.js +5 -5
  13. package/dist/_virtual/index.es4.js +2 -5
  14. package/dist/_virtual/index.es4.js.map +1 -1
  15. package/dist/_virtual/index.es5.js +5 -2
  16. package/dist/_virtual/index.es5.js.map +1 -1
  17. package/dist/_virtual/index.es6.js +2 -2
  18. package/dist/_virtual/index.es8.js +2 -2
  19. package/dist/api.cjs.js +1 -1
  20. package/dist/api.es.js +446 -445
  21. package/dist/index.cjs.js +1 -1
  22. package/dist/index.es.js +20 -9
  23. package/dist/index.es.js.map +1 -1
  24. package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
  25. package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
  26. package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
  27. package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
  28. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
  29. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  30. package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
  31. package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
  32. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  33. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  34. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  35. package/dist/node_modules/remove-accents/index.es.js +1 -1
  36. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
  37. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
  38. package/dist/shared/node_modules/@module-federation/runtime/dist/index.cjs.js +1 -1
  39. package/dist/shared/node_modules/@module-federation/runtime/dist/index.es.js +1 -1
  40. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
  41. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
  42. package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
  43. package/dist/shared/node_modules/react-is/index.es.js +1 -1
  44. package/dist/shared/src/api/generated/graphql.cjs.js +85 -28
  45. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  46. package/dist/shared/src/api/generated/graphql.es.js +129 -68
  47. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  48. package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js +1 -1
  49. package/dist/shared/src/api/queries/columnStats/metricTargets.cjs.js.map +1 -1
  50. package/dist/shared/src/api/queries/columnStats/metricTargets.es.js +36 -36
  51. package/dist/shared/src/api/queries/columnStats/metricTargets.es.js.map +1 -1
  52. package/dist/shared/src/components/Chips/Chips.cjs.js +12 -6
  53. package/dist/shared/src/components/Chips/Chips.cjs.js.map +1 -1
  54. package/dist/shared/src/components/Chips/Chips.es.js +69 -62
  55. package/dist/shared/src/components/Chips/Chips.es.js.map +1 -1
  56. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
  57. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
  58. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +32 -12
  59. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
  60. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +2 -2
  61. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
  62. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +33 -33
  63. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
  64. package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
  65. package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
  66. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js +1 -1
  67. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.cjs.js.map +1 -1
  68. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js +39 -8
  69. package/dist/shared/src/components/SubtasksManager/SubtasksManagerWrapper.es.js.map +1 -1
  70. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  71. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  72. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +32 -31
  73. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  74. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.cjs.js.map +1 -1
  75. package/dist/shared/src/containers/DetailsPanel/containers/FeedWrapper.es.js.map +1 -1
  76. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js +1 -1
  77. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.cjs.js.map +1 -1
  78. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js +24 -18
  79. package/dist/shared/src/containers/Feed/helpers/buildBackendFilter.es.js.map +1 -1
  80. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js +1 -1
  81. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.cjs.js.map +1 -1
  82. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js +26 -25
  83. package/dist/shared/src/containers/Feed/helpers/feedFilterAdapter.es.js.map +1 -1
  84. package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js +1 -1
  85. package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js.map +1 -1
  86. package/dist/shared/src/containers/ListTable/ListTableCell.es.js +14 -2
  87. package/dist/shared/src/containers/ListTable/ListTableCell.es.js.map +1 -1
  88. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
  89. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  90. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +125 -126
  91. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  92. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +6 -0
  93. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
  94. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +14 -8
  95. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
  96. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  97. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  98. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +200 -178
  99. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  100. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
  101. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
  102. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +14 -3
  103. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
  104. package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js +1 -1
  105. package/dist/shared/src/containers/ProjectTreeTable/constants.cjs.js.map +1 -1
  106. package/dist/shared/src/containers/ProjectTreeTable/constants.es.js +6 -3
  107. package/dist/shared/src/containers/ProjectTreeTable/constants.es.js.map +1 -1
  108. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js +1 -1
  109. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js.map +1 -1
  110. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js +19 -19
  111. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js.map +1 -1
  112. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +5 -3
  113. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
  114. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +100 -97
  115. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
  116. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +9 -1
  117. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
  118. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +47 -31
  119. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
  120. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +28 -9
  121. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
  122. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +58 -39
  123. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
  124. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +53 -25
  125. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -1
  126. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +150 -103
  127. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -1
  128. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js +9 -2
  129. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js.map +1 -1
  130. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js +66 -57
  131. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js.map +1 -1
  132. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
  133. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
  134. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +9 -8
  135. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
  136. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js +20 -4
  137. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.cjs.js.map +1 -1
  138. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js +86 -67
  139. package/dist/shared/src/containers/ProjectTreeTable/widgets/TextWidget.es.js.map +1 -1
  140. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js +6 -0
  141. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.cjs.js.map +1 -0
  142. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js +11 -0
  143. package/dist/shared/src/containers/ProjectTreeTable/widgets/wrapMode.es.js.map +1 -0
  144. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
  145. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
  146. package/dist/shared/src/containers/Views/context/ViewsContext.es.js +67 -62
  147. package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
  148. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +1 -1
  149. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -1
  150. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js +47 -46
  151. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -1
  152. package/dist/shared/src/context/ProjectContext.cjs.js +1 -1
  153. package/dist/shared/src/context/ProjectContext.cjs.js.map +1 -1
  154. package/dist/shared/src/context/ProjectContext.es.js +1 -1
  155. package/dist/shared/src/context/ProjectContext.es.js.map +1 -1
  156. package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js +1 -1
  157. package/dist/shared/src/util/buildHierarchicalTableRows.cjs.js.map +1 -1
  158. package/dist/shared/src/util/buildHierarchicalTableRows.es.js +36 -33
  159. package/dist/shared/src/util/buildHierarchicalTableRows.es.js.map +1 -1
  160. package/dist/types/api/generated/graphql.d.ts +71 -0
  161. package/dist/types/api/queries/activities/getActivities.d.ts +28 -0
  162. package/dist/types/api/queries/entities/getEntity.d.ts +14 -0
  163. package/dist/types/api/queries/entities/getEntityPanel.d.ts +14 -0
  164. package/dist/types/api/queries/entities/updateEntity.d.ts +14 -0
  165. package/dist/types/api/queries/entityLists/getLists.d.ts +14 -0
  166. package/dist/types/api/queries/overview/getOverview.d.ts +14 -0
  167. package/dist/types/api/queries/project/getProject.d.ts +14 -0
  168. package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +14 -0
  169. package/dist/types/api/queries/users/getUsers.d.ts +14 -0
  170. package/dist/types/api/queries/versions/getVersionsProducts.d.ts +28 -0
  171. package/dist/types/components/SubtasksManager/SubtasksManagerWrapper.d.ts +4 -1
  172. package/dist/types/containers/Feed/helpers/buildBackendFilter.d.ts +1 -0
  173. package/dist/types/containers/ProjectTreeTable/buildTreeTableColumns.d.ts +1 -0
  174. package/dist/types/containers/ProjectTreeTable/constants.d.ts +3 -0
  175. package/dist/types/containers/ProjectTreeTable/widgets/SubtasksWidget.d.ts +1 -0
  176. package/dist/types/containers/ProjectTreeTable/widgets/wrapMode.d.ts +2 -0
  177. package/dist/types/containers/Views/context/ViewsContext.d.ts +1 -0
  178. package/dist/types/util/buildHierarchicalTableRows.d.ts +2 -0
  179. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"buildTreeTableColumns.cjs.js","sources":["../../../../../src/containers/ProjectTreeTable/buildTreeTableColumns.tsx"],"sourcesContent":["import { ColumnDef, FilterFnOption, Row, SortingFn, sortingFns } from '@tanstack/react-table'\nimport { TableRow } from './types/table'\nimport { ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport {\n CellWidget,\n EntityWidget,\n MetaWidget,\n EntityNameWidget,\n GroupHeaderWidget,\n ThumbnailWidget,\n} from './widgets'\nimport { getCellId, getCellValue, parseCellId } from './utils/cellUtils'\nimport { LinkColumnHeader, TableCellContent } from './ProjectTreeTable.styled'\nimport clsx from 'clsx'\nimport { SelectionCell } from './components/SelectionCell'\nimport RowSelectionHeader from './components/RowSelectionHeader'\nimport { TableGroupBy, useCellEditing, useColumnSettingsContext } from './context'\nimport { ROW_SELECTION_COLUMN_ID } from './constants'\nimport { NEXT_PAGE_ID, parseGroupId } from './hooks/useBuildGroupByTableData'\nimport LoadMoreWidget from './widgets/LoadMoreWidget'\nimport type { AttributeData, LinkTypeModel } from '@shared/api'\nimport { LinkWidgetData } from './widgets/LinksWidget'\nimport { SubtasksWidgetData } from './widgets/SubtasksWidget'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { getEntityTypeIcon } from '@shared/util'\nimport type { NameWidgetData } from '@shared/components/RenameForm/RenameForm'\nimport { isEntityRestricted, READ_ONLY } from './utils/restrictedEntity'\nimport { getColumnDisplayConfig } from './types/columnConfig'\nimport { ENTITY_COLUMN_IDS, normalizeColumnId } from './utils/columnIds'\nimport { upperFirst } from 'lodash'\n\nexport const isEntityExpandable = (entityType: string) => ['folder', 'product'].includes(entityType)\n\nexport const COLUMN_MIN_SIZE = 50\n\nexport const COLUMN_LABELS: Record<string, string> = {\n thumbnail: 'Thumbnail',\n status: 'Status',\n entityType: 'Entity type',\n subType: 'Type',\n productType: 'Product type',\n assignees: 'Assignees',\n folder_entity: 'Folder',\n task_entity: 'Task',\n author: 'Author',\n version: 'Version number',\n version_entity: 'Version',\n product: 'Product name',\n productBaseType: 'Base type',\n taskType: 'Task type',\n folderType: 'Folder type',\n tags: 'Tags',\n createdAt: 'Created at',\n updatedAt: 'Updated at',\n subtasks: 'Subtasks',\n comments: 'Latest comments',\n}\n\nexport const getColumnLabel = (columnId: string, scopes: string[] = []) => {\n if (columnId === 'subType' && scopes.some((scope) => ['product', 'version'].includes(scope))) {\n return 'Product type'\n }\n return COLUMN_LABELS[normalizeColumnId(columnId)] || columnId\n}\n\ntype ColumnSortConfig = {\n sortKey?: string\n sortDescFirst?: boolean\n enabled: boolean\n label: string\n scopes?: string[]\n}\n\n// TanStack column IDs are also used by the UI state. Keep API sort keys here\n// so a column can use a different identifier without leaking that detail into\n// the table state.\nexport const COLUMN_SORT_CONFIG: Record<string, ColumnSortConfig> = {\n thumbnail: { enabled: false, label: COLUMN_LABELS.thumbnail },\n name: { sortKey: 'name', enabled: true, label: 'Name' },\n entityType: { enabled: false, label: COLUMN_LABELS.entityType },\n status: { sortKey: 'status', sortDescFirst: false, enabled: true, label: COLUMN_LABELS.status },\n assignees: {\n sortKey: 'assignees',\n enabled: true,\n label: COLUMN_LABELS.assignees,\n scopes: ['task'],\n },\n folder_entity: {\n sortKey: 'folderName',\n sortDescFirst: false,\n enabled: true,\n label: COLUMN_LABELS.folder_entity,\n },\n task_entity: {\n sortKey: 'taskName',\n enabled: false,\n label: COLUMN_LABELS.task_entity,\n scopes: ['version', 'product'],\n },\n author: {\n sortKey: 'author',\n enabled: true,\n label: COLUMN_LABELS.author,\n scopes: ['version', 'product'],\n },\n version: {\n sortKey: 'version',\n sortDescFirst: true,\n enabled: true,\n label: COLUMN_LABELS.version,\n scopes: ['version', 'product'],\n },\n version_entity: {\n sortKey: 'version',\n enabled: true,\n label: COLUMN_LABELS.version_entity,\n scopes: ['version', 'product'],\n },\n product: {\n sortKey: 'product',\n enabled: true,\n label: COLUMN_LABELS.product,\n scopes: ['version', 'product'],\n },\n productBaseType: {\n sortKey: 'productBaseType',\n enabled: true,\n label: COLUMN_LABELS.productBaseType,\n scopes: ['version', 'product'],\n },\n taskType: {\n sortKey: 'taskType',\n sortDescFirst: true,\n enabled: true,\n label: COLUMN_LABELS.taskType,\n scopes: ['version', 'product'],\n },\n folderType: {\n sortKey: 'folderType',\n enabled: true,\n label: COLUMN_LABELS.folderType,\n scopes: ['version', 'product'],\n },\n productType: {\n sortKey: 'productType',\n enabled: true,\n label: COLUMN_LABELS.productType,\n scopes: ['version', 'product'],\n },\n tags: { sortKey: 'tags', enabled: true, label: COLUMN_LABELS.tags },\n createdAt: { sortKey: 'createdAt', enabled: true, label: COLUMN_LABELS.createdAt },\n updatedAt: { sortKey: 'updatedAt', enabled: true, label: COLUMN_LABELS.updatedAt },\n subtasks: { enabled: false, label: COLUMN_LABELS.subtasks },\n comments: { enabled: false, label: COLUMN_LABELS.comments },\n}\n\ntype SortColumnLabel = { value: string; label: string }\n\nexport const getSortableColumnOptions = (scopes?: string[], columns: SortColumnLabel[] = []) =>\n Object.entries(COLUMN_SORT_CONFIG)\n .filter(\n ([, config]) =>\n config.enabled &&\n (!config.scopes || !scopes || config.scopes.some((scope) => scopes.includes(scope))),\n )\n .map(([id, config]) => ({\n id,\n label:\n columns.find((column) => normalizeColumnId(column.value) === id)?.label ||\n getColumnLabel(id, scopes),\n }))\n\nexport const isColumnSortable = (columnId: string) =>\n COLUMN_SORT_CONFIG[normalizeColumnId(columnId)]?.enabled ?? !columnId.startsWith('link_')\n\nexport const getColumnSortKey = (columnId?: string, showHierarchy = true, entityType?: string) => {\n if (!columnId) return undefined\n const normalizedColumnId = normalizeColumnId(columnId)\n if (normalizedColumnId === 'name' && !showHierarchy) return 'path'\n if (normalizedColumnId === 'subType') {\n if (entityType === 'folder') return 'folderType'\n if (entityType === 'product' || entityType === 'version') return 'productType'\n if (entityType === 'task') return 'taskType'\n }\n return COLUMN_SORT_CONFIG[normalizedColumnId]?.sortKey ?? normalizedColumnId\n}\n\n// Wrapper function for sorting that pushes isLoading rows to the bottom\nconst withLoadingStateSort = (sortFn: SortingFn<any>): SortingFn<any> => {\n return (rowA, rowB, ...args) => {\n // If row loading states differ, prioritize non-loading rows\n if (rowA.original.isLoading !== rowB.original.isLoading) {\n return rowA.original.isLoading ? 1 : -1\n }\n // Otherwise, use the original sort function\n return sortFn(rowA, rowB, ...args)\n }\n}\n\nconst naturalSortCollator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' })\n\nconst withNameTieBreaker = (sortFn: SortingFn<any>): SortingFn<any> => {\n return (rowA, rowB, ...args) => {\n const result = sortFn(rowA, rowB, ...args)\n if (result !== 0) return result\n const labelA = rowA.original.label || rowA.original.name || ''\n const labelB = rowB.original.label || rowB.original.name || ''\n return naturalSortCollator.compare(labelA, labelB)\n }\n}\n\nconst pathSort: SortingFn<any> = (rowA, rowB) => {\n const labelA = rowA.original.label || rowA.original.path || rowA.original.name || ''\n const labelB = rowB.original.label || rowB.original.path || rowB.original.name || ''\n return naturalSortCollator.compare(labelA, labelB)\n}\n\nconst valueLengthSort: SortingFn<any> = (rowA, rowB, columnId) => {\n const valueA = getCellValue(rowA.original, columnId)\n const valueB = getCellValue(rowB.original, columnId)\n const lengthA = Array.isArray(valueA) ? valueA.length : valueA ? String(valueA).length : 0\n const lengthB = Array.isArray(valueB) ? valueB.length : valueB ? String(valueB).length : 0\n return lengthA - lengthB\n}\n\ntype AttribSortingFn = (rowA: any, rowB: any, columnId: string, attribute?: AttributeData) => number\n// sort by the order of the enum options\nconst attribSort: AttribSortingFn = (rowA, rowB, columnId, attrib) => {\n const valueA = getCellValue(rowA.original, columnId)\n const valueB = getCellValue(rowB.original, columnId)\n // if attrib is defined and has enum options, use them\n if (attrib && attrib.enum) {\n const indexA = attrib.enum.findIndex((o) => o.value === valueA)\n const indexB = attrib.enum.findIndex((o) => o.value === valueB)\n return indexA - indexB\n } else if (attrib?.type === 'datetime') {\n return sortingFns.datetime(rowA, rowB, columnId)\n } else if (attrib?.type === 'boolean') {\n const boolA = valueA === true ? 1 : 0\n const boolB = valueB === true ? 1 : 0\n return boolA - boolB\n } else {\n return sortingFns.alphanumeric(rowA, rowB, columnId)\n }\n}\n\nexport const getLinkLabel = (\n link: Pick<LinkTypeModel, 'linkType'>,\n direction: 'in' | 'out' | string,\n) => `${link.linkType.charAt(0).toUpperCase() + link.linkType.slice(1)} (${direction})`\n\nexport const getLinkKey = (link: Pick<LinkTypeModel, 'name'>, direction: 'in' | 'out' | string) =>\n `${link.name.replaceAll('_', '').replaceAll('-', '').replaceAll('|', '_')}_${direction}`\n\nexport const getLinkColumnId = (\n link: Pick<LinkTypeModel, 'name'>,\n direction: 'in' | 'out' | string,\n) => `link_${getLinkKey(link, direction)}`\n\nexport type DefaultColumns =\n | typeof ROW_SELECTION_COLUMN_ID\n | 'thumbnail'\n | 'name'\n | 'entityType'\n | typeof ENTITY_COLUMN_IDS.folder\n | 'status'\n | 'subType'\n | 'assignees'\n | 'tags'\n | 'createdAt'\n | 'updatedAt'\n | 'comments'\n\nexport type TreeTableExtraColumn = { column: ColumnDef<TableRow>; position?: number }\n\nexport type BuildTreeTableColumnsProps = {\n scopes: string[]\n attribs: ProjectTableAttribute[]\n links: LinkTypeModel[]\n includeLinks?: boolean\n showHierarchy: boolean\n isFlatFolderView?: boolean\n options: BuiltInFieldOptions\n excluded?: (DefaultColumns | string)[]\n excludedSorting?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n groupBy?: TableGroupBy\n nameLabel?: string\n}\n\nconst buildTreeTableColumns = ({\n scopes,\n attribs,\n links = [],\n includeLinks = true,\n showHierarchy,\n isFlatFolderView,\n options,\n excluded,\n excludedSorting,\n extraColumns,\n groupBy,\n nameLabel = 'Entity',\n}: BuildTreeTableColumnsProps) => {\n const staticColumns: ColumnDef<TableRow>[] = []\n\n // Helper to check if a column should be included\n const isIncluded = (id: DefaultColumns | string) =>\n !excluded?.some((excludedId) => normalizeColumnId(excludedId) === normalizeColumnId(id))\n const canSort = (id: DefaultColumns | string) =>\n isColumnSortable(id) &&\n !excludedSorting?.some((excludedId) => normalizeColumnId(excludedId) === normalizeColumnId(id))\n\n // Conditionally add static columns\n if (isIncluded(ROW_SELECTION_COLUMN_ID)) {\n staticColumns.push({\n id: ROW_SELECTION_COLUMN_ID,\n enableResizing: false,\n enableSorting: false,\n enablePinning: false,\n enableHiding: false,\n\n header: () => <RowSelectionHeader />,\n cell: ({ row }) => {\n if (row.original.entityType === 'group' || row.original.metaType) return null\n return <SelectionCell />\n },\n size: 20,\n })\n }\n\n if (isIncluded('thumbnail')) {\n staticColumns.push({\n id: 'thumbnail',\n header: getColumnLabel('thumbnail'),\n size: 63,\n minSize: 24,\n enableResizing: true,\n enableSorting: false,\n cell: ({ row, column, table }) => {\n if (row.original.entityType === 'group' || row.original.metaType) return null\n const meta = table.options.meta\n if (!meta) return null\n const cellId = getCellId(row.id, column.id)\n let thumbnail = {\n entityId: row.original.entityId || row.id,\n entityType: row.original.entityType,\n thumbnailHash: row.original.thumbnailHash,\n }\n // check for thumbnail override\n if (row.original.thumbnail) {\n // @ts-expect-error\n thumbnail = row.original.thumbnail\n }\n return (\n <ThumbnailWidget\n id={cellId}\n entityId={thumbnail.entityId}\n entityType={thumbnail.entityType}\n thumbnailHash={thumbnail.thumbnailHash}\n icon={row.original.icon}\n projectName={meta?.projectName as string}\n className={clsx('thumbnail', {\n loading: row.original.isLoading,\n })}\n isPlayable={row.original.hasReviewables}\n />\n )\n },\n })\n }\n\n if (isIncluded('name')) {\n staticColumns.push({\n id: 'name',\n accessorKey: 'name',\n header: nameLabel,\n minSize: COLUMN_MIN_SIZE,\n sortingFn: withLoadingStateSort(pathSort),\n enableSorting: groupBy && groupBy.id !== 'folder' ? false : canSort('name'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: !(groupBy && groupBy.id !== 'folder'),\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n const meta = table.options.meta\n const { isEditing } = useCellEditing()\n const { rowHeight = 40 } = useColumnSettingsContext()\n const cellId = getCellId(row.id, column.id)\n\n if (row.original.metaType) {\n return (\n <TableCellContent\n id={cellId}\n className={clsx('large', 'readonly', row.original.entityType)}\n style={{\n paddingLeft: `calc(${row.depth * 1}rem + 8px)`,\n pointerEvents: 'none',\n }}\n tabIndex={0}\n >\n <MetaWidget metaType={row.original.metaType} label={row.original.label} />\n </TableCellContent>\n )\n }\n\n if (row.original.entityType === NEXT_PAGE_ID && row.original.group) {\n return (\n <LoadMoreWidget\n id={row.original.group.value}\n onLoadMore={(id) => meta?.loadMoreRows?.(id)}\n />\n )\n }\n\n const isExpandable =\n row.getCanExpand() &&\n !!row.originalSubRows &&\n (isEntityExpandable(row.original.entityType) || !!row.original.group)\n\n return (\n <TableCellContent\n id={cellId}\n className={clsx('large', row.original.entityType, {\n loading: row.original.isLoading,\n hierarchy: showHierarchy,\n })}\n style={{\n paddingLeft: `calc(${row.depth * 1}rem + ${\n isExpandable || !row.getCanExpand() ? 0 : 32\n }px + 8px)`,\n }}\n tabIndex={0}\n >\n {row.original.group ? (\n <GroupHeaderWidget\n id={row.id}\n label={row.original.group.label}\n name={row.original.name}\n icon={row.original.group.icon}\n img={row.original.group.img}\n color={row.original.group.color}\n count={row.original.group.count}\n percentage={row.original.group.percentage}\n isExpanded={row.getIsExpanded()}\n isEmpty={row.original.group.count === 0}\n toggleExpanded={row.getToggleExpandedHandler()}\n />\n ) : (\n <EntityNameWidget\n id={row.id}\n label={row.original.label}\n name={row.original.name}\n path={\n !showHierarchy && !isFlatFolderView\n ? '/' + row.original.parents?.join('/')\n : undefined\n }\n entityType={row.original.entityType}\n subType={row.original.subType}\n isExpandable={isExpandable}\n isExpanded={row.getIsExpanded()}\n toggleExpandAll={() => meta?.toggleExpandAll?.([row.id])}\n toggleExpanded={row.getToggleExpandedHandler()}\n rowHeight={rowHeight}\n columnDisplayConfig={getColumnDisplayConfig(meta?.columnsConfig, 'name')}\n />\n )}\n {isEditing(cellId) && (\n <CellWidget\n rowId={id}\n className={clsx('name', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n valueData={\n {\n name: row.original.name,\n label: row.original.label,\n meta,\n entityRowId: id,\n columnId: column.id,\n hasVersions: !!row.original.hasVersions,\n } as NameWidgetData\n }\n entityType={type}\n attributeData={{ type: 'name' }}\n isCollapsed={!!row.original.childOnlyMatch}\n isReadOnly={meta?.readOnly?.includes(column.id)}\n />\n )}\n </TableCellContent>\n )\n },\n })\n }\n\n if (isIncluded('status')) {\n staticColumns.push({\n id: 'status',\n accessorKey: 'status',\n minSize: COLUMN_MIN_SIZE,\n header: getColumnLabel('status'),\n sortingFn: withLoadingStateSort(\n withNameTieBreaker((a, b, c) =>\n attribSort(a, b, c, { enum: options.status, type: 'string' }),\n ),\n ),\n sortDescFirst: COLUMN_SORT_CONFIG.status.sortDescFirst,\n enableSorting: canSort('status'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n const meta = table.options.meta\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('status', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n options={meta?.options?.status.filter((s) => s.scope?.includes(type))}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: column.id, value, type, rowId: id },\n { selection: meta?.selection },\n )\n }\n isReadOnly={meta?.readOnly?.includes(column.id) || isEntityRestricted(type)}\n pt={{\n enum: {\n pt: {\n template: {\n pt: {\n icon: {\n style: {\n fontVariationSettings: \"'FILL' 1, 'wght' 200, 'GRAD' 200, 'opsz' 20\",\n },\n },\n },\n },\n },\n },\n }}\n />\n )\n },\n })\n }\n\n if (isIncluded('entityType')) {\n staticColumns.push({\n id: 'entityType',\n accessorKey: 'entityType',\n header: getColumnLabel('entityType'),\n minSize: 20,\n enableSorting: false,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(sortingFns.alphanumeric)),\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n const cellId = getCellId(row.id, column.id)\n\n return (\n <TableCellContent\n id={cellId}\n className={clsx('entityType', READ_ONLY, type, { loading: row.original.isLoading })}\n tabIndex={0}\n >\n <Icon icon={getEntityTypeIcon(type)} /> {upperFirst(value)}\n </TableCellContent>\n )\n },\n })\n }\n\n if (isIncluded('subType')) {\n staticColumns.push({\n id: 'subType',\n accessorKey: 'subType',\n header: getColumnLabel('subType', scopes),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('subType'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortDescFirst: COLUMN_SORT_CONFIG.taskType.sortDescFirst,\n sortingFn: withLoadingStateSort(\n withNameTieBreaker((a, b, c) =>\n attribSort(a, b, c, {\n enum: [...options.folderType, ...options.taskType],\n type: 'string',\n }),\n ),\n ),\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n const fieldId = type === 'folder' ? 'folderType' : 'taskType'\n const meta = table.options.meta\n const folderHasVersions = type === 'folder' && row.original.hasVersions\n return (\n <CellWidget\n rowId={id}\n className={clsx('subType', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n options={\n type === 'folder'\n ? meta?.options?.folderType\n : type === 'task'\n ? meta?.options?.taskType\n : type === 'product' || type === 'version'\n ? meta?.options?.productType\n : []\n }\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: fieldId, value, type, rowId: row.id },\n { selection: meta?.selection },\n )\n }\n isReadOnly={\n meta?.readOnly?.includes(column.id) ||\n meta?.readOnly?.includes(fieldId) ||\n folderHasVersions\n }\n tooltip={\n folderHasVersions\n ? 'Folder type cannot be edited when versions exist within the folder'\n : undefined\n }\n pt={{\n enum: {\n pt: {\n template: {\n iconOnlyColor: true,\n },\n },\n },\n }}\n />\n )\n },\n })\n }\n\n if (isIncluded('assignees')) {\n staticColumns.push({\n id: 'assignees',\n accessorKey: 'assignees',\n header: getColumnLabel('assignees'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('assignees'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(valueLengthSort)),\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n if (type === 'folder')\n return (\n <CellWidget\n rowId={id}\n className={clsx('assignees', { loading: row.original.isLoading })}\n columnId={column.id}\n value=\"\"\n isPlaceholder\n />\n )\n return (\n <CellWidget\n rowId={id}\n className={clsx('assignees', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options?.assignee}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: column.id, value, type, rowId: row.id },\n { selection: meta?.selection },\n )\n }\n isReadOnly={meta?.readOnly?.includes(column.id) || isEntityRestricted(type)}\n pt={{\n enum: {\n multiSelectClose: value?.length === 0, // close the dropdown on first assignment\n search: true, // enable search at all times\n multipleOverride: false,\n },\n }}\n />\n )\n },\n })\n }\n\n if (isIncluded(ENTITY_COLUMN_IDS.folder)) {\n staticColumns.push({\n id: ENTITY_COLUMN_IDS.folder,\n accessorKey: 'folder',\n header: getColumnLabel(ENTITY_COLUMN_IDS.folder),\n minSize: COLUMN_MIN_SIZE,\n sortDescFirst: COLUMN_SORT_CONFIG.folder_entity.sortDescFirst,\n sortingFn: withLoadingStateSort(pathSort),\n enableSorting: canSort(ENTITY_COLUMN_IDS.folder),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, 'folder')\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <EntityWidget\n rowId={id}\n className=\"folder\"\n columnId={column.id}\n value={value}\n entityId={row.original.folderId}\n entityType=\"folder\"\n subType={row.original.folderType}\n isLoading={row.original.isLoading}\n />\n )\n },\n })\n }\n\n // related task entity column for versions and products\n if (\n isIncluded(ENTITY_COLUMN_IDS.task) &&\n ['version', 'product'].some((s) => scopes.includes(s))\n ) {\n staticColumns.push({\n id: ENTITY_COLUMN_IDS.task,\n accessorKey: 'taskLabel',\n header: getColumnLabel(ENTITY_COLUMN_IDS.task),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort(ENTITY_COLUMN_IDS.task),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(pathSort),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, 'taskLabel')\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <EntityWidget\n rowId={id}\n className=\"task_entity\"\n columnId={column.id}\n value={value}\n entityId={row.original.taskId}\n entityType=\"task\"\n subType={row.original.taskType}\n isLoading={row.original.isLoading}\n />\n )\n },\n })\n }\n\n // only show authors column for products\n if (isIncluded('author') && ['version', 'product'].some((s) => scopes.includes(s))) {\n staticColumns.push({\n id: 'author',\n accessorKey: 'author',\n header: getColumnLabel('author'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('author'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(pathSort),\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('author', { loading: row.original.isLoading })}\n columnId={column.id}\n value={[value]}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options?.assignee}\n isReadOnly={true}\n isInherited={type === 'product'} // products do not have authors, we just show the featured version's author\n />\n )\n },\n })\n }\n\n // version entity column for versions and products\n if (\n isIncluded(ENTITY_COLUMN_IDS.version) &&\n ['version', 'product'].some((s) => scopes.includes(s))\n ) {\n staticColumns.push({\n id: ENTITY_COLUMN_IDS.version,\n accessorKey: 'versionName',\n header: getColumnLabel(ENTITY_COLUMN_IDS.version),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort(ENTITY_COLUMN_IDS.version),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(pathSort),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, 'versionName')\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n let versionValue = row.original.versionName || value\n if (row.original.entityType === 'product') {\n // show summary of versions for products\n versionValue = `${row.original.versionName} (${row.original.versionsCount || 0} versions)`\n }\n\n return (\n <EntityWidget\n rowId={id}\n className=\"version-entity\"\n columnId={column.id}\n value={versionValue}\n entityId={\n row.original.versionEntityId || (type === 'version' ? row.original.entityId : null)\n }\n entityType=\"version\"\n isLoading={row.original.isLoading}\n />\n )\n },\n })\n }\n\n // version number column for versions and products\n if (isIncluded('version') && ['version', 'product'].some((s) => scopes.includes(s))) {\n staticColumns.push({\n id: 'version',\n accessorKey: 'version',\n header: getColumnLabel('version'),\n minSize: COLUMN_MIN_SIZE,\n sortDescFirst: COLUMN_SORT_CONFIG.version.sortDescFirst,\n enableSorting: canSort('version'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(sortingFns.basic)),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('version', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value ?? ''}\n attributeData={{ type: 'integer' }}\n isReadOnly={true}\n />\n )\n },\n })\n }\n\n // product name column for versions and products\n if (isIncluded('product') && ['version', 'product'].some((s) => scopes.includes(s))) {\n staticColumns.push({\n id: 'product',\n accessorKey: 'product',\n header: getColumnLabel('product'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('product'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(pathSort),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('product', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n isReadOnly={true}\n />\n )\n },\n })\n }\n\n if (isIncluded('tags')) {\n staticColumns.push({\n id: 'tags',\n accessorKey: 'tags',\n header: getColumnLabel('tags'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('tags'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(valueLengthSort)),\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n return (\n <CellWidget\n rowId={id}\n className={clsx('tags', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options?.tag}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: column.id, value, type, rowId: row.id },\n { selection: meta?.selection },\n )\n }\n isReadOnly={meta?.readOnly?.includes(column.id) || isEntityRestricted(type)}\n enableCustomValues\n />\n )\n },\n })\n }\n\n if (isIncluded('createdAt')) {\n staticColumns.push({\n id: 'createdAt',\n accessorKey: 'createdAt',\n header: getColumnLabel('createdAt'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('createdAt'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(sortingFns.datetime)),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n return (\n <CellWidget\n rowId={id}\n className={clsx('createdAt', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'datetime' }}\n isCollapsed={!!row.original.childOnlyMatch}\n isReadOnly={true}\n pt={{ date: { showTime: true } }}\n />\n )\n },\n })\n }\n\n if (isIncluded('updatedAt')) {\n staticColumns.push({\n id: 'updatedAt',\n accessorKey: 'updatedAt',\n header: getColumnLabel('updatedAt'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('updatedAt'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(sortingFns.datetime)),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n return (\n <CellWidget\n rowId={id}\n className={clsx('updatedAt', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'datetime' }}\n isCollapsed={!!row.original.childOnlyMatch}\n isReadOnly={true}\n pt={{ date: { showTime: true } }}\n />\n )\n },\n })\n }\n\n if (isIncluded('subtasks') && scopes.includes('task')) {\n staticColumns.push({\n id: 'subtasks',\n accessorKey: 'subtasks',\n header: getColumnLabel('subtasks'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: false,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n // only show for tasks\n if (type !== 'task') return <div className=\"readonly\"></div>\n\n const subtasksData: SubtasksWidgetData = {\n taskId: parseGroupId(row.id) || row.original.entityId || row.original.id,\n subtasks: value || [],\n }\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('subtasks', { loading: row.original.isLoading })}\n columnId={column.id}\n value={subtasksData.subtasks?.map((s: any) => s.label || s.name) || []}\n valueData={subtasksData}\n attributeData={{ type: 'subtasks' }}\n isReadOnly={meta?.readOnly?.includes(column.id)}\n />\n )\n },\n })\n }\n\n if (\n isIncluded('comments') &&\n scopes.some((s) => ['task', 'version', 'product', 'folder'].includes(s))\n ) {\n staticColumns.push({\n id: 'comments',\n accessorKey: 'latestComments',\n header: getColumnLabel('comments'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: false,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, 'latestComments')\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n // loading placeholder rows have no entityType yet — let them through so the skeleton shows\n // products borrow their featured version's comments; folders only have data on GQL-fed pages (Lists)\n if (!row.original.isLoading && !['task', 'version', 'product', 'folder'].includes(type))\n return <div className=\"readonly\"></div>\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('comments', { loading: row.original.isLoading })}\n columnId={column.id}\n value={''}\n valueData={value || []}\n attributeData={{ type: 'comments' }}\n isCollapsed={!!row.original.childOnlyMatch}\n isReadOnly\n />\n )\n },\n })\n }\n\n const attributeColumns: ColumnDef<TableRow>[] = attribs\n .filter((attrib) => {\n // filter out attributes that are out of scope\n if (attrib.scope && !attrib.scope.some((s) => scopes.includes(s))) return false\n\n const columnId = 'attrib_' + attrib.name\n // Check if the specific attribute column is excluded\n // or if all built-in attributes are excluded and this is a built-in attribute\n if (!isIncluded(columnId)) return false\n if (attrib.builtin && !isIncluded('attrib')) return false\n return true\n })\n .map((attrib) => {\n const attribColumn: ColumnDef<TableRow> = {\n id: 'attrib_' + attrib.name,\n accessorKey: 'attrib.' + attrib.name,\n header: attrib.data.title || attrib.name,\n minSize: COLUMN_MIN_SIZE,\n filterFn: 'fuzzy' as FilterFnOption<TableRow>,\n sortingFn: withLoadingStateSort(\n withNameTieBreaker((a, b, c) => attribSort(a, b, c, attrib.data)),\n ),\n enableSorting: canSort(attrib.name) && canSort('attrib'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const columnIdParsed = column.id.replace('attrib_', '')\n const { value, id, type } = getValueIdType(row, columnIdParsed, 'attrib')\n const isInherited = !row.original.ownAttrib?.includes(columnIdParsed)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n const outOfScopeAndNoValue =\n !attrib.scope?.includes(type as (typeof attrib.scope)[number]) &&\n (value === null || value === undefined)\n\n // if the attribute is not in scope, we should nothing\n if (outOfScopeAndNoValue) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('attrib', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: attrib.data.type || 'string', widget: attrib.data.widget }}\n options={attrib.data.enum || []}\n midnightExclusiveFields={row.original.midnightExclusiveFields}\n isCollapsed={!!row.original.childOnlyMatch}\n isInherited={isInherited}\n isReadOnly={\n // check attrib is not read only\n attrib.readOnly ||\n // check if there is any other reason the cell should be read only\n meta?.readOnly?.some(\n (id) => id === columnIdParsed || (id === 'attrib' && attrib.builtin),\n )\n }\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: columnIdParsed, value, type, isAttrib: true, rowId: row.id },\n { selection: !!attrib.data.enum?.length ? meta?.selection : undefined },\n )\n }\n />\n )\n },\n }\n return attribColumn\n })\n\n const linkColumns: ColumnDef<TableRow>[] = !includeLinks\n ? []\n : links\n .filter((link) => {\n // Check if the link type is excluded\n if (!isIncluded(link.linkType) || !isIncluded('link')) return false\n // Check if inputType and outputType are in scopes\n if (!scopes.includes(link.inputType) && !scopes.includes(link.outputType)) return false\n return true\n })\n .flatMap((link) => {\n const createLinkColumn = (direction: 'in' | 'out'): ColumnDef<TableRow> => {\n return {\n id: getLinkColumnId(link, direction),\n accessorKey: `links.${getLinkKey(link, direction)}`,\n header: () => (\n <LinkColumnHeader>\n {getLinkLabel(link, direction)}{' '}\n <Icon\n icon={getEntityTypeIcon(direction === 'in' ? link.inputType : link.outputType)}\n />\n </LinkColumnHeader>\n ),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: false,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const columnIdParsed = column.id.replace('link_', '')\n\n const { id, value } = getValueIdType(row, columnIdParsed, 'links')\n const cellValue = value?.map((v: any) => v.label)\n const entityId = row.original.entityId || row.original.id\n const isLinksLoading = !!table.options.meta?.loadingLinksEntityIds?.has(entityId)\n const valueData: LinkWidgetData = {\n links: value,\n direction: direction,\n entityId: entityId,\n entityType: row.original.entityType,\n link: {\n label: link.linkType,\n linkType: link.name,\n targetEntityType: direction === 'in' ? link.inputType : link.outputType,\n },\n }\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('links', { loading: row.original.isLoading })}\n columnId={column.id}\n value={cellValue}\n valueData={valueData}\n folderId={row.original.folderId}\n attributeData={{ type: 'links' }}\n isLinksLoading={isLinksLoading}\n />\n )\n },\n }\n }\n\n return [createLinkColumn('in'), createLinkColumn('out')]\n })\n\n const allColumns = [...staticColumns, ...attributeColumns, ...linkColumns]\n\n // Add extra columns if provided\n if (extraColumns) {\n extraColumns.forEach(({ column, position = -1 }) => {\n if (position >= 0 && position < allColumns.length) {\n allColumns.splice(position, 0, column)\n } else {\n allColumns.push(column)\n }\n })\n }\n\n return allColumns\n}\n\nexport default buildTreeTableColumns\n\nexport const getValueIdType = (\n row: Row<TableRow>,\n field: string,\n nestedField?: keyof TableRow,\n): {\n value: any\n id: string\n type: string\n} => ({\n value: nestedField\n ? (row.original[nestedField as keyof TableRow] as any)?.[field]\n : (row.original[field as keyof TableRow] as any),\n id: row.id,\n type: row.original.entityType,\n})\n"],"names":["isEntityExpandable","entityType","COLUMN_MIN_SIZE","COLUMN_LABELS","getColumnLabel","columnId","scopes","scope","normalizeColumnId","COLUMN_SORT_CONFIG","getSortableColumnOptions","columns","config","id","column","isColumnSortable","getColumnSortKey","showHierarchy","normalizedColumnId","withLoadingStateSort","sortFn","rowA","rowB","args","naturalSortCollator","withNameTieBreaker","result","labelA","labelB","pathSort","valueLengthSort","valueA","getCellValue","valueB","lengthA","lengthB","attribSort","attrib","indexA","o","indexB","sortingFns","getLinkLabel","link","direction","getLinkKey","getLinkColumnId","buildTreeTableColumns","attribs","links","includeLinks","isFlatFolderView","options","excluded","excludedSorting","extraColumns","groupBy","nameLabel","staticColumns","isIncluded","excludedId","canSort","ROW_SELECTION_COLUMN_ID","jsx","RowSelectionHeader","row","SelectionCell","table","meta","cellId","getCellId","thumbnail","ThumbnailWidget","clsx","value","type","getValueIdType","isEditing","useCellEditing","rowHeight","useColumnSettingsContext","TableCellContent","MetaWidget","NEXT_PAGE_ID","LoadMoreWidget","isExpandable","jsxs","GroupHeaderWidget","EntityNameWidget","getColumnDisplayConfig","CellWidget","a","b","c","s","isEntityRestricted","READ_ONLY","Icon","getEntityTypeIcon","upperFirst","fieldId","folderHasVersions","ENTITY_COLUMN_IDS","EntityWidget","versionValue","subtasksData","parseGroupId","attributeColumns","columnIdParsed","isInherited","linkColumns","createLinkColumn","LinkColumnHeader","cellValue","v","entityId","isLinksLoading","valueData","allColumns","position","field","nestedField"],"mappings":"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"}
1
+ {"version":3,"file":"buildTreeTableColumns.cjs.js","sources":["../../../../../src/containers/ProjectTreeTable/buildTreeTableColumns.tsx"],"sourcesContent":["import { ColumnDef, FilterFnOption, Row, SortingFn, sortingFns } from '@tanstack/react-table'\nimport { TableRow } from './types/table'\nimport { ProjectTableAttribute, BuiltInFieldOptions } from './types'\nimport {\n CellWidget,\n EntityWidget,\n MetaWidget,\n EntityNameWidget,\n GroupHeaderWidget,\n ThumbnailWidget,\n} from './widgets'\nimport { getCellId, getCellValue, parseCellId } from './utils/cellUtils'\nimport { LinkColumnHeader, TableCellContent } from './ProjectTreeTable.styled'\nimport clsx from 'clsx'\nimport { SelectionCell } from './components/SelectionCell'\nimport RowSelectionHeader from './components/RowSelectionHeader'\nimport { TableGroupBy, useCellEditing, useColumnSettingsContext } from './context'\nimport { ROW_SELECTION_COLUMN_ID } from './constants'\nimport { NEXT_PAGE_ID, parseGroupId } from './hooks/useBuildGroupByTableData'\nimport LoadMoreWidget from './widgets/LoadMoreWidget'\nimport type { AttributeData, LinkTypeModel } from '@shared/api'\nimport { LinkWidgetData } from './widgets/LinksWidget'\nimport { SubtasksWidgetData } from './widgets/SubtasksWidget'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { getEntityTypeIcon } from '@shared/util'\nimport type { NameWidgetData } from '@shared/components/RenameForm/RenameForm'\nimport { isEntityRestricted, READ_ONLY } from './utils/restrictedEntity'\nimport { getColumnDisplayConfig } from './types/columnConfig'\nimport { ENTITY_COLUMN_IDS, normalizeColumnId } from './utils/columnIds'\nimport { upperFirst } from 'lodash'\n\nexport const isEntityExpandable = (entityType: string) => ['folder', 'product'].includes(entityType)\n\nexport const COLUMN_MIN_SIZE = 50\n\nexport const COLUMN_LABELS: Record<string, string> = {\n thumbnail: 'Thumbnail',\n status: 'Status',\n entityType: 'Entity type',\n subType: 'Type',\n productType: 'Product type',\n assignees: 'Assignees',\n folder_entity: 'Folder',\n task_entity: 'Task',\n author: 'Author',\n version: 'Version number',\n version_entity: 'Version',\n product: 'Product name',\n productBaseType: 'Base type',\n taskType: 'Task type',\n folderType: 'Folder type',\n tags: 'Tags',\n createdAt: 'Created at',\n updatedAt: 'Updated at',\n subtasks: 'Subtasks',\n comments: 'Latest comments',\n}\n\nexport const getColumnLabel = (columnId: string, scopes: string[] = []) => {\n if (columnId === 'subType' && scopes.some((scope) => ['product', 'version'].includes(scope))) {\n return 'Product type'\n }\n return COLUMN_LABELS[normalizeColumnId(columnId)] || columnId\n}\n\ntype ColumnSortConfig = {\n sortKey?: string\n sortDescFirst?: boolean\n enabled: boolean\n label: string\n scopes?: string[]\n}\n\n// TanStack column IDs are also used by the UI state. Keep API sort keys here\n// so a column can use a different identifier without leaking that detail into\n// the table state.\nexport const COLUMN_SORT_CONFIG: Record<string, ColumnSortConfig> = {\n thumbnail: { enabled: false, label: COLUMN_LABELS.thumbnail },\n name: { sortKey: 'name', enabled: true, label: 'Name' },\n entityType: { enabled: false, label: COLUMN_LABELS.entityType },\n status: { sortKey: 'status', sortDescFirst: false, enabled: true, label: COLUMN_LABELS.status },\n assignees: {\n sortKey: 'assignees',\n enabled: true,\n label: COLUMN_LABELS.assignees,\n scopes: ['task'],\n },\n folder_entity: {\n sortKey: 'folderName',\n sortDescFirst: false,\n enabled: true,\n label: COLUMN_LABELS.folder_entity,\n },\n task_entity: {\n sortKey: 'taskName',\n enabled: false,\n label: COLUMN_LABELS.task_entity,\n scopes: ['version', 'product'],\n },\n author: {\n sortKey: 'author',\n enabled: true,\n label: COLUMN_LABELS.author,\n scopes: ['version', 'product'],\n },\n version: {\n sortKey: 'version',\n sortDescFirst: true,\n enabled: true,\n label: COLUMN_LABELS.version,\n scopes: ['version', 'product'],\n },\n version_entity: {\n sortKey: 'version',\n enabled: true,\n label: COLUMN_LABELS.version_entity,\n scopes: ['version', 'product'],\n },\n product: {\n sortKey: 'product',\n enabled: true,\n label: COLUMN_LABELS.product,\n scopes: ['version', 'product'],\n },\n productBaseType: {\n sortKey: 'productBaseType',\n enabled: true,\n label: COLUMN_LABELS.productBaseType,\n scopes: ['version', 'product'],\n },\n taskType: {\n sortKey: 'taskType',\n sortDescFirst: true,\n enabled: true,\n label: COLUMN_LABELS.taskType,\n scopes: ['version', 'product'],\n },\n folderType: {\n sortKey: 'folderType',\n enabled: true,\n label: COLUMN_LABELS.folderType,\n scopes: ['version', 'product'],\n },\n productType: {\n sortKey: 'productType',\n enabled: true,\n label: COLUMN_LABELS.productType,\n scopes: ['version', 'product'],\n },\n tags: { sortKey: 'tags', enabled: true, label: COLUMN_LABELS.tags },\n createdAt: { sortKey: 'createdAt', enabled: true, label: COLUMN_LABELS.createdAt },\n updatedAt: { sortKey: 'updatedAt', enabled: true, label: COLUMN_LABELS.updatedAt },\n subtasks: { enabled: false, label: COLUMN_LABELS.subtasks },\n comments: { enabled: false, label: COLUMN_LABELS.comments },\n}\n\ntype SortColumnLabel = { value: string; label: string }\n\nexport const getNameColumnLabel = (scopes: string[]) =>\n scopes.includes('version')\n ? 'Version / Product'\n : scopes.map((scope) => scope.charAt(0).toUpperCase() + scope.slice(1)).join(' / ')\n\nexport const getSortableColumnOptions = (scopes?: string[], columns: SortColumnLabel[] = []) =>\n Object.entries(COLUMN_SORT_CONFIG)\n .filter(\n ([, config]) =>\n config.enabled &&\n (!config.scopes || !scopes || config.scopes.some((scope) => scopes.includes(scope))),\n )\n .map(([id, config]) => ({\n id,\n label:\n columns.find((column) => normalizeColumnId(column.value) === id)?.label ||\n getColumnLabel(id, scopes),\n }))\n\nexport const isColumnSortable = (columnId: string) =>\n COLUMN_SORT_CONFIG[normalizeColumnId(columnId)]?.enabled ?? !columnId.startsWith('link_')\n\nexport const getColumnSortKey = (columnId?: string, showHierarchy = true, entityType?: string) => {\n if (!columnId) return undefined\n const normalizedColumnId = normalizeColumnId(columnId)\n if (normalizedColumnId === 'name' && !showHierarchy) return 'path'\n if (normalizedColumnId === 'subType') {\n if (entityType === 'folder') return 'folderType'\n if (entityType === 'product' || entityType === 'version') return 'productType'\n if (entityType === 'task') return 'taskType'\n }\n return COLUMN_SORT_CONFIG[normalizedColumnId]?.sortKey ?? normalizedColumnId\n}\n\n// Wrapper function for sorting that pushes isLoading rows to the bottom\nconst withLoadingStateSort = (sortFn: SortingFn<any>): SortingFn<any> => {\n return (rowA, rowB, ...args) => {\n // If row loading states differ, prioritize non-loading rows\n if (rowA.original.isLoading !== rowB.original.isLoading) {\n return rowA.original.isLoading ? 1 : -1\n }\n // Otherwise, use the original sort function\n return sortFn(rowA, rowB, ...args)\n }\n}\n\nconst naturalSortCollator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' })\n\nconst withNameTieBreaker = (sortFn: SortingFn<any>): SortingFn<any> => {\n return (rowA, rowB, ...args) => {\n const result = sortFn(rowA, rowB, ...args)\n if (result !== 0) return result\n const labelA = rowA.original.label || rowA.original.name || ''\n const labelB = rowB.original.label || rowB.original.name || ''\n return naturalSortCollator.compare(labelA, labelB)\n }\n}\n\nconst pathSort: SortingFn<any> = (rowA, rowB) => {\n const labelA = rowA.original.label || rowA.original.path || rowA.original.name || ''\n const labelB = rowB.original.label || rowB.original.path || rowB.original.name || ''\n return naturalSortCollator.compare(labelA, labelB)\n}\n\nconst valueLengthSort: SortingFn<any> = (rowA, rowB, columnId) => {\n const valueA = getCellValue(rowA.original, columnId)\n const valueB = getCellValue(rowB.original, columnId)\n const lengthA = Array.isArray(valueA) ? valueA.length : valueA ? String(valueA).length : 0\n const lengthB = Array.isArray(valueB) ? valueB.length : valueB ? String(valueB).length : 0\n return lengthA - lengthB\n}\n\ntype AttribSortingFn = (rowA: any, rowB: any, columnId: string, attribute?: AttributeData) => number\n// sort by the order of the enum options\nconst attribSort: AttribSortingFn = (rowA, rowB, columnId, attrib) => {\n const valueA = getCellValue(rowA.original, columnId)\n const valueB = getCellValue(rowB.original, columnId)\n // if attrib is defined and has enum options, use them\n if (attrib && attrib.enum) {\n const indexA = attrib.enum.findIndex((o) => o.value === valueA)\n const indexB = attrib.enum.findIndex((o) => o.value === valueB)\n return indexA - indexB\n } else if (attrib?.type === 'datetime') {\n return sortingFns.datetime(rowA, rowB, columnId)\n } else if (attrib?.type === 'boolean') {\n const boolA = valueA === true ? 1 : 0\n const boolB = valueB === true ? 1 : 0\n return boolA - boolB\n } else {\n return sortingFns.alphanumeric(rowA, rowB, columnId)\n }\n}\n\nexport const getLinkLabel = (\n link: Pick<LinkTypeModel, 'linkType'>,\n direction: 'in' | 'out' | string,\n) => `${link.linkType.charAt(0).toUpperCase() + link.linkType.slice(1)} (${direction})`\n\nexport const getLinkKey = (link: Pick<LinkTypeModel, 'name'>, direction: 'in' | 'out' | string) =>\n `${link.name.replaceAll('_', '').replaceAll('-', '').replaceAll('|', '_')}_${direction}`\n\nexport const getLinkColumnId = (\n link: Pick<LinkTypeModel, 'name'>,\n direction: 'in' | 'out' | string,\n) => `link_${getLinkKey(link, direction)}`\n\nexport type DefaultColumns =\n | typeof ROW_SELECTION_COLUMN_ID\n | 'thumbnail'\n | 'name'\n | 'entityType'\n | typeof ENTITY_COLUMN_IDS.folder\n | 'status'\n | 'subType'\n | 'assignees'\n | 'tags'\n | 'createdAt'\n | 'updatedAt'\n | 'comments'\n\nexport type TreeTableExtraColumn = { column: ColumnDef<TableRow>; position?: number }\n\nexport type BuildTreeTableColumnsProps = {\n scopes: string[]\n attribs: ProjectTableAttribute[]\n links: LinkTypeModel[]\n includeLinks?: boolean\n showHierarchy: boolean\n isFlatFolderView?: boolean\n options: BuiltInFieldOptions\n excluded?: (DefaultColumns | string)[]\n excludedSorting?: (DefaultColumns | string)[]\n extraColumns?: TreeTableExtraColumn[]\n groupBy?: TableGroupBy\n nameLabel?: string\n}\n\nconst buildTreeTableColumns = ({\n scopes,\n attribs,\n links = [],\n includeLinks = true,\n showHierarchy,\n isFlatFolderView,\n options,\n excluded,\n excludedSorting,\n extraColumns,\n groupBy,\n nameLabel = 'Entity',\n}: BuildTreeTableColumnsProps) => {\n const staticColumns: ColumnDef<TableRow>[] = []\n\n // Helper to check if a column should be included\n const isIncluded = (id: DefaultColumns | string) =>\n !excluded?.some((excludedId) => normalizeColumnId(excludedId) === normalizeColumnId(id))\n const canSort = (id: DefaultColumns | string) =>\n isColumnSortable(id) &&\n !excludedSorting?.some((excludedId) => normalizeColumnId(excludedId) === normalizeColumnId(id))\n\n // Conditionally add static columns\n if (isIncluded(ROW_SELECTION_COLUMN_ID)) {\n staticColumns.push({\n id: ROW_SELECTION_COLUMN_ID,\n enableResizing: false,\n enableSorting: false,\n enablePinning: false,\n enableHiding: false,\n\n header: () => <RowSelectionHeader />,\n cell: ({ row }) => {\n if (row.original.entityType === 'group' || row.original.metaType) return null\n return <SelectionCell />\n },\n size: 20,\n })\n }\n\n if (isIncluded('thumbnail')) {\n staticColumns.push({\n id: 'thumbnail',\n header: getColumnLabel('thumbnail'),\n size: 63,\n minSize: 24,\n enableResizing: true,\n enableSorting: false,\n cell: ({ row, column, table }) => {\n if (row.original.entityType === 'group' || row.original.metaType) return null\n const meta = table.options.meta\n if (!meta) return null\n const cellId = getCellId(row.id, column.id)\n let thumbnail = {\n entityId: row.original.entityId || row.id,\n entityType: row.original.entityType,\n thumbnailHash: row.original.thumbnailHash,\n }\n // check for thumbnail override\n if (row.original.thumbnail) {\n // @ts-expect-error\n thumbnail = row.original.thumbnail\n }\n return (\n <ThumbnailWidget\n id={cellId}\n entityId={thumbnail.entityId}\n entityType={thumbnail.entityType}\n thumbnailHash={thumbnail.thumbnailHash}\n icon={row.original.icon}\n projectName={meta?.projectName as string}\n className={clsx('thumbnail', {\n loading: row.original.isLoading,\n })}\n isPlayable={row.original.hasReviewables}\n />\n )\n },\n })\n }\n\n if (isIncluded('name')) {\n staticColumns.push({\n id: 'name',\n accessorKey: 'name',\n header: nameLabel,\n minSize: COLUMN_MIN_SIZE,\n sortingFn: withLoadingStateSort(pathSort),\n enableSorting: groupBy && groupBy.id !== 'folder' ? false : canSort('name'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: !(groupBy && groupBy.id !== 'folder'),\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n const meta = table.options.meta\n const { isEditing } = useCellEditing()\n const { rowHeight = 40 } = useColumnSettingsContext()\n const cellId = getCellId(row.id, column.id)\n\n if (row.original.metaType) {\n return (\n <TableCellContent\n id={cellId}\n className={clsx('large', 'readonly', row.original.entityType)}\n style={{\n paddingLeft: `calc(${row.depth * 1}rem + 8px)`,\n pointerEvents: 'none',\n }}\n tabIndex={0}\n >\n <MetaWidget metaType={row.original.metaType} label={row.original.label} />\n </TableCellContent>\n )\n }\n\n if (row.original.entityType === NEXT_PAGE_ID && row.original.group) {\n return (\n <LoadMoreWidget\n id={row.original.group.value}\n onLoadMore={(id) => meta?.loadMoreRows?.(id)}\n />\n )\n }\n\n const isExpandable =\n row.getCanExpand() &&\n !!row.originalSubRows &&\n (isEntityExpandable(row.original.entityType) || !!row.original.group)\n\n return (\n <TableCellContent\n id={cellId}\n className={clsx('large', row.original.entityType, {\n loading: row.original.isLoading,\n hierarchy: showHierarchy,\n })}\n style={{\n paddingLeft: `calc(${row.depth * 1}rem + ${\n isExpandable || !row.getCanExpand() ? 0 : 32\n }px + 8px)`,\n }}\n tabIndex={0}\n >\n {row.original.group ? (\n <GroupHeaderWidget\n id={row.id}\n label={row.original.group.label}\n name={row.original.name}\n icon={row.original.group.icon}\n img={row.original.group.img}\n color={row.original.group.color}\n count={row.original.group.count}\n percentage={row.original.group.percentage}\n isExpanded={row.getIsExpanded()}\n isEmpty={row.original.group.count === 0}\n toggleExpanded={row.getToggleExpandedHandler()}\n />\n ) : (\n <EntityNameWidget\n id={row.id}\n label={row.original.label}\n name={row.original.name}\n path={\n !showHierarchy && !isFlatFolderView\n ? '/' + row.original.parents?.join('/')\n : undefined\n }\n entityType={row.original.entityType}\n subType={row.original.subType}\n isExpandable={isExpandable}\n isExpanded={row.getIsExpanded()}\n toggleExpandAll={() => meta?.toggleExpandAll?.([row.id])}\n toggleExpanded={row.getToggleExpandedHandler()}\n rowHeight={rowHeight}\n columnDisplayConfig={getColumnDisplayConfig(meta?.columnsConfig, 'name')}\n />\n )}\n {isEditing(cellId) && (\n <CellWidget\n rowId={id}\n className={clsx('name', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n valueData={\n {\n name: row.original.name,\n label: row.original.label,\n meta,\n entityRowId: id,\n columnId: column.id,\n hasVersions: !!row.original.hasVersions,\n } as NameWidgetData\n }\n entityType={type}\n attributeData={{ type: 'name' }}\n isCollapsed={!!row.original.childOnlyMatch}\n isReadOnly={meta?.readOnly?.includes(column.id)}\n />\n )}\n </TableCellContent>\n )\n },\n })\n }\n\n if (isIncluded('status')) {\n staticColumns.push({\n id: 'status',\n accessorKey: 'status',\n minSize: COLUMN_MIN_SIZE,\n header: getColumnLabel('status'),\n sortingFn: withLoadingStateSort(\n withNameTieBreaker((a, b, c) =>\n attribSort(a, b, c, { enum: options.status, type: 'string' }),\n ),\n ),\n sortDescFirst: COLUMN_SORT_CONFIG.status.sortDescFirst,\n enableSorting: canSort('status'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n const meta = table.options.meta\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('status', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n options={meta?.options?.status.filter((s) => s.scope?.includes(type))}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: column.id, value, type, rowId: id },\n { selection: meta?.selection },\n )\n }\n isReadOnly={meta?.readOnly?.includes(column.id) || isEntityRestricted(type)}\n pt={{\n enum: {\n pt: {\n template: {\n pt: {\n icon: {\n style: {\n fontVariationSettings: \"'FILL' 1, 'wght' 200, 'GRAD' 200, 'opsz' 20\",\n },\n },\n },\n },\n },\n },\n }}\n />\n )\n },\n })\n }\n\n if (isIncluded('entityType')) {\n staticColumns.push({\n id: 'entityType',\n accessorKey: 'entityType',\n header: getColumnLabel('entityType'),\n minSize: 20,\n enableSorting: false,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(sortingFns.alphanumeric)),\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n const cellId = getCellId(row.id, column.id)\n\n return (\n <TableCellContent\n id={cellId}\n className={clsx('entityType', READ_ONLY, type, { loading: row.original.isLoading })}\n tabIndex={0}\n >\n <Icon icon={getEntityTypeIcon(type)} /> {upperFirst(value)}\n </TableCellContent>\n )\n },\n })\n }\n\n if (isIncluded('subType')) {\n staticColumns.push({\n id: 'subType',\n accessorKey: 'subType',\n header: getColumnLabel('subType', scopes),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('subType'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortDescFirst: COLUMN_SORT_CONFIG.taskType.sortDescFirst,\n sortingFn: withLoadingStateSort(\n withNameTieBreaker((a, b, c) =>\n attribSort(a, b, c, {\n enum: [...options.folderType, ...options.taskType],\n type: 'string',\n }),\n ),\n ),\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n const fieldId = type === 'folder' ? 'folderType' : 'taskType'\n const meta = table.options.meta\n const folderHasVersions = type === 'folder' && row.original.hasVersions\n return (\n <CellWidget\n rowId={id}\n className={clsx('subType', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n options={\n type === 'folder'\n ? meta?.options?.folderType\n : type === 'task'\n ? meta?.options?.taskType\n : type === 'product' || type === 'version'\n ? meta?.options?.productType\n : []\n }\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: fieldId, value, type, rowId: row.id },\n { selection: meta?.selection },\n )\n }\n isReadOnly={\n meta?.readOnly?.includes(column.id) ||\n meta?.readOnly?.includes(fieldId) ||\n folderHasVersions\n }\n tooltip={\n folderHasVersions\n ? 'Folder type cannot be edited when versions exist within the folder'\n : undefined\n }\n pt={{\n enum: {\n pt: {\n template: {\n iconOnlyColor: true,\n },\n },\n },\n }}\n />\n )\n },\n })\n }\n\n if (isIncluded('assignees')) {\n staticColumns.push({\n id: 'assignees',\n accessorKey: 'assignees',\n header: getColumnLabel('assignees'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('assignees'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(valueLengthSort)),\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n if (type === 'folder')\n return (\n <CellWidget\n rowId={id}\n className={clsx('assignees', { loading: row.original.isLoading })}\n columnId={column.id}\n value=\"\"\n isPlaceholder\n />\n )\n return (\n <CellWidget\n rowId={id}\n className={clsx('assignees', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options?.assignee}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: column.id, value, type, rowId: row.id },\n { selection: meta?.selection },\n )\n }\n isReadOnly={meta?.readOnly?.includes(column.id) || isEntityRestricted(type)}\n pt={{\n enum: {\n multiSelectClose: value?.length === 0, // close the dropdown on first assignment\n search: true, // enable search at all times\n multipleOverride: false,\n },\n }}\n />\n )\n },\n })\n }\n\n if (isIncluded(ENTITY_COLUMN_IDS.folder)) {\n staticColumns.push({\n id: ENTITY_COLUMN_IDS.folder,\n accessorKey: 'folder',\n header: getColumnLabel(ENTITY_COLUMN_IDS.folder),\n minSize: COLUMN_MIN_SIZE,\n sortDescFirst: COLUMN_SORT_CONFIG.folder_entity.sortDescFirst,\n sortingFn: withLoadingStateSort(pathSort),\n enableSorting: canSort(ENTITY_COLUMN_IDS.folder),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const { value, id, type } = getValueIdType(row, 'folder')\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <EntityWidget\n rowId={id}\n className=\"folder\"\n columnId={column.id}\n value={value}\n entityId={row.original.folderId}\n entityType=\"folder\"\n subType={row.original.folderType}\n isLoading={row.original.isLoading}\n />\n )\n },\n })\n }\n\n // related task entity column for versions and products\n if (\n isIncluded(ENTITY_COLUMN_IDS.task) &&\n ['version', 'product'].some((s) => scopes.includes(s))\n ) {\n staticColumns.push({\n id: ENTITY_COLUMN_IDS.task,\n accessorKey: 'taskLabel',\n header: getColumnLabel(ENTITY_COLUMN_IDS.task),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort(ENTITY_COLUMN_IDS.task),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(pathSort),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, 'taskLabel')\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <EntityWidget\n rowId={id}\n className=\"task_entity\"\n columnId={column.id}\n value={value}\n entityId={row.original.taskId}\n entityType=\"task\"\n subType={row.original.taskType}\n isLoading={row.original.isLoading}\n />\n )\n },\n })\n }\n\n // only show authors column for products\n if (isIncluded('author') && ['version', 'product'].some((s) => scopes.includes(s))) {\n staticColumns.push({\n id: 'author',\n accessorKey: 'author',\n header: getColumnLabel('author'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('author'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(pathSort),\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('author', { loading: row.original.isLoading })}\n columnId={column.id}\n value={[value]}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options?.assignee}\n isReadOnly={true}\n isInherited={type === 'product'} // products do not have authors, we just show the featured version's author\n />\n )\n },\n })\n }\n\n // version entity column for versions and products\n if (\n isIncluded(ENTITY_COLUMN_IDS.version) &&\n ['version', 'product'].some((s) => scopes.includes(s))\n ) {\n staticColumns.push({\n id: ENTITY_COLUMN_IDS.version,\n accessorKey: 'versionName',\n header: getColumnLabel(ENTITY_COLUMN_IDS.version),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort(ENTITY_COLUMN_IDS.version),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(pathSort),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, 'versionName')\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n let versionValue = row.original.versionName || value\n if (row.original.entityType === 'product') {\n // show summary of versions for products\n versionValue = `${row.original.versionName} (${row.original.versionsCount || 0} versions)`\n }\n\n return (\n <EntityWidget\n rowId={id}\n className=\"version-entity\"\n columnId={column.id}\n value={versionValue}\n entityId={\n row.original.versionEntityId || (type === 'version' ? row.original.entityId : null)\n }\n entityType=\"version\"\n isLoading={row.original.isLoading}\n />\n )\n },\n })\n }\n\n // version number column for versions and products\n if (isIncluded('version') && ['version', 'product'].some((s) => scopes.includes(s))) {\n staticColumns.push({\n id: 'version',\n accessorKey: 'version',\n header: getColumnLabel('version'),\n minSize: COLUMN_MIN_SIZE,\n sortDescFirst: COLUMN_SORT_CONFIG.version.sortDescFirst,\n enableSorting: canSort('version'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(sortingFns.basic)),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('version', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value ?? ''}\n attributeData={{ type: 'integer' }}\n isReadOnly={true}\n />\n )\n },\n })\n }\n\n // product name column for versions and products\n if (isIncluded('product') && ['version', 'product'].some((s) => scopes.includes(s))) {\n staticColumns.push({\n id: 'product',\n accessorKey: 'product',\n header: getColumnLabel('product'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('product'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(pathSort),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('product', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'string' }}\n isReadOnly={true}\n />\n )\n },\n })\n }\n\n if (isIncluded('tags')) {\n staticColumns.push({\n id: 'tags',\n accessorKey: 'tags',\n header: getColumnLabel('tags'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('tags'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(valueLengthSort)),\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n return (\n <CellWidget\n rowId={id}\n className={clsx('tags', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'list_of_strings' }}\n options={meta?.options?.tag}\n isCollapsed={!!row.original.childOnlyMatch}\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: column.id, value, type, rowId: row.id },\n { selection: meta?.selection },\n )\n }\n isReadOnly={meta?.readOnly?.includes(column.id) || isEntityRestricted(type)}\n enableCustomValues\n />\n )\n },\n })\n }\n\n if (isIncluded('createdAt')) {\n staticColumns.push({\n id: 'createdAt',\n accessorKey: 'createdAt',\n header: getColumnLabel('createdAt'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('createdAt'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(sortingFns.datetime)),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n return (\n <CellWidget\n rowId={id}\n className={clsx('createdAt', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'datetime' }}\n isCollapsed={!!row.original.childOnlyMatch}\n isReadOnly={true}\n pt={{ date: { showTime: true } }}\n />\n )\n },\n })\n }\n\n if (isIncluded('updatedAt')) {\n staticColumns.push({\n id: 'updatedAt',\n accessorKey: 'updatedAt',\n header: getColumnLabel('updatedAt'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: canSort('updatedAt'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n sortingFn: withLoadingStateSort(withNameTieBreaker(sortingFns.datetime)),\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n return (\n <CellWidget\n rowId={id}\n className={clsx('updatedAt', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: 'datetime' }}\n isCollapsed={!!row.original.childOnlyMatch}\n isReadOnly={true}\n pt={{ date: { showTime: true } }}\n />\n )\n },\n })\n }\n\n if (isIncluded('subtasks') && scopes.includes('task')) {\n staticColumns.push({\n id: 'subtasks',\n accessorKey: 'subtasks',\n header: getColumnLabel('subtasks'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: false,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const { value, id, type } = getValueIdType(row, column.id)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n // only show for tasks\n if (type !== 'task') return <div className=\"readonly\"></div>\n\n const subtasksData: SubtasksWidgetData = {\n taskId: parseGroupId(row.id) || row.original.entityId || row.original.id,\n folderId: row.original.folderId ?? undefined,\n subtasks: value || [],\n }\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('subtasks', { loading: row.original.isLoading })}\n columnId={column.id}\n value={subtasksData.subtasks?.map((s: any) => s.label || s.name) || []}\n valueData={subtasksData}\n attributeData={{ type: 'subtasks' }}\n isReadOnly={meta?.readOnly?.includes(column.id)}\n />\n )\n },\n })\n }\n\n if (\n isIncluded('comments') &&\n scopes.some((s) => ['task', 'version', 'product', 'folder'].includes(s))\n ) {\n staticColumns.push({\n id: 'comments',\n accessorKey: 'latestComments',\n header: getColumnLabel('comments'),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: false,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column }) => {\n const { value, id, type } = getValueIdType(row, 'latestComments')\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n\n // loading placeholder rows have no entityType yet — let them through so the skeleton shows\n // products borrow their featured version's comments; folders only have data on GQL-fed pages (Lists)\n if (!row.original.isLoading && !['task', 'version', 'product', 'folder'].includes(type))\n return <div className=\"readonly\"></div>\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('comments', { loading: row.original.isLoading })}\n columnId={column.id}\n value={''}\n valueData={value || []}\n attributeData={{ type: 'comments' }}\n isCollapsed={!!row.original.childOnlyMatch}\n isReadOnly\n />\n )\n },\n })\n }\n\n const attributeColumns: ColumnDef<TableRow>[] = attribs\n .filter((attrib) => {\n // filter out attributes that are out of scope\n if (attrib.scope && !attrib.scope.some((s) => scopes.includes(s))) return false\n\n const columnId = 'attrib_' + attrib.name\n // Check if the specific attribute column is excluded\n // or if all built-in attributes are excluded and this is a built-in attribute\n if (!isIncluded(columnId)) return false\n if (attrib.builtin && !isIncluded('attrib')) return false\n return true\n })\n .map((attrib) => {\n const attribColumn: ColumnDef<TableRow> = {\n id: 'attrib_' + attrib.name,\n accessorKey: 'attrib.' + attrib.name,\n header: attrib.data.title || attrib.name,\n minSize: COLUMN_MIN_SIZE,\n filterFn: 'fuzzy' as FilterFnOption<TableRow>,\n sortingFn: withLoadingStateSort(\n withNameTieBreaker((a, b, c) => attribSort(a, b, c, attrib.data)),\n ),\n enableSorting: canSort(attrib.name) && canSort('attrib'),\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const meta = table.options.meta\n const columnIdParsed = column.id.replace('attrib_', '')\n const { value, id, type } = getValueIdType(row, columnIdParsed, 'attrib')\n const isInherited = !row.original.ownAttrib?.includes(columnIdParsed)\n if (['group', NEXT_PAGE_ID].includes(type) || row.original.metaType) return null\n const outOfScopeAndNoValue =\n !attrib.scope?.includes(type as (typeof attrib.scope)[number]) &&\n (value === null || value === undefined)\n\n // if the attribute is not in scope, we should nothing\n if (outOfScopeAndNoValue) return null\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('attrib', { loading: row.original.isLoading })}\n columnId={column.id}\n value={value}\n attributeData={{ type: attrib.data.type || 'string', widget: attrib.data.widget }}\n options={attrib.data.enum || []}\n midnightExclusiveFields={row.original.midnightExclusiveFields}\n isCollapsed={!!row.original.childOnlyMatch}\n isInherited={isInherited}\n isReadOnly={\n // check attrib is not read only\n attrib.readOnly ||\n // check if there is any other reason the cell should be read only\n meta?.readOnly?.some(\n (id) => id === columnIdParsed || (id === 'attrib' && attrib.builtin),\n )\n }\n onChange={(value) =>\n meta?.updateEntities?.(\n { field: columnIdParsed, value, type, isAttrib: true, rowId: row.id },\n { selection: !!attrib.data.enum?.length ? meta?.selection : undefined },\n )\n }\n />\n )\n },\n }\n return attribColumn\n })\n\n const linkColumns: ColumnDef<TableRow>[] = !includeLinks\n ? []\n : links\n .filter((link) => {\n // Check if the link type is excluded\n if (!isIncluded(link.linkType) || !isIncluded('link')) return false\n // Check if inputType and outputType are in scopes\n if (!scopes.includes(link.inputType) && !scopes.includes(link.outputType)) return false\n return true\n })\n .flatMap((link) => {\n const createLinkColumn = (direction: 'in' | 'out'): ColumnDef<TableRow> => {\n return {\n id: getLinkColumnId(link, direction),\n accessorKey: `links.${getLinkKey(link, direction)}`,\n header: () => (\n <LinkColumnHeader>\n {getLinkLabel(link, direction)}{' '}\n <Icon\n icon={getEntityTypeIcon(direction === 'in' ? link.inputType : link.outputType)}\n />\n </LinkColumnHeader>\n ),\n minSize: COLUMN_MIN_SIZE,\n enableSorting: false,\n enableResizing: true,\n enablePinning: true,\n enableHiding: true,\n cell: ({ row, column, table }) => {\n const columnIdParsed = column.id.replace('link_', '')\n\n const { id, value } = getValueIdType(row, columnIdParsed, 'links')\n const cellValue = value?.map((v: any) => v.label)\n const entityId = row.original.entityId || row.original.id\n const isLinksLoading = !!table.options.meta?.loadingLinksEntityIds?.has(entityId)\n const valueData: LinkWidgetData = {\n links: value,\n direction: direction,\n entityId: entityId,\n entityType: row.original.entityType,\n link: {\n label: link.linkType,\n linkType: link.name,\n targetEntityType: direction === 'in' ? link.inputType : link.outputType,\n },\n }\n\n return (\n <CellWidget\n rowId={id}\n className={clsx('links', { loading: row.original.isLoading })}\n columnId={column.id}\n value={cellValue}\n valueData={valueData}\n folderId={row.original.folderId}\n attributeData={{ type: 'links' }}\n isLinksLoading={isLinksLoading}\n />\n )\n },\n }\n }\n\n return [createLinkColumn('in'), createLinkColumn('out')]\n })\n\n const allColumns = [...staticColumns, ...attributeColumns, ...linkColumns]\n\n // Add extra columns if provided\n if (extraColumns) {\n extraColumns.forEach(({ column, position = -1 }) => {\n if (position >= 0 && position < allColumns.length) {\n allColumns.splice(position, 0, column)\n } else {\n allColumns.push(column)\n }\n })\n }\n\n return allColumns\n}\n\nexport default buildTreeTableColumns\n\nexport const getValueIdType = (\n row: Row<TableRow>,\n field: string,\n nestedField?: keyof TableRow,\n): {\n value: any\n id: string\n type: string\n} => ({\n value: nestedField\n ? (row.original[nestedField as keyof TableRow] as any)?.[field]\n : (row.original[field as keyof TableRow] as any),\n id: row.id,\n type: row.original.entityType,\n})\n"],"names":["isEntityExpandable","entityType","COLUMN_MIN_SIZE","COLUMN_LABELS","getColumnLabel","columnId","scopes","scope","normalizeColumnId","COLUMN_SORT_CONFIG","getNameColumnLabel","getSortableColumnOptions","columns","config","id","column","isColumnSortable","getColumnSortKey","showHierarchy","normalizedColumnId","withLoadingStateSort","sortFn","rowA","rowB","args","naturalSortCollator","withNameTieBreaker","result","labelA","labelB","pathSort","valueLengthSort","valueA","getCellValue","valueB","lengthA","lengthB","attribSort","attrib","indexA","o","indexB","sortingFns","getLinkLabel","link","direction","getLinkKey","getLinkColumnId","buildTreeTableColumns","attribs","links","includeLinks","isFlatFolderView","options","excluded","excludedSorting","extraColumns","groupBy","nameLabel","staticColumns","isIncluded","excludedId","canSort","ROW_SELECTION_COLUMN_ID","jsx","RowSelectionHeader","row","SelectionCell","table","meta","cellId","getCellId","thumbnail","ThumbnailWidget","clsx","value","type","getValueIdType","isEditing","useCellEditing","rowHeight","useColumnSettingsContext","TableCellContent","MetaWidget","NEXT_PAGE_ID","LoadMoreWidget","isExpandable","jsxs","GroupHeaderWidget","EntityNameWidget","getColumnDisplayConfig","CellWidget","a","b","c","s","isEntityRestricted","READ_ONLY","Icon","getEntityTypeIcon","upperFirst","fieldId","folderHasVersions","ENTITY_COLUMN_IDS","EntityWidget","versionValue","subtasksData","parseGroupId","attributeColumns","columnIdParsed","isInherited","linkColumns","createLinkColumn","LinkColumnHeader","cellValue","v","entityId","isLinksLoading","valueData","allColumns","position","field","nestedField"],"mappings":"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"}