@ynput/ayon-frontend-shared 0.3.37 → 0.3.39

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 (354) hide show
  1. package/dist/DetailsPanel.cjs.js +1 -1
  2. package/dist/DetailsPanel.es.js +25 -24
  3. package/dist/DetailsPanel.es.js.map +1 -1
  4. package/dist/_virtual/index.cjs6.js +1 -1
  5. package/dist/_virtual/index.cjs8.js +1 -1
  6. package/dist/_virtual/index.es6.js +2 -2
  7. package/dist/_virtual/index.es8.js +2 -2
  8. package/dist/index.cjs.js +1 -1
  9. package/dist/index.es.js +12 -11
  10. package/dist/index.es.js.map +1 -1
  11. package/dist/node_modules/parse-numeric-range/index.cjs.js +1 -1
  12. package/dist/node_modules/parse-numeric-range/index.es.js +1 -1
  13. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  14. package/dist/node_modules/remove-accents/index.es.js +1 -1
  15. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
  16. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
  17. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
  18. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
  19. package/dist/shared/node_modules/@module-federation/runtime-core/dist/utils/semver/utils.cjs.js +1 -1
  20. package/dist/shared/node_modules/@module-federation/runtime-core/dist/utils/semver/utils.es.js +1 -1
  21. package/dist/shared/node_modules/@module-federation/sdk/dist/utils.cjs.js +1 -1
  22. package/dist/shared/node_modules/@module-federation/sdk/dist/utils.es.js +1 -1
  23. package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
  24. package/dist/shared/node_modules/react-is/index.es.js +1 -1
  25. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
  26. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
  27. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +3 -2
  28. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
  29. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js +1 -1
  30. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js.map +1 -1
  31. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js +5 -4
  32. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js.map +1 -1
  33. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploaderDialog.cjs.js +1 -1
  34. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploaderDialog.cjs.js.map +1 -1
  35. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploaderDialog.es.js +5 -4
  36. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploaderDialog.es.js.map +1 -1
  37. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.cjs.js +1 -1
  38. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.cjs.js.map +1 -1
  39. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.es.js +5 -4
  40. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.es.js.map +1 -1
  41. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js +1 -1
  42. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js.map +1 -1
  43. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js +5 -4
  44. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js.map +1 -1
  45. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +1 -1
  46. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
  47. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +5 -4
  48. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
  49. package/dist/shared/src/components/RemotePage/ProjectPageRemote.cjs.js +1 -1
  50. package/dist/shared/src/components/RemotePage/ProjectPageRemote.cjs.js.map +1 -1
  51. package/dist/shared/src/components/RemotePage/ProjectPageRemote.es.js +5 -4
  52. package/dist/shared/src/components/RemotePage/ProjectPageRemote.es.js.map +1 -1
  53. package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js +1 -1
  54. package/dist/shared/src/components/RemotePage/RemotePageWrapper.cjs.js.map +1 -1
  55. package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js +5 -4
  56. package/dist/shared/src/components/RemotePage/RemotePageWrapper.es.js.map +1 -1
  57. package/dist/shared/src/components/RenameForm/RenameForm.cjs.js +1 -1
  58. package/dist/shared/src/components/RenameForm/RenameForm.cjs.js.map +1 -1
  59. package/dist/shared/src/components/RenameForm/RenameForm.es.js +5 -4
  60. package/dist/shared/src/components/RenameForm/RenameForm.es.js.map +1 -1
  61. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +1 -1
  62. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
  63. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +5 -4
  64. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
  65. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +1 -1
  66. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
  67. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +6 -5
  68. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
  69. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +1 -1
  70. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
  71. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +5 -4
  72. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
  73. package/dist/shared/src/components/ReviewablesSelector/Card.cjs.js +1 -1
  74. package/dist/shared/src/components/ReviewablesSelector/Card.cjs.js.map +1 -1
  75. package/dist/shared/src/components/ReviewablesSelector/Card.es.js +5 -4
  76. package/dist/shared/src/components/ReviewablesSelector/Card.es.js.map +1 -1
  77. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +1 -1
  78. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -1
  79. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +254 -240
  80. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js.map +1 -1
  81. package/dist/shared/src/components/SimpleFormDialog/FormFile.cjs.js +1 -1
  82. package/dist/shared/src/components/SimpleFormDialog/FormFile.cjs.js.map +1 -1
  83. package/dist/shared/src/components/SimpleFormDialog/FormFile.es.js +7 -6
  84. package/dist/shared/src/components/SimpleFormDialog/FormFile.es.js.map +1 -1
  85. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +1 -1
  86. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
  87. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +5 -4
  88. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
  89. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js +1 -1
  90. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js.map +1 -1
  91. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js +5 -4
  92. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js.map +1 -1
  93. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.cjs.js +1 -1
  94. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.cjs.js.map +1 -1
  95. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.es.js +9 -8
  96. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.es.js.map +1 -1
  97. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +1 -1
  98. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
  99. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +5 -4
  100. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
  101. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +1 -1
  102. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
  103. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +5 -4
  104. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
  105. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  106. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  107. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +5 -4
  108. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  109. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.cjs.js +1 -1
  110. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
  111. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.es.js +5 -4
  112. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
  113. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.cjs.js +1 -1
  114. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
  115. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.es.js +5 -4
  116. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
  117. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.cjs.js +1 -1
  118. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
  119. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.es.js +5 -4
  120. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
  121. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/DetailsPanelMoreMenu.cjs.js +1 -1
  122. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/DetailsPanelMoreMenu.cjs.js.map +1 -1
  123. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/DetailsPanelMoreMenu.es.js +5 -4
  124. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/DetailsPanelMoreMenu.es.js.map +1 -1
  125. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useContextAccess.cjs.js +1 -1
  126. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useContextAccess.cjs.js.map +1 -1
  127. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useContextAccess.es.js +5 -4
  128. package/dist/shared/src/containers/DetailsPanel/components/DetailsPanelMoreMenu/hooks/useContextAccess.es.js.map +1 -1
  129. package/dist/shared/src/containers/DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.cjs.js +1 -1
  130. package/dist/shared/src/containers/DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.cjs.js.map +1 -1
  131. package/dist/shared/src/containers/DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.es.js +17 -16
  132. package/dist/shared/src/containers/DetailsPanel/components/TabHeaderAndFilters/TabHeaderAndFilters.styled.es.js.map +1 -1
  133. package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.cjs.js +1 -1
  134. package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.cjs.js.map +1 -1
  135. package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.es.js +5 -4
  136. package/dist/shared/src/containers/DetailsPanel/containers/DetailsPanelSubtasks.es.js.map +1 -1
  137. package/dist/shared/src/containers/DetailsPanel/containers/FeedContextWrapper.cjs.js +1 -1
  138. package/dist/shared/src/containers/DetailsPanel/containers/FeedContextWrapper.cjs.js.map +1 -1
  139. package/dist/shared/src/containers/DetailsPanel/containers/FeedContextWrapper.es.js +5 -4
  140. package/dist/shared/src/containers/DetailsPanel/containers/FeedContextWrapper.es.js.map +1 -1
  141. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.cjs.js +1 -1
  142. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.cjs.js.map +1 -1
  143. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.es.js +5 -4
  144. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.es.js.map +1 -1
  145. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.cjs.js +1 -1
  146. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.cjs.js.map +1 -1
  147. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.es.js +5 -4
  148. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.es.js.map +1 -1
  149. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.cjs.js +1 -1
  150. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.cjs.js.map +1 -1
  151. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.es.js +5 -4
  152. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.es.js.map +1 -1
  153. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.cjs.js +1 -1
  154. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.cjs.js.map +1 -1
  155. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.es.js +5 -4
  156. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.es.js.map +1 -1
  157. package/dist/shared/src/containers/Feed/components/ActivityCheckbox/ActivityCheckbox.cjs.js +1 -1
  158. package/dist/shared/src/containers/Feed/components/ActivityCheckbox/ActivityCheckbox.cjs.js.map +1 -1
  159. package/dist/shared/src/containers/Feed/components/ActivityCheckbox/ActivityCheckbox.es.js +5 -4
  160. package/dist/shared/src/containers/Feed/components/ActivityCheckbox/ActivityCheckbox.es.js.map +1 -1
  161. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +1 -1
  162. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
  163. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +5 -4
  164. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
  165. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.cjs.js +1 -1
  166. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.cjs.js.map +1 -1
  167. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.es.js +5 -4
  168. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.es.js.map +1 -1
  169. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.cjs.js +1 -1
  170. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.cjs.js.map +1 -1
  171. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.es.js +7 -6
  172. package/dist/shared/src/containers/Feed/components/ActivityVersionReview/ActivityVersionReview.es.js.map +1 -1
  173. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js +1 -1
  174. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js.map +1 -1
  175. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js +5 -4
  176. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js.map +1 -1
  177. package/dist/shared/src/containers/Feed/components/CommentInput/helpers.cjs.js +1 -1
  178. package/dist/shared/src/containers/Feed/components/CommentInput/helpers.cjs.js.map +1 -1
  179. package/dist/shared/src/containers/Feed/components/CommentInput/helpers.es.js +9 -8
  180. package/dist/shared/src/containers/Feed/components/CommentInput/helpers.es.js.map +1 -1
  181. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js +1 -1
  182. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js.map +1 -1
  183. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js +5 -4
  184. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js.map +1 -1
  185. package/dist/shared/src/containers/ListTable/ListTable.cjs.js +1 -1
  186. package/dist/shared/src/containers/ListTable/ListTable.cjs.js.map +1 -1
  187. package/dist/shared/src/containers/ListTable/ListTable.es.js +5 -4
  188. package/dist/shared/src/containers/ListTable/ListTable.es.js.map +1 -1
  189. package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js +1 -1
  190. package/dist/shared/src/containers/ListTable/ListTableCell.cjs.js.map +1 -1
  191. package/dist/shared/src/containers/ListTable/ListTableCell.es.js +3 -2
  192. package/dist/shared/src/containers/ListTable/ListTableCell.es.js.map +1 -1
  193. package/dist/shared/src/containers/ListTable/ListTableHeader.cjs.js +1 -1
  194. package/dist/shared/src/containers/ListTable/ListTableHeader.cjs.js.map +1 -1
  195. package/dist/shared/src/containers/ListTable/ListTableHeader.es.js +5 -4
  196. package/dist/shared/src/containers/ListTable/ListTableHeader.es.js.map +1 -1
  197. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
  198. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  199. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +171 -168
  200. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  201. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  202. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  203. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +87 -85
  204. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  205. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnDndProvider.cjs.js +1 -1
  206. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnDndProvider.cjs.js.map +1 -1
  207. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnDndProvider.es.js +5 -4
  208. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnDndProvider.es.js.map +1 -1
  209. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.cjs.js +1 -1
  210. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.cjs.js.map +1 -1
  211. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.es.js +5 -4
  212. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.es.js.map +1 -1
  213. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
  214. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
  215. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +5 -4
  216. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
  217. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js +1 -1
  218. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js.map +1 -1
  219. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js +3 -2
  220. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js.map +1 -1
  221. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.cjs.js +1 -1
  222. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.cjs.js.map +1 -1
  223. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.es.js +5 -4
  224. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.es.js.map +1 -1
  225. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js.map +1 -1
  226. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js.map +1 -1
  227. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js +1 -1
  228. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js.map +1 -1
  229. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js +63 -58
  230. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js.map +1 -1
  231. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js +1 -1
  232. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js.map +1 -1
  233. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js +5 -4
  234. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js.map +1 -1
  235. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
  236. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
  237. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +8 -7
  238. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
  239. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js +1 -1
  240. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -1
  241. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js +5 -4
  242. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -1
  243. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js +1 -1
  244. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js.map +1 -1
  245. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js +3 -2
  246. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js.map +1 -1
  247. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js +1 -1
  248. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js.map +1 -1
  249. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js +3 -2
  250. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js.map +1 -1
  251. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.cjs.js +1 -1
  252. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.cjs.js.map +1 -1
  253. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.es.js +5 -4
  254. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.es.js.map +1 -1
  255. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.cjs.js +1 -1
  256. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.cjs.js.map +1 -1
  257. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.es.js +5 -4
  258. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.es.js.map +1 -1
  259. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +1 -1
  260. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
  261. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +248 -207
  262. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
  263. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js +1 -1
  264. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js.map +1 -1
  265. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js +5 -4
  266. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js.map +1 -1
  267. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.cjs.js +1 -1
  268. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.cjs.js.map +1 -1
  269. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.es.js +5 -4
  270. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.es.js.map +1 -1
  271. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js +1 -1
  272. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js.map +1 -1
  273. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js +3 -2
  274. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js.map +1 -1
  275. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.cjs.js +1 -1
  276. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.cjs.js.map +1 -1
  277. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.es.js +5 -4
  278. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.es.js.map +1 -1
  279. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.cjs.js +1 -1
  280. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.cjs.js.map +1 -1
  281. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.es.js +5 -4
  282. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.es.js.map +1 -1
  283. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +1 -1
  284. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
  285. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +5 -4
  286. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
  287. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js +1 -1
  288. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.cjs.js.map +1 -1
  289. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js +5 -4
  290. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSortBySettings.es.js.map +1 -1
  291. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js +1 -1
  292. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js.map +1 -1
  293. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js +16 -15
  294. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js.map +1 -1
  295. package/dist/shared/src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.cjs.js +1 -1
  296. package/dist/shared/src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.cjs.js.map +1 -1
  297. package/dist/shared/src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.es.js +66 -55
  298. package/dist/shared/src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.es.js.map +1 -1
  299. package/dist/shared/src/containers/ProjectTreeTable/widgets/BooleanWidget.cjs.js +1 -1
  300. package/dist/shared/src/containers/ProjectTreeTable/widgets/BooleanWidget.cjs.js.map +1 -1
  301. package/dist/shared/src/containers/ProjectTreeTable/widgets/BooleanWidget.es.js +5 -4
  302. package/dist/shared/src/containers/ProjectTreeTable/widgets/BooleanWidget.es.js.map +1 -1
  303. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +2 -2
  304. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
  305. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +47 -45
  306. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
  307. package/dist/shared/src/containers/ProjectTreeTable/widgets/CommentsWidget.cjs.js +1 -1
  308. package/dist/shared/src/containers/ProjectTreeTable/widgets/CommentsWidget.cjs.js.map +1 -1
  309. package/dist/shared/src/containers/ProjectTreeTable/widgets/CommentsWidget.es.js +5 -4
  310. package/dist/shared/src/containers/ProjectTreeTable/widgets/CommentsWidget.es.js.map +1 -1
  311. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.cjs.js +11 -1
  312. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.cjs.js.map +1 -1
  313. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.es.js +76 -51
  314. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.es.js.map +1 -1
  315. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.cjs.js +1 -1
  316. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.cjs.js.map +1 -1
  317. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.es.js +5 -4
  318. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.es.js.map +1 -1
  319. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js +1 -1
  320. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.cjs.js.map +1 -1
  321. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js +5 -4
  322. package/dist/shared/src/containers/ProjectTreeTable/widgets/SubtasksWidget.es.js.map +1 -1
  323. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +1 -1
  324. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
  325. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +5 -4
  326. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
  327. package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js +1 -1
  328. package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js.map +1 -1
  329. package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js +5 -4
  330. package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js.map +1 -1
  331. package/dist/shared/src/containers/Slicer/components/SlicerSearch.cjs.js +1 -1
  332. package/dist/shared/src/containers/Slicer/components/SlicerSearch.cjs.js.map +1 -1
  333. package/dist/shared/src/containers/Slicer/components/SlicerSearch.es.js +5 -4
  334. package/dist/shared/src/containers/Slicer/components/SlicerSearch.es.js.map +1 -1
  335. package/dist/shared/src/containers/Slicer/hooks/useSelectedEntityIds.cjs.js +1 -1
  336. package/dist/shared/src/containers/Slicer/hooks/useSelectedEntityIds.cjs.js.map +1 -1
  337. package/dist/shared/src/containers/Slicer/hooks/useSelectedEntityIds.es.js +5 -4
  338. package/dist/shared/src/containers/Slicer/hooks/useSelectedEntityIds.es.js.map +1 -1
  339. package/dist/shared/src/containers/Views/ViewsMenuContainer/BaseViewsTags.cjs.js +1 -1
  340. package/dist/shared/src/containers/Views/ViewsMenuContainer/BaseViewsTags.cjs.js.map +1 -1
  341. package/dist/shared/src/containers/Views/ViewsMenuContainer/BaseViewsTags.es.js +5 -4
  342. package/dist/shared/src/containers/Views/ViewsMenuContainer/BaseViewsTags.es.js.map +1 -1
  343. package/dist/shared/src/context/WebsocketContext.cjs.js +1 -1
  344. package/dist/shared/src/context/WebsocketContext.cjs.js.map +1 -1
  345. package/dist/shared/src/context/WebsocketContext.es.js +7 -6
  346. package/dist/shared/src/context/WebsocketContext.es.js.map +1 -1
  347. package/dist/types/containers/ProjectTreeTable/ProjectTreeTable.d.ts +1 -0
  348. package/dist/types/containers/ProjectTreeTable/context/ProjectTableContext.d.ts +1 -0
  349. package/dist/types/containers/ProjectTreeTable/context/ProjectTableProvider.d.ts +2 -1
  350. package/dist/types/containers/ProjectTreeTable/hooks/useFetchOverviewData.d.ts +1 -0
  351. package/dist/types/containers/ProjectTreeTable/types/overviewContext.d.ts +1 -0
  352. package/dist/types/containers/ProjectTreeTable/widgets/CellWidget.d.ts +1 -0
  353. package/dist/types/containers/ProjectTreeTable/widgets/LinksWidget.d.ts +1 -0
  354. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"cellUtils.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/utils/cellUtils.ts"],"sourcesContent":["/**\n * Shared cell utilities for table operations\n */\n\nimport { TaskLink } from '@shared/api'\nimport { parseRowId } from '../context'\nimport { EMapResult, EntitiesMap } from '../types'\n\n// Type definitions for cell identifiers\nexport type CellId = string\nexport type RowId = string\nexport type ColId = string\n\n// Cell position in the grid\nexport interface CellPosition {\n rowId: RowId\n colId: ColId\n}\n\n// Cell border position flags - used for determining which borders to show\nexport enum BorderPosition {\n None = 0,\n Top = 1 << 0,\n Right = 1 << 1,\n Bottom = 1 << 2,\n Left = 1 << 3,\n All = Top | Right | Bottom | Left,\n}\n\n/**\n * Create a standardized cell ID from row and column IDs\n */\nexport const getCellId = (rowId: RowId, colId: ColId): CellId => `cell-${rowId}-${colId}`\n\n/**\n * Parse a cell ID to extract row and column IDs\n * @returns CellPosition or null if invalid format\n */\nexport const parseCellId = (cellId: CellId): CellPosition | null => {\n const match = cellId.match(/^cell-(.+)-(.+)$/)\n if (!match) return null\n return { rowId: match[1], colId: match[2] }\n}\n\nexport const getCellValue = (obj: any, path: string): any => {\n if (!obj || !path) return undefined\n\n const parts = path.split('_')\n let current = obj\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = current[part]\n } else {\n return undefined // Return undefined if any part of the path is invalid\n }\n }\n\n return current\n}\n\n// return the link entity ids for a given column id\nexport const getLinkEntityIdsByColumnId = (links: TaskLink[], columnId: CellId): string => {\n // split the columnId\n const [_link, linkType, _inType, _outType, direction] = columnId.split('_')\n const cellLinks = links.filter(\n (link) => link.linkType === linkType && link.direction === direction,\n )\n if (cellLinks.length) {\n return cellLinks.map((link) => link.node.id).join(',')\n } else {\n return ''\n }\n}\n\n/**\n * Determines which borders to display for a selected cell\n * based on its position within the selection grid\n *\n * @param rowIndex Current cell's row index\n * @param colIndex Current cell's column index\n * @param selectedCells 2D array representing selection state (true = selected)\n * @returns BorderPosition flags indicating which borders to display\n */\nexport const getCellBorders = (\n rowIndex: number,\n colIndex: number,\n selectedCells: boolean[][],\n): BorderPosition => {\n if (!selectedCells[rowIndex]?.[colIndex]) {\n return BorderPosition.None\n }\n\n let borders = BorderPosition.None\n\n // Check top border\n if (rowIndex === 0 || !selectedCells[rowIndex - 1]?.[colIndex]) {\n borders |= BorderPosition.Top\n }\n\n // Check right border\n if (!selectedCells[rowIndex]?.[colIndex + 1]) {\n borders |= BorderPosition.Right\n }\n\n // Check bottom border\n if (!selectedCells[rowIndex + 1]?.[colIndex]) {\n borders |= BorderPosition.Bottom\n }\n\n // Check left border\n if (colIndex === 0 || !selectedCells[rowIndex]?.[colIndex - 1]) {\n borders |= BorderPosition.Left\n }\n\n return borders\n}\n\n/**\n * Converts border position flags to CSS classes for shadow styling\n */\nexport const getBorderClasses = (borders: BorderPosition): string[] => {\n const classes: string[] = []\n\n if (borders & BorderPosition.Top) classes.push('shadow-top')\n if (borders & BorderPosition.Right) classes.push('shadow-right')\n if (borders & BorderPosition.Bottom) classes.push('shadow-bottom')\n if (borders & BorderPosition.Left) classes.push('shadow-left')\n\n return classes\n}\n\n// get a entity from it's id\nexport const getEntityDataById = <T extends 'folder' | 'task' | 'product' | 'version'>(\n id: string,\n entitiesMap: EntitiesMap,\n) => entitiesMap.get(parseRowId(id)) as EMapResult<T> | undefined\n"],"names":["BorderPosition","getCellId","rowId","colId","parseCellId","cellId","match","getCellValue","obj","path","parts","current","part","getLinkEntityIdsByColumnId","links","columnId","_link","linkType","_inType","_outType","direction","cellLinks","link","getCellBorders","rowIndex","colIndex","selectedCells","borders","getBorderClasses","classes","getEntityDataById","id","entitiesMap","parseRowId"],"mappings":"ykhBAoBO,IAAKA,GAAAA,IACVA,EAAAA,EAAA,KAAO,CAAA,EAAP,OACAA,EAAAA,EAAA,IAAM,CAAA,EAAN,MACAA,EAAAA,EAAA,MAAQ,CAAA,EAAR,QACAA,EAAAA,EAAA,OAAS,CAAA,EAAT,SACAA,EAAAA,EAAA,KAAO,CAAA,EAAP,OACAA,EAAAA,EAAA,IAAM,EAAA,EAAN,MANUA,IAAAA,GAAA,CAAA,CAAA,EAYL,MAAMC,EAAY,CAACC,EAAcC,IAAyB,QAAQD,CAAK,IAAIC,CAAK,GAM1EC,EAAeC,GAAwC,CAClE,MAAMC,EAAQD,EAAO,MAAM,kBAAkB,EAC7C,OAAKC,EACE,CAAE,MAAOA,EAAM,CAAC,EAAG,MAAOA,EAAM,CAAC,CAAA,EADrB,IAErB,EAEaC,EAAe,CAACC,EAAUC,IAAsB,CAC3D,GAAI,CAACD,GAAO,CAACC,EAAM,OAEnB,MAAMC,EAAQD,EAAK,MAAM,GAAG,EAC5B,IAAIE,EAAUH,EAEd,UAAWI,KAAQF,EACjB,GAAIC,GAAW,OAAOA,GAAY,UAAYC,KAAQD,EACpDA,EAAUA,EAAQC,CAAI,MAEtB,QAIJ,OAAOD,CACT,EAGaE,EAA6B,CAACC,EAAmBC,IAA6B,CAEzF,KAAM,CAACC,EAAOC,EAAUC,EAASC,EAAUC,CAAS,EAAIL,EAAS,MAAM,GAAG,EACpEM,EAAYP,EAAM,OACrBQ,GAASA,EAAK,WAAaL,GAAYK,EAAK,YAAcF,CAAA,EAE7D,OAAIC,EAAU,OACLA,EAAU,IAAKC,GAASA,EAAK,KAAK,EAAE,EAAE,KAAK,GAAG,EAE9C,EAEX,EAWaC,EAAiB,CAC5BC,EACAC,EACAC,IACmB,CACnB,GAAI,CAACA,EAAcF,CAAQ,IAAIC,CAAQ,EACrC,MAAO,GAGT,IAAIE,EAAU,EAGd,OAAIH,IAAa,GAAK,CAACE,EAAcF,EAAW,CAAC,IAAIC,CAAQ,KAC3DE,GAAW,GAIRD,EAAcF,CAAQ,IAAIC,EAAW,CAAC,IACzCE,GAAW,GAIRD,EAAcF,EAAW,CAAC,IAAIC,CAAQ,IACzCE,GAAW,IAITF,IAAa,GAAK,CAACC,EAAcF,CAAQ,IAAIC,EAAW,CAAC,KAC3DE,GAAW,GAGNA,CACT,EAKaC,EAAoBD,GAAsC,CACrE,MAAME,EAAoB,CAAA,EAE1B,OAAIF,EAAU,GAAoBE,EAAQ,KAAK,YAAY,EACvDF,EAAU,GAAsBE,EAAQ,KAAK,cAAc,EAC3DF,EAAU,GAAuBE,EAAQ,KAAK,eAAe,EAC7DF,EAAU,GAAqBE,EAAQ,KAAK,aAAa,EAEtDA,CACT,EAGaC,EAAoB,CAC/BC,EACAC,IACGA,EAAY,IAAIC,EAAAA,WAAWF,CAAE,CAAC"}
1
+ {"version":3,"file":"cellUtils.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/utils/cellUtils.ts"],"sourcesContent":["/**\n * Shared cell utilities for table operations\n */\n\nimport { TaskLink } from '@shared/api'\nimport { parseRowId } from '../context'\nimport { EMapResult, EntitiesMap } from '../types'\n\n// Type definitions for cell identifiers\nexport type CellId = string\nexport type RowId = string\nexport type ColId = string\n\n// Cell position in the grid\nexport interface CellPosition {\n rowId: RowId\n colId: ColId\n}\n\n// Cell border position flags - used for determining which borders to show\nexport enum BorderPosition {\n None = 0,\n Top = 1 << 0,\n Right = 1 << 1,\n Bottom = 1 << 2,\n Left = 1 << 3,\n All = Top | Right | Bottom | Left,\n}\n\n/**\n * Create a standardized cell ID from row and column IDs\n */\nexport const getCellId = (rowId: RowId, colId: ColId): CellId => `cell-${rowId}-${colId}`\n\n/**\n * Parse a cell ID to extract row and column IDs\n * @returns CellPosition or null if invalid format\n */\nexport const parseCellId = (cellId: CellId): CellPosition | null => {\n const match = cellId.match(/^cell-(.+)-(.+)$/)\n if (!match) return null\n return { rowId: match[1], colId: match[2] }\n}\n\nexport const getCellValue = (obj: any, path: string): any => {\n if (!obj || !path) return undefined\n\n const parts = path.split('_')\n let current = obj\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = current[part]\n } else {\n return undefined // Return undefined if any part of the path is invalid\n }\n }\n\n return current\n}\n\n// return the link entity ids for a given column id\nexport const getLinkEntityIdsByColumnId = (links: TaskLink[], columnId: CellId): string => {\n // split the columnId\n const [_link, linkType, _inType, _outType, direction] = columnId.split('_')\n const cellLinks = links.filter(\n (link) => link.linkType === linkType && link.direction === direction,\n )\n if (cellLinks.length) {\n return cellLinks.map((link) => link.node.id).join(',')\n } else {\n return ''\n }\n}\n\n/**\n * Determines which borders to display for a selected cell\n * based on its position within the selection grid\n *\n * @param rowIndex Current cell's row index\n * @param colIndex Current cell's column index\n * @param selectedCells 2D array representing selection state (true = selected)\n * @returns BorderPosition flags indicating which borders to display\n */\nexport const getCellBorders = (\n rowIndex: number,\n colIndex: number,\n selectedCells: boolean[][],\n): BorderPosition => {\n if (!selectedCells[rowIndex]?.[colIndex]) {\n return BorderPosition.None\n }\n\n let borders = BorderPosition.None\n\n // Check top border\n if (rowIndex === 0 || !selectedCells[rowIndex - 1]?.[colIndex]) {\n borders |= BorderPosition.Top\n }\n\n // Check right border\n if (!selectedCells[rowIndex]?.[colIndex + 1]) {\n borders |= BorderPosition.Right\n }\n\n // Check bottom border\n if (!selectedCells[rowIndex + 1]?.[colIndex]) {\n borders |= BorderPosition.Bottom\n }\n\n // Check left border\n if (colIndex === 0 || !selectedCells[rowIndex]?.[colIndex - 1]) {\n borders |= BorderPosition.Left\n }\n\n return borders\n}\n\n/**\n * Converts border position flags to CSS classes for shadow styling\n */\nexport const getBorderClasses = (borders: BorderPosition): string[] => {\n const classes: string[] = []\n\n if (borders & BorderPosition.Top) classes.push('shadow-top')\n if (borders & BorderPosition.Right) classes.push('shadow-right')\n if (borders & BorderPosition.Bottom) classes.push('shadow-bottom')\n if (borders & BorderPosition.Left) classes.push('shadow-left')\n\n return classes\n}\n\n// get a entity from it's id\nexport const getEntityDataById = <T extends 'folder' | 'task' | 'product' | 'version'>(\n id: string,\n entitiesMap: EntitiesMap,\n) => entitiesMap.get(parseRowId(id)) as EMapResult<T> | undefined\n"],"names":["BorderPosition","getCellId","rowId","colId","parseCellId","cellId","match","getCellValue","obj","path","parts","current","part","getLinkEntityIdsByColumnId","links","columnId","_link","linkType","_inType","_outType","direction","cellLinks","link","getCellBorders","rowIndex","colIndex","selectedCells","borders","getBorderClasses","classes","getEntityDataById","id","entitiesMap","parseRowId"],"mappings":"knhBAoBO,IAAKA,GAAAA,IACVA,EAAAA,EAAA,KAAO,CAAA,EAAP,OACAA,EAAAA,EAAA,IAAM,CAAA,EAAN,MACAA,EAAAA,EAAA,MAAQ,CAAA,EAAR,QACAA,EAAAA,EAAA,OAAS,CAAA,EAAT,SACAA,EAAAA,EAAA,KAAO,CAAA,EAAP,OACAA,EAAAA,EAAA,IAAM,EAAA,EAAN,MANUA,IAAAA,GAAA,CAAA,CAAA,EAYL,MAAMC,EAAY,CAACC,EAAcC,IAAyB,QAAQD,CAAK,IAAIC,CAAK,GAM1EC,EAAeC,GAAwC,CAClE,MAAMC,EAAQD,EAAO,MAAM,kBAAkB,EAC7C,OAAKC,EACE,CAAE,MAAOA,EAAM,CAAC,EAAG,MAAOA,EAAM,CAAC,CAAA,EADrB,IAErB,EAEaC,EAAe,CAACC,EAAUC,IAAsB,CAC3D,GAAI,CAACD,GAAO,CAACC,EAAM,OAEnB,MAAMC,EAAQD,EAAK,MAAM,GAAG,EAC5B,IAAIE,EAAUH,EAEd,UAAWI,KAAQF,EACjB,GAAIC,GAAW,OAAOA,GAAY,UAAYC,KAAQD,EACpDA,EAAUA,EAAQC,CAAI,MAEtB,QAIJ,OAAOD,CACT,EAGaE,EAA6B,CAACC,EAAmBC,IAA6B,CAEzF,KAAM,CAACC,EAAOC,EAAUC,EAASC,EAAUC,CAAS,EAAIL,EAAS,MAAM,GAAG,EACpEM,EAAYP,EAAM,OACrBQ,GAASA,EAAK,WAAaL,GAAYK,EAAK,YAAcF,CAAA,EAE7D,OAAIC,EAAU,OACLA,EAAU,IAAKC,GAASA,EAAK,KAAK,EAAE,EAAE,KAAK,GAAG,EAE9C,EAEX,EAWaC,EAAiB,CAC5BC,EACAC,EACAC,IACmB,CACnB,GAAI,CAACA,EAAcF,CAAQ,IAAIC,CAAQ,EACrC,MAAO,GAGT,IAAIE,EAAU,EAGd,OAAIH,IAAa,GAAK,CAACE,EAAcF,EAAW,CAAC,IAAIC,CAAQ,KAC3DE,GAAW,GAIRD,EAAcF,CAAQ,IAAIC,EAAW,CAAC,IACzCE,GAAW,GAIRD,EAAcF,EAAW,CAAC,IAAIC,CAAQ,IACzCE,GAAW,IAITF,IAAa,GAAK,CAACC,EAAcF,CAAQ,IAAIC,EAAW,CAAC,KAC3DE,GAAW,GAGNA,CACT,EAKaC,EAAoBD,GAAsC,CACrE,MAAME,EAAoB,CAAA,EAE1B,OAAIF,EAAU,GAAoBE,EAAQ,KAAK,YAAY,EACvDF,EAAU,GAAsBE,EAAQ,KAAK,cAAc,EAC3DF,EAAU,GAAuBE,EAAQ,KAAK,eAAe,EAC7DF,EAAU,GAAqBE,EAAQ,KAAK,aAAa,EAEtDA,CACT,EAGaC,EAAoB,CAC/BC,EACAC,IACGA,EAAY,IAAIC,EAAAA,WAAWF,CAAE,CAAC"}
@@ -205,8 +205,7 @@ import "../widgets/CellWidget.es.js";
205
205
  import "../widgets/EntityNameWidget.es.js";
206
206
  import "../widgets/GroupHeaderWidget.es.js";
207
207
  import "../widgets/ThumbnailWidget.es.js";
208
- import "../context/DetailsPanelEntityContext.es.js";
209
- import "../context/SelectedRowsContext.es.js";
208
+ import "../widgets/LinksWidget.es.js";
210
209
  import "../../../components/LinksManager/LinksManager.styled.es.js";
211
210
  import "../context/ProjectTableContext.es.js";
212
211
  import "../widgets/EmptyWidget.es.js";
@@ -225,7 +224,9 @@ import "../context/SelectionCellsContext.es.js";
225
224
  import "../context/ProjectDataContext.es.js";
226
225
  import "../context/CellEditingContext.es.js";
227
226
  import "../components/TableFooterRow.es.js";
227
+ import "../context/SelectedRowsContext.es.js";
228
228
  import "../context/ColumnSettingsContext.es.js";
229
+ import "../context/DetailsPanelEntityContext.es.js";
229
230
  import "../../EntityPickerDialog/EntityPickerDialog.es.js";
230
231
  import "../../Slicer/components/Slicer.es.js";
231
232
  import "../../Slicer/context/SlicerContext.es.js";
@@ -289,10 +290,10 @@ import "../../../components/ReviewablesSelector/ReviewablesSelector.es.js";
289
290
  import "../../../components/ColumnHeaderMenuUI.es.js";
290
291
  import { parseRowId as u } from "../context/ProjectTableProvider.es.js";
291
292
  var l = /* @__PURE__ */ ((t) => (t[t.None = 0] = "None", t[t.Top = 1] = "Top", t[t.Right = 2] = "Right", t[t.Bottom = 4] = "Bottom", t[t.Left = 8] = "Left", t[t.All = 15] = "All", t))(l || {});
292
- const Vm = (t, p) => `cell-${t}-${p}`, qm = (t) => {
293
+ const qm = (t, p) => `cell-${t}-${p}`, zm = (t) => {
293
294
  const p = t.match(/^cell-(.+)-(.+)$/);
294
295
  return p ? { rowId: p[1], colId: p[2] } : null;
295
- }, zm = (t, p) => {
296
+ }, Fm = (t, p) => {
296
297
  if (!t || !p) return;
297
298
  const r = p.split("_");
298
299
  let i = t;
@@ -302,28 +303,28 @@ const Vm = (t, p) => `cell-${t}-${p}`, qm = (t) => {
302
303
  else
303
304
  return;
304
305
  return i;
305
- }, Fm = (t, p) => {
306
+ }, Gm = (t, p) => {
306
307
  const [r, i, o, e, n] = p.split("_"), f = t.filter(
307
308
  (m) => m.linkType === i && m.direction === n
308
309
  );
309
310
  return f.length ? f.map((m) => m.node.id).join(",") : "";
310
- }, Gm = (t, p, r) => {
311
+ }, Hm = (t, p, r) => {
311
312
  if (!r[t]?.[p])
312
313
  return 0;
313
314
  let i = 0;
314
315
  return (t === 0 || !r[t - 1]?.[p]) && (i |= 1), r[t]?.[p + 1] || (i |= 2), r[t + 1]?.[p] || (i |= 4), (p === 0 || !r[t]?.[p - 1]) && (i |= 8), i;
315
- }, Hm = (t) => {
316
+ }, Jm = (t) => {
316
317
  const p = [];
317
318
  return t & 1 && p.push("shadow-top"), t & 2 && p.push("shadow-right"), t & 4 && p.push("shadow-bottom"), t & 8 && p.push("shadow-left"), p;
318
- }, Jm = (t, p) => p.get(u(t));
319
+ }, Km = (t, p) => p.get(u(t));
319
320
  export {
320
321
  l as BorderPosition,
321
- Hm as getBorderClasses,
322
- Gm as getCellBorders,
323
- Vm as getCellId,
324
- zm as getCellValue,
325
- Jm as getEntityDataById,
326
- Fm as getLinkEntityIdsByColumnId,
327
- qm as parseCellId
322
+ Jm as getBorderClasses,
323
+ Hm as getCellBorders,
324
+ qm as getCellId,
325
+ Fm as getCellValue,
326
+ Km as getEntityDataById,
327
+ Gm as getLinkEntityIdsByColumnId,
328
+ zm as parseCellId
328
329
  };
329
330
  //# sourceMappingURL=cellUtils.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cellUtils.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/utils/cellUtils.ts"],"sourcesContent":["/**\n * Shared cell utilities for table operations\n */\n\nimport { TaskLink } from '@shared/api'\nimport { parseRowId } from '../context'\nimport { EMapResult, EntitiesMap } from '../types'\n\n// Type definitions for cell identifiers\nexport type CellId = string\nexport type RowId = string\nexport type ColId = string\n\n// Cell position in the grid\nexport interface CellPosition {\n rowId: RowId\n colId: ColId\n}\n\n// Cell border position flags - used for determining which borders to show\nexport enum BorderPosition {\n None = 0,\n Top = 1 << 0,\n Right = 1 << 1,\n Bottom = 1 << 2,\n Left = 1 << 3,\n All = Top | Right | Bottom | Left,\n}\n\n/**\n * Create a standardized cell ID from row and column IDs\n */\nexport const getCellId = (rowId: RowId, colId: ColId): CellId => `cell-${rowId}-${colId}`\n\n/**\n * Parse a cell ID to extract row and column IDs\n * @returns CellPosition or null if invalid format\n */\nexport const parseCellId = (cellId: CellId): CellPosition | null => {\n const match = cellId.match(/^cell-(.+)-(.+)$/)\n if (!match) return null\n return { rowId: match[1], colId: match[2] }\n}\n\nexport const getCellValue = (obj: any, path: string): any => {\n if (!obj || !path) return undefined\n\n const parts = path.split('_')\n let current = obj\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = current[part]\n } else {\n return undefined // Return undefined if any part of the path is invalid\n }\n }\n\n return current\n}\n\n// return the link entity ids for a given column id\nexport const getLinkEntityIdsByColumnId = (links: TaskLink[], columnId: CellId): string => {\n // split the columnId\n const [_link, linkType, _inType, _outType, direction] = columnId.split('_')\n const cellLinks = links.filter(\n (link) => link.linkType === linkType && link.direction === direction,\n )\n if (cellLinks.length) {\n return cellLinks.map((link) => link.node.id).join(',')\n } else {\n return ''\n }\n}\n\n/**\n * Determines which borders to display for a selected cell\n * based on its position within the selection grid\n *\n * @param rowIndex Current cell's row index\n * @param colIndex Current cell's column index\n * @param selectedCells 2D array representing selection state (true = selected)\n * @returns BorderPosition flags indicating which borders to display\n */\nexport const getCellBorders = (\n rowIndex: number,\n colIndex: number,\n selectedCells: boolean[][],\n): BorderPosition => {\n if (!selectedCells[rowIndex]?.[colIndex]) {\n return BorderPosition.None\n }\n\n let borders = BorderPosition.None\n\n // Check top border\n if (rowIndex === 0 || !selectedCells[rowIndex - 1]?.[colIndex]) {\n borders |= BorderPosition.Top\n }\n\n // Check right border\n if (!selectedCells[rowIndex]?.[colIndex + 1]) {\n borders |= BorderPosition.Right\n }\n\n // Check bottom border\n if (!selectedCells[rowIndex + 1]?.[colIndex]) {\n borders |= BorderPosition.Bottom\n }\n\n // Check left border\n if (colIndex === 0 || !selectedCells[rowIndex]?.[colIndex - 1]) {\n borders |= BorderPosition.Left\n }\n\n return borders\n}\n\n/**\n * Converts border position flags to CSS classes for shadow styling\n */\nexport const getBorderClasses = (borders: BorderPosition): string[] => {\n const classes: string[] = []\n\n if (borders & BorderPosition.Top) classes.push('shadow-top')\n if (borders & BorderPosition.Right) classes.push('shadow-right')\n if (borders & BorderPosition.Bottom) classes.push('shadow-bottom')\n if (borders & BorderPosition.Left) classes.push('shadow-left')\n\n return classes\n}\n\n// get a entity from it's id\nexport const getEntityDataById = <T extends 'folder' | 'task' | 'product' | 'version'>(\n id: string,\n entitiesMap: EntitiesMap,\n) => entitiesMap.get(parseRowId(id)) as EMapResult<T> | undefined\n"],"names":["BorderPosition","getCellId","rowId","colId","parseCellId","cellId","match","getCellValue","obj","path","parts","current","part","getLinkEntityIdsByColumnId","links","columnId","_link","linkType","_inType","_outType","direction","cellLinks","link","getCellBorders","rowIndex","colIndex","selectedCells","borders","getBorderClasses","classes","getEntityDataById","id","entitiesMap","parseRowId"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,IAAKA,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,MAAM,EAAA,IAAN,OANUA,IAAAA,KAAA,CAAA,CAAA;AAYL,MAAMC,KAAY,CAACC,GAAcC,MAAyB,QAAQD,CAAK,IAAIC,CAAK,IAM1EC,KAAc,CAACC,MAAwC;AAClE,QAAMC,IAAQD,EAAO,MAAM,kBAAkB;AAC7C,SAAKC,IACE,EAAE,OAAOA,EAAM,CAAC,GAAG,OAAOA,EAAM,CAAC,EAAA,IADrB;AAErB,GAEaC,KAAe,CAACC,GAAUC,MAAsB;AAC3D,MAAI,CAACD,KAAO,CAACC,EAAM;AAEnB,QAAMC,IAAQD,EAAK,MAAM,GAAG;AAC5B,MAAIE,IAAUH;AAEd,aAAWI,KAAQF;AACjB,QAAIC,KAAW,OAAOA,KAAY,YAAYC,KAAQD;AACpD,MAAAA,IAAUA,EAAQC,CAAI;AAAA;AAEtB;AAIJ,SAAOD;AACT,GAGaE,KAA6B,CAACC,GAAmBC,MAA6B;AAEzF,QAAM,CAACC,GAAOC,GAAUC,GAASC,GAAUC,CAAS,IAAIL,EAAS,MAAM,GAAG,GACpEM,IAAYP,EAAM;AAAA,IACtB,CAACQ,MAASA,EAAK,aAAaL,KAAYK,EAAK,cAAcF;AAAA,EAAA;AAE7D,SAAIC,EAAU,SACLA,EAAU,IAAI,CAACC,MAASA,EAAK,KAAK,EAAE,EAAE,KAAK,GAAG,IAE9C;AAEX,GAWaC,KAAiB,CAC5BC,GACAC,GACAC,MACmB;AACnB,MAAI,CAACA,EAAcF,CAAQ,IAAIC,CAAQ;AACrC,WAAO;AAGT,MAAIE,IAAU;AAGd,UAAIH,MAAa,KAAK,CAACE,EAAcF,IAAW,CAAC,IAAIC,CAAQ,OAC3DE,KAAW,IAIRD,EAAcF,CAAQ,IAAIC,IAAW,CAAC,MACzCE,KAAW,IAIRD,EAAcF,IAAW,CAAC,IAAIC,CAAQ,MACzCE,KAAW,KAITF,MAAa,KAAK,CAACC,EAAcF,CAAQ,IAAIC,IAAW,CAAC,OAC3DE,KAAW,IAGNA;AACT,GAKaC,KAAmB,CAACD,MAAsC;AACrE,QAAME,IAAoB,CAAA;AAE1B,SAAIF,IAAU,KAAoBE,EAAQ,KAAK,YAAY,GACvDF,IAAU,KAAsBE,EAAQ,KAAK,cAAc,GAC3DF,IAAU,KAAuBE,EAAQ,KAAK,eAAe,GAC7DF,IAAU,KAAqBE,EAAQ,KAAK,aAAa,GAEtDA;AACT,GAGaC,KAAoB,CAC/BC,GACAC,MACGA,EAAY,IAAIC,EAAWF,CAAE,CAAC;"}
1
+ {"version":3,"file":"cellUtils.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/utils/cellUtils.ts"],"sourcesContent":["/**\n * Shared cell utilities for table operations\n */\n\nimport { TaskLink } from '@shared/api'\nimport { parseRowId } from '../context'\nimport { EMapResult, EntitiesMap } from '../types'\n\n// Type definitions for cell identifiers\nexport type CellId = string\nexport type RowId = string\nexport type ColId = string\n\n// Cell position in the grid\nexport interface CellPosition {\n rowId: RowId\n colId: ColId\n}\n\n// Cell border position flags - used for determining which borders to show\nexport enum BorderPosition {\n None = 0,\n Top = 1 << 0,\n Right = 1 << 1,\n Bottom = 1 << 2,\n Left = 1 << 3,\n All = Top | Right | Bottom | Left,\n}\n\n/**\n * Create a standardized cell ID from row and column IDs\n */\nexport const getCellId = (rowId: RowId, colId: ColId): CellId => `cell-${rowId}-${colId}`\n\n/**\n * Parse a cell ID to extract row and column IDs\n * @returns CellPosition or null if invalid format\n */\nexport const parseCellId = (cellId: CellId): CellPosition | null => {\n const match = cellId.match(/^cell-(.+)-(.+)$/)\n if (!match) return null\n return { rowId: match[1], colId: match[2] }\n}\n\nexport const getCellValue = (obj: any, path: string): any => {\n if (!obj || !path) return undefined\n\n const parts = path.split('_')\n let current = obj\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = current[part]\n } else {\n return undefined // Return undefined if any part of the path is invalid\n }\n }\n\n return current\n}\n\n// return the link entity ids for a given column id\nexport const getLinkEntityIdsByColumnId = (links: TaskLink[], columnId: CellId): string => {\n // split the columnId\n const [_link, linkType, _inType, _outType, direction] = columnId.split('_')\n const cellLinks = links.filter(\n (link) => link.linkType === linkType && link.direction === direction,\n )\n if (cellLinks.length) {\n return cellLinks.map((link) => link.node.id).join(',')\n } else {\n return ''\n }\n}\n\n/**\n * Determines which borders to display for a selected cell\n * based on its position within the selection grid\n *\n * @param rowIndex Current cell's row index\n * @param colIndex Current cell's column index\n * @param selectedCells 2D array representing selection state (true = selected)\n * @returns BorderPosition flags indicating which borders to display\n */\nexport const getCellBorders = (\n rowIndex: number,\n colIndex: number,\n selectedCells: boolean[][],\n): BorderPosition => {\n if (!selectedCells[rowIndex]?.[colIndex]) {\n return BorderPosition.None\n }\n\n let borders = BorderPosition.None\n\n // Check top border\n if (rowIndex === 0 || !selectedCells[rowIndex - 1]?.[colIndex]) {\n borders |= BorderPosition.Top\n }\n\n // Check right border\n if (!selectedCells[rowIndex]?.[colIndex + 1]) {\n borders |= BorderPosition.Right\n }\n\n // Check bottom border\n if (!selectedCells[rowIndex + 1]?.[colIndex]) {\n borders |= BorderPosition.Bottom\n }\n\n // Check left border\n if (colIndex === 0 || !selectedCells[rowIndex]?.[colIndex - 1]) {\n borders |= BorderPosition.Left\n }\n\n return borders\n}\n\n/**\n * Converts border position flags to CSS classes for shadow styling\n */\nexport const getBorderClasses = (borders: BorderPosition): string[] => {\n const classes: string[] = []\n\n if (borders & BorderPosition.Top) classes.push('shadow-top')\n if (borders & BorderPosition.Right) classes.push('shadow-right')\n if (borders & BorderPosition.Bottom) classes.push('shadow-bottom')\n if (borders & BorderPosition.Left) classes.push('shadow-left')\n\n return classes\n}\n\n// get a entity from it's id\nexport const getEntityDataById = <T extends 'folder' | 'task' | 'product' | 'version'>(\n id: string,\n entitiesMap: EntitiesMap,\n) => entitiesMap.get(parseRowId(id)) as EMapResult<T> | undefined\n"],"names":["BorderPosition","getCellId","rowId","colId","parseCellId","cellId","match","getCellValue","obj","path","parts","current","part","getLinkEntityIdsByColumnId","links","columnId","_link","linkType","_inType","_outType","direction","cellLinks","link","getCellBorders","rowIndex","colIndex","selectedCells","borders","getBorderClasses","classes","getEntityDataById","id","entitiesMap","parseRowId"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,IAAKA,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,MAAM,EAAA,IAAN,OANUA,IAAAA,KAAA,CAAA,CAAA;AAYL,MAAMC,KAAY,CAACC,GAAcC,MAAyB,QAAQD,CAAK,IAAIC,CAAK,IAM1EC,KAAc,CAACC,MAAwC;AAClE,QAAMC,IAAQD,EAAO,MAAM,kBAAkB;AAC7C,SAAKC,IACE,EAAE,OAAOA,EAAM,CAAC,GAAG,OAAOA,EAAM,CAAC,EAAA,IADrB;AAErB,GAEaC,KAAe,CAACC,GAAUC,MAAsB;AAC3D,MAAI,CAACD,KAAO,CAACC,EAAM;AAEnB,QAAMC,IAAQD,EAAK,MAAM,GAAG;AAC5B,MAAIE,IAAUH;AAEd,aAAWI,KAAQF;AACjB,QAAIC,KAAW,OAAOA,KAAY,YAAYC,KAAQD;AACpD,MAAAA,IAAUA,EAAQC,CAAI;AAAA;AAEtB;AAIJ,SAAOD;AACT,GAGaE,KAA6B,CAACC,GAAmBC,MAA6B;AAEzF,QAAM,CAACC,GAAOC,GAAUC,GAASC,GAAUC,CAAS,IAAIL,EAAS,MAAM,GAAG,GACpEM,IAAYP,EAAM;AAAA,IACtB,CAACQ,MAASA,EAAK,aAAaL,KAAYK,EAAK,cAAcF;AAAA,EAAA;AAE7D,SAAIC,EAAU,SACLA,EAAU,IAAI,CAACC,MAASA,EAAK,KAAK,EAAE,EAAE,KAAK,GAAG,IAE9C;AAEX,GAWaC,KAAiB,CAC5BC,GACAC,GACAC,MACmB;AACnB,MAAI,CAACA,EAAcF,CAAQ,IAAIC,CAAQ;AACrC,WAAO;AAGT,MAAIE,IAAU;AAGd,UAAIH,MAAa,KAAK,CAACE,EAAcF,IAAW,CAAC,IAAIC,CAAQ,OAC3DE,KAAW,IAIRD,EAAcF,CAAQ,IAAIC,IAAW,CAAC,MACzCE,KAAW,IAIRD,EAAcF,IAAW,CAAC,IAAIC,CAAQ,MACzCE,KAAW,KAITF,MAAa,KAAK,CAACC,EAAcF,CAAQ,IAAIC,IAAW,CAAC,OAC3DE,KAAW,IAGNA;AACT,GAKaC,KAAmB,CAACD,MAAsC;AACrE,QAAME,IAAoB,CAAA;AAE1B,SAAIF,IAAU,KAAoBE,EAAQ,KAAK,YAAY,GACvDF,IAAU,KAAsBE,EAAQ,KAAK,cAAc,GAC3DF,IAAU,KAAuBE,EAAQ,KAAK,eAAe,GAC7DF,IAAU,KAAqBE,EAAQ,KAAK,aAAa,GAEtDA;AACT,GAGaC,KAAoB,CAC/BC,GACAC,MACGA,EAAY,IAAIC,EAAWF,CAAE,CAAC;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("@ynput/ayon-react-components"),a=require("date-fns"),O=require("../../../components/SearchFilter/filterDates.cjs.js"),p=require("./expandRelativeDates.cjs.js"),M=(e,l)=>{if(!e?.conditions||e.conditions.length===0)return[];const t=[],s=new Set;return e.conditions.forEach(n=>{if("key"in n){const i=R(n,l,s);i&&t.push(i)}else{const i=b(n,l);if(i)t.push(i);else{const r=M(n,l);t.push(...r)}}}),t},b=(e,l)=>{if(!e.conditions||e.conditions.length<1)return null;const t=e.conditions.filter(u=>"key"in u);if(t.length!==e.conditions.length)return null;const s=t[0].key;if(!t.every(u=>u.key===s))return null;const n=h(s,l);if(!n||n.type!=="datetime")return null;const i=t.find(u=>u.operator==="gte"),r=t.find(u=>u.operator==="lte");if(!i&&!r)return null;const o=i?.value,d=r?.value,f=o&&p.isRelativeDateValue(o)?p.resolveRelativeValue(o):o,c=d&&p.isRelativeDateValue(d)?p.resolveRelativeValue(d):d;let g="Custom range";if(f&&c){const u=O.detectRelativeDatePattern(f,c);if(u)g=u.label;else{const V=a.parseISO(f),y=a.parseISO(c);if(a.isValid(V)&&a.isValid(y)){const v=new Date().getFullYear(),C=y.getFullYear()===v?"MMM d":"MMM d, yyyy";g=`${a.format(V,"MMM d")} – ${a.format(y,C)}`}}}const S={id:`custom-${f||""}-${c||""}`,label:g,values:[...f?[{id:f,label:a.isValid(a.parseISO(f))?a.format(a.parseISO(f),"MMM d, yyyy"):f}]:[],...c?[{id:c,label:a.isValid(a.parseISO(c))?a.format(a.parseISO(c),"MMM d, yyyy"):c}]:[]]};return{id:n.id,type:n.type,label:n.label,icon:n.icon,inverted:e.operator==="or",values:[S],singleSelect:n.singleSelect}},R=(e,l,t)=>{const{key:s,value:n,operator:i}=e;if(s===m.SEARCH_FILTER_ID){const u=Array.isArray(n)?n:[n||""];return{id:m.SEARCH_FILTER_ID,type:"string",label:"",values:u.map(y=>({id:String(y),label:String(y)}))}}const r=h(s,l);if(!r)return null;const o=`${s}_${i}_${JSON.stringify(n)}`;if(t.has(o))return null;t.add(o);const d=D(n,i,r),c=d.length===1&&["hasValue","noValue"].includes(String(d[0].id))?!1:I(i,r.type),g=A(i,r.type);return{id:r.id,type:r.type,label:r.label,inverted:c,operator:g,icon:r.icon,values:d,isCustom:r.allowsCustomValues,singleSelect:r.singleSelect}},h=(e,l)=>{let t=l.find(s=>s.id===e);return t||(t=l.find(s=>s.id.endsWith(e)||s.id.replace(/^[^.]*\./,"")===e||s.id.split("_").pop()===e),t)||(t=l.find(s=>s.label?.toLowerCase()===e.toLowerCase())),t},D=(e,l,t)=>{if(l==="isnull"||l==="notnull")return l==="isnull"?[{id:"noValue",label:"No Value"}]:[{id:"hasValue",label:"Has Value"}];if(Array.isArray(e)&&e.length===0){if(l==="eq")return[{id:"noValue",label:"No Value"}];if(l==="ne")return[{id:"hasValue",label:"Has Value"}]}return e==null?[]:(Array.isArray(e)?e:[e]).map(n=>{let i=String(n),r=!1;if(l==="like"&&typeof n=="string"&&(i=n.replace(/^%/,"").replace(/%$/,""),r=!0),!r){const o=t.values?.find(d=>d.id===i);if(o)return o}if(t.type==="datetime"&&typeof n=="string")try{const o=a.parseISO(n);if(a.isValid(o))return{id:i,label:a.format(o,"MMM d, yyyy"),isCustom:!0}}catch{}return{id:i,label:i,isCustom:!0}})},I=(e,l)=>e?["ne","notin","excludes","excludesall","excludesany","notnull"].includes(e):!1,A=(e,l)=>l?.startsWith("list_of_")&&(e==="includesall"||e==="excludesall")?"AND":"OR";exports.queryFilterToClientFilter=M;exports.tryMergeDatetimeRange=b;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("@ynput/ayon-react-components"),a=require("date-fns"),I=require("../../../components/SearchFilter/filterDates.cjs.js"),p=require("./expandRelativeDates.cjs.js"),S=(e,l)=>{if(!e?.conditions||e.conditions.length===0)return[];const t=[],i=new Set;return e.conditions.forEach(n=>{if("key"in n){const s=R(n,l,i);s&&t.push(s)}else{const s=M(n,l);if(s)t.push(s);else{const r=S(n,l);t.push(...r)}}}),O(t)},O=e=>{const l=new Map;for(const t of e){const i=l.get(t.id);if(i){const n=new Set((i.values||[]).map(r=>r.id)),s=(t.values||[]).filter(r=>!n.has(r.id));i.values=[...i.values||[],...s]}else l.set(t.id,{...t,values:[...t.values||[]]})}return Array.from(l.values())},M=(e,l)=>{if(!e.conditions||e.conditions.length<1)return null;const t=e.conditions.filter(u=>"key"in u);if(t.length!==e.conditions.length)return null;const i=t[0].key;if(!t.every(u=>u.key===i))return null;const n=h(i,l);if(!n||n.type!=="datetime")return null;const s=t.find(u=>u.operator==="gte"),r=t.find(u=>u.operator==="lte");if(!s&&!r)return null;const o=s?.value,d=r?.value,f=o&&p.isRelativeDateValue(o)?p.resolveRelativeValue(o):o,c=d&&p.isRelativeDateValue(d)?p.resolveRelativeValue(d):d;let g="Custom range";if(f&&c){const u=I.detectRelativeDatePattern(f,c);if(u)g=u.label;else{const V=a.parseISO(f),y=a.parseISO(c);if(a.isValid(V)&&a.isValid(y)){const b=new Date().getFullYear(),C=y.getFullYear()===b?"MMM d":"MMM d, yyyy";g=`${a.format(V,"MMM d")} – ${a.format(y,C)}`}}}const v={id:`custom-${f||""}-${c||""}`,label:g,values:[...f?[{id:f,label:a.isValid(a.parseISO(f))?a.format(a.parseISO(f),"MMM d, yyyy"):f}]:[],...c?[{id:c,label:a.isValid(a.parseISO(c))?a.format(a.parseISO(c),"MMM d, yyyy"):c}]:[]]};return{id:n.id,type:n.type,label:n.label,icon:n.icon,inverted:e.operator==="or",values:[v],singleSelect:n.singleSelect}},R=(e,l,t)=>{const{key:i,value:n,operator:s}=e;if(i===m.SEARCH_FILTER_ID){const u=Array.isArray(n)?n:[n||""];return{id:m.SEARCH_FILTER_ID,type:"string",label:"",values:u.map(y=>({id:String(y),label:String(y)}))}}const r=h(i,l);if(!r)return null;const o=`${i}_${s}_${JSON.stringify(n)}`;if(t.has(o))return null;t.add(o);const d=D(n,s,r),c=d.length===1&&["hasValue","noValue"].includes(String(d[0].id))?!1:A(s,r.type),g=F(s,r.type);return{id:r.id,type:r.type,label:r.label,inverted:c,operator:g,icon:r.icon,values:d,isCustom:r.allowsCustomValues,singleSelect:r.singleSelect}},h=(e,l)=>{let t=l.find(i=>i.id===e);return t||(t=l.find(i=>i.id.endsWith(e)||i.id.replace(/^[^.]*\./,"")===e||i.id.split("_").pop()===e),t)||(t=l.find(i=>i.label?.toLowerCase()===e.toLowerCase())),t},D=(e,l,t)=>{if(l==="isnull"||l==="notnull")return l==="isnull"?[{id:"noValue",label:"No Value"}]:[{id:"hasValue",label:"Has Value"}];if(Array.isArray(e)&&e.length===0){if(l==="eq")return[{id:"noValue",label:"No Value"}];if(l==="ne")return[{id:"hasValue",label:"Has Value"}]}return e==null?[]:(Array.isArray(e)?e:[e]).map(n=>{let s=String(n),r=!1;if(l==="like"&&typeof n=="string"&&(s=n.replace(/^%/,"").replace(/%$/,""),r=!0),!r){const o=t.values?.find(d=>d.id===s);if(o)return o}if(t.type==="datetime"&&typeof n=="string")try{const o=a.parseISO(n);if(a.isValid(o))return{id:s,label:a.format(o,"MMM d, yyyy"),isCustom:!0}}catch{}return{id:s,label:s,isCustom:!0}})},A=(e,l)=>e?["ne","notin","excludes","excludesall","excludesany","notnull"].includes(e):!1,F=(e,l)=>l?.startsWith("list_of_")&&(e==="includesall"||e==="excludesall")?"AND":"OR";exports.queryFilterToClientFilter=S;exports.tryMergeDatetimeRange=M;
2
2
  //# sourceMappingURL=queryFilterToClientFilter.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryFilterToClientFilter.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.ts"],"sourcesContent":["import { Filter, FilterValue, SEARCH_FILTER_ID } from '@ynput/ayon-react-components'\nimport { QueryFilter, QueryCondition } from '../types/operations'\nimport { format, parseISO, isValid } from 'date-fns'\nimport { detectRelativeDatePattern } from '@shared/components/SearchFilter/filterDates'\nimport { isRelativeDateValue, resolveRelativeValue } from './expandRelativeDates'\n\n// Option interface for filter options (from useBuildFilterOptions)\ninterface Option {\n id: string\n type?: string\n label: string\n icon?: string | null\n img?: string | null\n inverted?: boolean\n operator?: 'AND' | 'OR'\n values?: FilterValue[]\n allowsCustomValues?: boolean\n allowHasValue?: boolean\n allowNoValue?: boolean\n allowExcludes?: boolean\n operatorChangeable?: boolean\n singleSelect?: boolean\n}\n\n/**\n * Converts a QueryFilter back to Filter[] objects that can be consumed by the SearchFilter component\n * This requires the filter options to properly reconstruct the Filter objects with all their metadata\n */\nexport const queryFilterToClientFilter = (\n queryFilter: QueryFilter | undefined,\n filterOptions: Option[],\n): Filter[] => {\n if (!queryFilter?.conditions || queryFilter.conditions.length === 0) {\n return []\n }\n\n const filters: Filter[] = []\n const processedConditions = new Set<string>()\n\n // Process each condition in the query filter\n queryFilter.conditions.forEach((condition) => {\n if ('key' in condition) {\n // This is a QueryCondition\n const filter = convertConditionToFilter(condition, filterOptions, processedConditions)\n if (filter) {\n filters.push(filter)\n }\n } else {\n // This is a nested QueryFilter - check if it's a datetime range (gte+lte same key)\n const datetimeFilter = tryMergeDatetimeRange(condition, filterOptions)\n if (datetimeFilter) {\n filters.push(datetimeFilter)\n } else {\n // Recursively process other nested QueryFilters\n const nestedFilters = queryFilterToClientFilter(condition, filterOptions)\n filters.push(...nestedFilters)\n }\n }\n })\n\n return filters\n}\n\n/**\n * Detects nested QueryFilters that represent datetime ranges (gte+lte on the same key)\n * and merges them into a single datetime Filter with proper range values.\n */\nexport const tryMergeDatetimeRange = (\n nestedFilter: QueryFilter,\n filterOptions: Option[],\n): Filter | null => {\n if (!nestedFilter.conditions || nestedFilter.conditions.length < 1) return null\n\n // All conditions must be QueryConditions (not nested QueryFilters)\n const conditions = nestedFilter.conditions.filter((c): c is QueryCondition => 'key' in c)\n if (conditions.length !== nestedFilter.conditions.length) return null\n\n // All conditions must share the same key\n const key = conditions[0].key\n if (!conditions.every((c) => c.key === key)) return null\n\n // Find the matching filter option and check it's a datetime type\n const filterOption = findFilterOption(key, filterOptions)\n if (!filterOption || filterOption.type !== 'datetime') return null\n\n // Extract gte (start) and lte (end) values, resolving relative dates\n const gteCondition = conditions.find((c) => c.operator === 'gte')\n const lteCondition = conditions.find((c) => c.operator === 'lte')\n if (!gteCondition && !lteCondition) return null\n\n const rawStartValue = gteCondition?.value as string | undefined\n const rawEndValue = lteCondition?.value as string | undefined\n const startISO =\n rawStartValue && isRelativeDateValue(rawStartValue)\n ? resolveRelativeValue(rawStartValue)\n : rawStartValue\n const endISO =\n rawEndValue && isRelativeDateValue(rawEndValue)\n ? resolveRelativeValue(rawEndValue)\n : rawEndValue\n\n // Build the range label\n let label = 'Custom range'\n if (startISO && endISO) {\n // Check if it matches a relative date pattern first\n const relativePattern = detectRelativeDatePattern(startISO, endISO)\n if (relativePattern) {\n label = relativePattern.label\n } else {\n // Fall back to showing the date range\n const startDate = parseISO(startISO)\n const endDate = parseISO(endISO)\n if (isValid(startDate) && isValid(endDate)) {\n const currentYear = new Date().getFullYear()\n const endDateFormat = endDate.getFullYear() === currentYear ? 'MMM d' : 'MMM d, yyyy'\n label = `${format(startDate, 'MMM d')} – ${format(endDate, endDateFormat)}`\n }\n }\n }\n\n // `values` holds the gte/lte range pair — used by clientFilterToQueryFilter for round-trip\n // but not part of the FilterValue type, so we extend it at runtime\n const rangeValue = {\n id: `custom-${startISO || ''}-${endISO || ''}`,\n label,\n values: [\n ...(startISO\n ? [\n {\n id: startISO,\n label: isValid(parseISO(startISO))\n ? format(parseISO(startISO), 'MMM d, yyyy')\n : startISO,\n },\n ]\n : []),\n ...(endISO\n ? [\n {\n id: endISO,\n label: isValid(parseISO(endISO)) ? format(parseISO(endISO), 'MMM d, yyyy') : endISO,\n },\n ]\n : []),\n ],\n } as FilterValue\n\n return {\n id: filterOption.id,\n type: filterOption.type as Filter['type'],\n label: filterOption.label,\n icon: filterOption.icon,\n inverted: nestedFilter.operator === 'or',\n values: [rangeValue],\n singleSelect: filterOption.singleSelect,\n }\n}\n\nconst convertConditionToFilter = (\n condition: QueryCondition,\n filterOptions: Option[],\n processedConditions: Set<string>,\n): Filter | null => {\n const { key, value, operator } = condition\n\n // check if the filter is a text search filter\n if (key === SEARCH_FILTER_ID) {\n const valuesArray = Array.isArray(value) ? value : [value || '']\n const filter: Filter = {\n id: SEARCH_FILTER_ID,\n type: 'string',\n label: '',\n values: valuesArray.map((v) => ({ id: String(v), label: String(v) })),\n }\n\n return filter\n }\n\n // Find the matching filter option\n const filterOption = findFilterOption(key, filterOptions)\n if (!filterOption) {\n return null\n }\n\n // Create a unique key for this condition to avoid duplicates\n const conditionKey = `${key}_${operator}_${JSON.stringify(value)}`\n if (processedConditions.has(conditionKey)) {\n return null\n }\n processedConditions.add(conditionKey)\n\n // Convert the condition values to FilterValue objects\n const filterValues = convertConditionValueToFilterValues(value, operator, filterOption)\n\n // hasValue/noValue chips encode the null-check in the value itself — marking them\n // inverted would flip the operator back on the next conversion (notnull <-> isnull)\n const isNullnessCheck =\n filterValues.length === 1 && ['hasValue', 'noValue'].includes(String(filterValues[0].id))\n\n // Determine if the filter is inverted based on the operator\n const inverted = isNullnessCheck ? false : isInvertedOperator(operator, filterOption.type)\n\n // Determine the filter operator (AND/OR)\n const filterOperator = getFilterOperator(operator, filterOption.type)\n\n const filter: Filter = {\n id: filterOption.id,\n type: filterOption.type as Filter['type'],\n label: filterOption.label,\n inverted,\n operator: filterOperator,\n icon: filterOption.icon,\n values: filterValues,\n isCustom: filterOption.allowsCustomValues,\n singleSelect: filterOption.singleSelect,\n }\n\n return filter\n}\n\nconst findFilterOption = (key: string, filterOptions: Option[]): Option | undefined => {\n // Try exact match first\n let option = filterOptions.find((opt) => opt.id === key)\n if (option) return option\n\n // Try to find by the base key (without prefixes)\n option = filterOptions.find(\n (opt) =>\n opt.id.endsWith(key) ||\n opt.id.replace(/^[^.]*\\./, '') === key ||\n opt.id.split('_').pop() === key,\n )\n if (option) return option\n\n // Try to find by label match\n option = filterOptions.find((opt) => opt.label?.toLowerCase() === key.toLowerCase())\n\n return option\n}\n\nconst convertConditionValueToFilterValues = (\n value: QueryCondition['value'],\n operator: QueryCondition['operator'],\n filterOption: Option,\n): FilterValue[] => {\n // Handle special operators for null/empty checks\n if (operator === 'isnull' || operator === 'notnull') {\n return operator === 'isnull'\n ? [{ id: 'noValue', label: 'No Value' }]\n : [{ id: 'hasValue', label: 'Has Value' }]\n }\n\n // Handle empty array cases - these represent \"No Value\" and \"Has Value\" conditions\n if (Array.isArray(value) && value.length === 0) {\n if (operator === 'eq') {\n // Empty array with 'eq' operator means \"No Value\"\n return [{ id: 'noValue', label: 'No Value' }]\n } else if (operator === 'ne') {\n // Empty array with 'ne' operator means \"Has Value\"\n return [{ id: 'hasValue', label: 'Has Value' }]\n }\n }\n\n if (value === undefined || value === null) {\n return []\n }\n\n // Convert value(s) to FilterValue objects\n const values = Array.isArray(value) ? value : [value]\n\n return values.map((val) => {\n let stringValue = String(val)\n let isCustomValue = false\n\n // Handle LIKE operator with wildcards - strip them and mark as custom\n if (operator === 'like' && typeof val === 'string') {\n // Remove leading and trailing % wildcards\n stringValue = val.replace(/^%/, '').replace(/%$/, '')\n isCustomValue = true\n }\n\n // Try to find existing option value with metadata (only if not already marked as custom from LIKE)\n if (!isCustomValue) {\n const existingValue = filterOption.values?.find((v: FilterValue) => v.id === stringValue)\n if (existingValue) {\n return existingValue\n }\n }\n\n // Format datetime values nicely instead of showing raw ISO strings\n if (filterOption.type === 'datetime' && typeof val === 'string') {\n try {\n const date = parseISO(val)\n if (isValid(date)) {\n return {\n id: stringValue,\n label: format(date, 'MMM d, yyyy'),\n isCustom: true,\n }\n }\n } catch {\n // fall through to default\n }\n }\n\n // Create a basic FilterValue if no existing option found or if it's a LIKE value\n return {\n id: stringValue,\n label: stringValue,\n isCustom: true,\n }\n })\n}\n\nconst isInvertedOperator = (operator: QueryCondition['operator'], type?: string): boolean => {\n const invertedOperators = ['ne', 'notin', 'excludes', 'excludesall', 'excludesany', 'notnull']\n return operator ? invertedOperators.includes(operator) : false\n}\n\nconst getFilterOperator = (operator: QueryCondition['operator'], type?: string): 'AND' | 'OR' => {\n // For list types, determine AND/OR based on the operator\n if (type?.startsWith('list_of_')) {\n if (operator === 'includesall' || operator === 'excludesall') {\n return 'AND'\n }\n return 'OR'\n }\n\n // Default to OR for most cases\n return 'OR'\n}\n\nexport default queryFilterToClientFilter\n"],"names":["queryFilterToClientFilter","queryFilter","filterOptions","filters","processedConditions","condition","filter","convertConditionToFilter","datetimeFilter","tryMergeDatetimeRange","nestedFilters","nestedFilter","conditions","c","key","filterOption","findFilterOption","gteCondition","lteCondition","rawStartValue","rawEndValue","startISO","isRelativeDateValue","resolveRelativeValue","endISO","label","relativePattern","detectRelativeDatePattern","startDate","parseISO","endDate","isValid","currentYear","endDateFormat","format","rangeValue","value","operator","SEARCH_FILTER_ID","valuesArray","v","conditionKey","filterValues","convertConditionValueToFilterValues","inverted","isInvertedOperator","filterOperator","getFilterOperator","option","opt","val","stringValue","isCustomValue","existingValue","date","type"],"mappings":"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"}
1
+ {"version":3,"file":"queryFilterToClientFilter.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.ts"],"sourcesContent":["import { Filter, FilterValue, SEARCH_FILTER_ID } from '@ynput/ayon-react-components'\nimport { QueryFilter, QueryCondition } from '../types/operations'\nimport { format, parseISO, isValid } from 'date-fns'\nimport { detectRelativeDatePattern } from '@shared/components/SearchFilter/filterDates'\nimport { isRelativeDateValue, resolveRelativeValue } from './expandRelativeDates'\n\n// Option interface for filter options (from useBuildFilterOptions)\ninterface Option {\n id: string\n type?: string\n label: string\n icon?: string | null\n img?: string | null\n inverted?: boolean\n operator?: 'AND' | 'OR'\n values?: FilterValue[]\n allowsCustomValues?: boolean\n allowHasValue?: boolean\n allowNoValue?: boolean\n allowExcludes?: boolean\n operatorChangeable?: boolean\n singleSelect?: boolean\n}\n\n/**\n * Converts a QueryFilter back to Filter[] objects that can be consumed by the SearchFilter component\n * This requires the filter options to properly reconstruct the Filter objects with all their metadata\n */\nexport const queryFilterToClientFilter = (\n queryFilter: QueryFilter | undefined,\n filterOptions: Option[],\n): Filter[] => {\n if (!queryFilter?.conditions || queryFilter.conditions.length === 0) {\n return []\n }\n\n const filters: Filter[] = []\n const processedConditions = new Set<string>()\n\n // Process each condition in the query filter\n queryFilter.conditions.forEach((condition) => {\n if ('key' in condition) {\n // This is a QueryCondition\n const filter = convertConditionToFilter(condition, filterOptions, processedConditions)\n if (filter) {\n filters.push(filter)\n }\n } else {\n // This is a nested QueryFilter - check if it's a datetime range (gte+lte same key)\n const datetimeFilter = tryMergeDatetimeRange(condition, filterOptions)\n if (datetimeFilter) {\n filters.push(datetimeFilter)\n } else {\n // Recursively process other nested QueryFilters\n const nestedFilters = queryFilterToClientFilter(condition, filterOptions)\n filters.push(...nestedFilters)\n }\n }\n })\n\n return mergeFiltersById(filters)\n}\n\n/**\n * Merges filters that share the same id by combining their values.\n * This handles the case where custom + non-custom values for the same field\n * are stored as separate conditions in the query filter (e.g. `in` + `like`)\n * but should be represented as a single filter with all values combined.\n */\nconst mergeFiltersById = (filters: Filter[]): Filter[] => {\n const filterMap = new Map<string, Filter>()\n\n for (const filter of filters) {\n const existing = filterMap.get(filter.id)\n if (existing) {\n // Merge values, avoiding duplicates by id\n const existingValueIds = new Set((existing.values || []).map((v) => v.id))\n const newValues = (filter.values || []).filter((v) => !existingValueIds.has(v.id))\n existing.values = [...(existing.values || []), ...newValues]\n } else {\n filterMap.set(filter.id, { ...filter, values: [...(filter.values || [])] })\n }\n }\n\n return Array.from(filterMap.values())\n}\n\n/**\n * Detects nested QueryFilters that represent datetime ranges (gte+lte on the same key)\n * and merges them into a single datetime Filter with proper range values.\n */\nexport const tryMergeDatetimeRange = (\n nestedFilter: QueryFilter,\n filterOptions: Option[],\n): Filter | null => {\n if (!nestedFilter.conditions || nestedFilter.conditions.length < 1) return null\n\n // All conditions must be QueryConditions (not nested QueryFilters)\n const conditions = nestedFilter.conditions.filter((c): c is QueryCondition => 'key' in c)\n if (conditions.length !== nestedFilter.conditions.length) return null\n\n // All conditions must share the same key\n const key = conditions[0].key\n if (!conditions.every((c) => c.key === key)) return null\n\n // Find the matching filter option and check it's a datetime type\n const filterOption = findFilterOption(key, filterOptions)\n if (!filterOption || filterOption.type !== 'datetime') return null\n\n // Extract gte (start) and lte (end) values, resolving relative dates\n const gteCondition = conditions.find((c) => c.operator === 'gte')\n const lteCondition = conditions.find((c) => c.operator === 'lte')\n if (!gteCondition && !lteCondition) return null\n\n const rawStartValue = gteCondition?.value as string | undefined\n const rawEndValue = lteCondition?.value as string | undefined\n const startISO =\n rawStartValue && isRelativeDateValue(rawStartValue)\n ? resolveRelativeValue(rawStartValue)\n : rawStartValue\n const endISO =\n rawEndValue && isRelativeDateValue(rawEndValue)\n ? resolveRelativeValue(rawEndValue)\n : rawEndValue\n\n // Build the range label\n let label = 'Custom range'\n if (startISO && endISO) {\n // Check if it matches a relative date pattern first\n const relativePattern = detectRelativeDatePattern(startISO, endISO)\n if (relativePattern) {\n label = relativePattern.label\n } else {\n // Fall back to showing the date range\n const startDate = parseISO(startISO)\n const endDate = parseISO(endISO)\n if (isValid(startDate) && isValid(endDate)) {\n const currentYear = new Date().getFullYear()\n const endDateFormat = endDate.getFullYear() === currentYear ? 'MMM d' : 'MMM d, yyyy'\n label = `${format(startDate, 'MMM d')} – ${format(endDate, endDateFormat)}`\n }\n }\n }\n\n // `values` holds the gte/lte range pair — used by clientFilterToQueryFilter for round-trip\n // but not part of the FilterValue type, so we extend it at runtime\n const rangeValue = {\n id: `custom-${startISO || ''}-${endISO || ''}`,\n label,\n values: [\n ...(startISO\n ? [\n {\n id: startISO,\n label: isValid(parseISO(startISO))\n ? format(parseISO(startISO), 'MMM d, yyyy')\n : startISO,\n },\n ]\n : []),\n ...(endISO\n ? [\n {\n id: endISO,\n label: isValid(parseISO(endISO)) ? format(parseISO(endISO), 'MMM d, yyyy') : endISO,\n },\n ]\n : []),\n ],\n } as FilterValue\n\n return {\n id: filterOption.id,\n type: filterOption.type as Filter['type'],\n label: filterOption.label,\n icon: filterOption.icon,\n inverted: nestedFilter.operator === 'or',\n values: [rangeValue],\n singleSelect: filterOption.singleSelect,\n }\n}\n\nconst convertConditionToFilter = (\n condition: QueryCondition,\n filterOptions: Option[],\n processedConditions: Set<string>,\n): Filter | null => {\n const { key, value, operator } = condition\n\n // check if the filter is a text search filter\n if (key === SEARCH_FILTER_ID) {\n const valuesArray = Array.isArray(value) ? value : [value || '']\n const filter: Filter = {\n id: SEARCH_FILTER_ID,\n type: 'string',\n label: '',\n values: valuesArray.map((v) => ({ id: String(v), label: String(v) })),\n }\n\n return filter\n }\n\n // Find the matching filter option\n const filterOption = findFilterOption(key, filterOptions)\n if (!filterOption) {\n return null\n }\n\n // Create a unique key for this condition to avoid duplicates\n const conditionKey = `${key}_${operator}_${JSON.stringify(value)}`\n if (processedConditions.has(conditionKey)) {\n return null\n }\n processedConditions.add(conditionKey)\n\n // Convert the condition values to FilterValue objects\n const filterValues = convertConditionValueToFilterValues(value, operator, filterOption)\n\n // hasValue/noValue chips encode the null-check in the value itself — marking them\n // inverted would flip the operator back on the next conversion (notnull <-> isnull)\n const isNullnessCheck =\n filterValues.length === 1 && ['hasValue', 'noValue'].includes(String(filterValues[0].id))\n\n // Determine if the filter is inverted based on the operator\n const inverted = isNullnessCheck ? false : isInvertedOperator(operator, filterOption.type)\n\n // Determine the filter operator (AND/OR)\n const filterOperator = getFilterOperator(operator, filterOption.type)\n\n const filter: Filter = {\n id: filterOption.id,\n type: filterOption.type as Filter['type'],\n label: filterOption.label,\n inverted,\n operator: filterOperator,\n icon: filterOption.icon,\n values: filterValues,\n isCustom: filterOption.allowsCustomValues,\n singleSelect: filterOption.singleSelect,\n }\n\n return filter\n}\n\nconst findFilterOption = (key: string, filterOptions: Option[]): Option | undefined => {\n // Try exact match first\n let option = filterOptions.find((opt) => opt.id === key)\n if (option) return option\n\n // Try to find by the base key (without prefixes)\n option = filterOptions.find(\n (opt) =>\n opt.id.endsWith(key) ||\n opt.id.replace(/^[^.]*\\./, '') === key ||\n opt.id.split('_').pop() === key,\n )\n if (option) return option\n\n // Try to find by label match\n option = filterOptions.find((opt) => opt.label?.toLowerCase() === key.toLowerCase())\n\n return option\n}\n\nconst convertConditionValueToFilterValues = (\n value: QueryCondition['value'],\n operator: QueryCondition['operator'],\n filterOption: Option,\n): FilterValue[] => {\n // Handle special operators for null/empty checks\n if (operator === 'isnull' || operator === 'notnull') {\n return operator === 'isnull'\n ? [{ id: 'noValue', label: 'No Value' }]\n : [{ id: 'hasValue', label: 'Has Value' }]\n }\n\n // Handle empty array cases - these represent \"No Value\" and \"Has Value\" conditions\n if (Array.isArray(value) && value.length === 0) {\n if (operator === 'eq') {\n // Empty array with 'eq' operator means \"No Value\"\n return [{ id: 'noValue', label: 'No Value' }]\n } else if (operator === 'ne') {\n // Empty array with 'ne' operator means \"Has Value\"\n return [{ id: 'hasValue', label: 'Has Value' }]\n }\n }\n\n if (value === undefined || value === null) {\n return []\n }\n\n // Convert value(s) to FilterValue objects\n const values = Array.isArray(value) ? value : [value]\n\n return values.map((val) => {\n let stringValue = String(val)\n let isCustomValue = false\n\n // Handle LIKE operator with wildcards - strip them and mark as custom\n if (operator === 'like' && typeof val === 'string') {\n // Remove leading and trailing % wildcards\n stringValue = val.replace(/^%/, '').replace(/%$/, '')\n isCustomValue = true\n }\n\n // Try to find existing option value with metadata (only if not already marked as custom from LIKE)\n if (!isCustomValue) {\n const existingValue = filterOption.values?.find((v: FilterValue) => v.id === stringValue)\n if (existingValue) {\n return existingValue\n }\n }\n\n // Format datetime values nicely instead of showing raw ISO strings\n if (filterOption.type === 'datetime' && typeof val === 'string') {\n try {\n const date = parseISO(val)\n if (isValid(date)) {\n return {\n id: stringValue,\n label: format(date, 'MMM d, yyyy'),\n isCustom: true,\n }\n }\n } catch {\n // fall through to default\n }\n }\n\n // Create a basic FilterValue if no existing option found or if it's a LIKE value\n return {\n id: stringValue,\n label: stringValue,\n isCustom: true,\n }\n })\n}\n\nconst isInvertedOperator = (operator: QueryCondition['operator'], type?: string): boolean => {\n const invertedOperators = ['ne', 'notin', 'excludes', 'excludesall', 'excludesany', 'notnull']\n return operator ? invertedOperators.includes(operator) : false\n}\n\nconst getFilterOperator = (operator: QueryCondition['operator'], type?: string): 'AND' | 'OR' => {\n // For list types, determine AND/OR based on the operator\n if (type?.startsWith('list_of_')) {\n if (operator === 'includesall' || operator === 'excludesall') {\n return 'AND'\n }\n return 'OR'\n }\n\n // Default to OR for most cases\n return 'OR'\n}\n\nexport default queryFilterToClientFilter\n"],"names":["queryFilterToClientFilter","queryFilter","filterOptions","filters","processedConditions","condition","filter","convertConditionToFilter","datetimeFilter","tryMergeDatetimeRange","nestedFilters","mergeFiltersById","filterMap","existing","existingValueIds","v","newValues","nestedFilter","conditions","c","key","filterOption","findFilterOption","gteCondition","lteCondition","rawStartValue","rawEndValue","startISO","isRelativeDateValue","resolveRelativeValue","endISO","label","relativePattern","detectRelativeDatePattern","startDate","parseISO","endDate","isValid","currentYear","endDateFormat","format","rangeValue","value","operator","SEARCH_FILTER_ID","valuesArray","conditionKey","filterValues","convertConditionValueToFilterValues","inverted","isInvertedOperator","filterOperator","getFilterOperator","option","opt","val","stringValue","isCustomValue","existingValue","date","type"],"mappings":"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"}
@@ -1,50 +1,61 @@
1
1
  import { SEARCH_FILTER_ID as M } from "@ynput/ayon-react-components";
2
2
  import { parseISO as f, isValid as p, format as m } from "date-fns";
3
- import { detectRelativeDatePattern as D } from "../../../components/SearchFilter/filterDates.es.js";
4
- import { isRelativeDateValue as b, resolveRelativeValue as C } from "./expandRelativeDates.es.js";
5
- const O = (e, l) => {
3
+ import { detectRelativeDatePattern as A } from "../../../components/SearchFilter/filterDates.es.js";
4
+ import { isRelativeDateValue as h, resolveRelativeValue as b } from "./expandRelativeDates.es.js";
5
+ const D = (e, l) => {
6
6
  if (!e?.conditions || e.conditions.length === 0)
7
7
  return [];
8
- const t = [], s = /* @__PURE__ */ new Set();
8
+ const t = [], i = /* @__PURE__ */ new Set();
9
9
  return e.conditions.forEach((n) => {
10
10
  if ("key" in n) {
11
- const i = $(n, l, s);
12
- i && t.push(i);
11
+ const s = I(n, l, i);
12
+ s && t.push(s);
13
13
  } else {
14
- const i = R(n, l);
15
- if (i)
16
- t.push(i);
14
+ const s = x(n, l);
15
+ if (s)
16
+ t.push(s);
17
17
  else {
18
- const r = O(n, l);
18
+ const r = D(n, l);
19
19
  t.push(...r);
20
20
  }
21
21
  }
22
- }), t;
23
- }, R = (e, l) => {
22
+ }), O(t);
23
+ }, O = (e) => {
24
+ const l = /* @__PURE__ */ new Map();
25
+ for (const t of e) {
26
+ const i = l.get(t.id);
27
+ if (i) {
28
+ const n = new Set((i.values || []).map((r) => r.id)), s = (t.values || []).filter((r) => !n.has(r.id));
29
+ i.values = [...i.values || [], ...s];
30
+ } else
31
+ l.set(t.id, { ...t, values: [...t.values || []] });
32
+ }
33
+ return Array.from(l.values());
34
+ }, x = (e, l) => {
24
35
  if (!e.conditions || e.conditions.length < 1) return null;
25
- const t = e.conditions.filter((a) => "key" in a);
36
+ const t = e.conditions.filter((o) => "key" in o);
26
37
  if (t.length !== e.conditions.length) return null;
27
- const s = t[0].key;
28
- if (!t.every((a) => a.key === s)) return null;
29
- const n = S(s, l);
38
+ const i = t[0].key;
39
+ if (!t.every((o) => o.key === i)) return null;
40
+ const n = C(i, l);
30
41
  if (!n || n.type !== "datetime") return null;
31
- const i = t.find((a) => a.operator === "gte"), r = t.find((a) => a.operator === "lte");
32
- if (!i && !r) return null;
33
- const o = i?.value, c = r?.value, d = o && b(o) ? C(o) : o, u = c && b(c) ? C(c) : c;
42
+ const s = t.find((o) => o.operator === "gte"), r = t.find((o) => o.operator === "lte");
43
+ if (!s && !r) return null;
44
+ const a = s?.value, c = r?.value, d = a && h(a) ? b(a) : a, u = c && h(c) ? b(c) : c;
34
45
  let g = "Custom range";
35
46
  if (d && u) {
36
- const a = D(d, u);
37
- if (a)
38
- g = a.label;
47
+ const o = A(d, u);
48
+ if (o)
49
+ g = o.label;
39
50
  else {
40
51
  const V = f(d), y = f(u);
41
52
  if (p(V) && p(y)) {
42
- const v = (/* @__PURE__ */ new Date()).getFullYear(), A = y.getFullYear() === v ? "MMM d" : "MMM d, yyyy";
43
- g = `${m(V, "MMM d")} – ${m(y, A)}`;
53
+ const S = (/* @__PURE__ */ new Date()).getFullYear(), w = y.getFullYear() === S ? "MMM d" : "MMM d, yyyy";
54
+ g = `${m(V, "MMM d")} – ${m(y, w)}`;
44
55
  }
45
56
  }
46
57
  }
47
- const h = {
58
+ const v = {
48
59
  id: `custom-${d || ""}-${u || ""}`,
49
60
  label: g,
50
61
  values: [
@@ -68,28 +79,28 @@ const O = (e, l) => {
68
79
  label: n.label,
69
80
  icon: n.icon,
70
81
  inverted: e.operator === "or",
71
- values: [h],
82
+ values: [v],
72
83
  singleSelect: n.singleSelect
73
84
  };
74
- }, $ = (e, l, t) => {
75
- const { key: s, value: n, operator: i } = e;
76
- if (s === M) {
77
- const a = Array.isArray(n) ? n : [n || ""];
85
+ }, I = (e, l, t) => {
86
+ const { key: i, value: n, operator: s } = e;
87
+ if (i === M) {
88
+ const o = Array.isArray(n) ? n : [n || ""];
78
89
  return {
79
90
  id: M,
80
91
  type: "string",
81
92
  label: "",
82
- values: a.map((y) => ({ id: String(y), label: String(y) }))
93
+ values: o.map((y) => ({ id: String(y), label: String(y) }))
83
94
  };
84
95
  }
85
- const r = S(s, l);
96
+ const r = C(i, l);
86
97
  if (!r)
87
98
  return null;
88
- const o = `${s}_${i}_${JSON.stringify(n)}`;
89
- if (t.has(o))
99
+ const a = `${i}_${s}_${JSON.stringify(n)}`;
100
+ if (t.has(a))
90
101
  return null;
91
- t.add(o);
92
- const c = w(n, i, r), u = c.length === 1 && ["hasValue", "noValue"].includes(String(c[0].id)) ? !1 : _(i, r.type), g = x(i, r.type);
102
+ t.add(a);
103
+ const c = R(n, s, r), u = c.length === 1 && ["hasValue", "noValue"].includes(String(c[0].id)) ? !1 : $(s, r.type), g = F(s, r.type);
93
104
  return {
94
105
  id: r.id,
95
106
  type: r.type,
@@ -101,12 +112,12 @@ const O = (e, l) => {
101
112
  isCustom: r.allowsCustomValues,
102
113
  singleSelect: r.singleSelect
103
114
  };
104
- }, S = (e, l) => {
105
- let t = l.find((s) => s.id === e);
115
+ }, C = (e, l) => {
116
+ let t = l.find((i) => i.id === e);
106
117
  return t || (t = l.find(
107
- (s) => s.id.endsWith(e) || s.id.replace(/^[^.]*\./, "") === e || s.id.split("_").pop() === e
108
- ), t) || (t = l.find((s) => s.label?.toLowerCase() === e.toLowerCase())), t;
109
- }, w = (e, l, t) => {
118
+ (i) => i.id.endsWith(e) || i.id.replace(/^[^.]*\./, "") === e || i.id.split("_").pop() === e
119
+ ), t) || (t = l.find((i) => i.label?.toLowerCase() === e.toLowerCase())), t;
120
+ }, R = (e, l, t) => {
110
121
  if (l === "isnull" || l === "notnull")
111
122
  return l === "isnull" ? [{ id: "noValue", label: "No Value" }] : [{ id: "hasValue", label: "Has Value" }];
112
123
  if (Array.isArray(e) && e.length === 0) {
@@ -116,32 +127,32 @@ const O = (e, l) => {
116
127
  return [{ id: "hasValue", label: "Has Value" }];
117
128
  }
118
129
  return e == null ? [] : (Array.isArray(e) ? e : [e]).map((n) => {
119
- let i = String(n), r = !1;
120
- if (l === "like" && typeof n == "string" && (i = n.replace(/^%/, "").replace(/%$/, ""), r = !0), !r) {
121
- const o = t.values?.find((c) => c.id === i);
122
- if (o)
123
- return o;
130
+ let s = String(n), r = !1;
131
+ if (l === "like" && typeof n == "string" && (s = n.replace(/^%/, "").replace(/%$/, ""), r = !0), !r) {
132
+ const a = t.values?.find((c) => c.id === s);
133
+ if (a)
134
+ return a;
124
135
  }
125
136
  if (t.type === "datetime" && typeof n == "string")
126
137
  try {
127
- const o = f(n);
128
- if (p(o))
138
+ const a = f(n);
139
+ if (p(a))
129
140
  return {
130
- id: i,
131
- label: m(o, "MMM d, yyyy"),
141
+ id: s,
142
+ label: m(a, "MMM d, yyyy"),
132
143
  isCustom: !0
133
144
  };
134
145
  } catch {
135
146
  }
136
147
  return {
137
- id: i,
138
- label: i,
148
+ id: s,
149
+ label: s,
139
150
  isCustom: !0
140
151
  };
141
152
  });
142
- }, _ = (e, l) => e ? ["ne", "notin", "excludes", "excludesall", "excludesany", "notnull"].includes(e) : !1, x = (e, l) => l?.startsWith("list_of_") && (e === "includesall" || e === "excludesall") ? "AND" : "OR";
153
+ }, $ = (e, l) => e ? ["ne", "notin", "excludes", "excludesall", "excludesany", "notnull"].includes(e) : !1, F = (e, l) => l?.startsWith("list_of_") && (e === "includesall" || e === "excludesall") ? "AND" : "OR";
143
154
  export {
144
- O as queryFilterToClientFilter,
145
- R as tryMergeDatetimeRange
155
+ D as queryFilterToClientFilter,
156
+ x as tryMergeDatetimeRange
146
157
  };
147
158
  //# sourceMappingURL=queryFilterToClientFilter.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryFilterToClientFilter.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.ts"],"sourcesContent":["import { Filter, FilterValue, SEARCH_FILTER_ID } from '@ynput/ayon-react-components'\nimport { QueryFilter, QueryCondition } from '../types/operations'\nimport { format, parseISO, isValid } from 'date-fns'\nimport { detectRelativeDatePattern } from '@shared/components/SearchFilter/filterDates'\nimport { isRelativeDateValue, resolveRelativeValue } from './expandRelativeDates'\n\n// Option interface for filter options (from useBuildFilterOptions)\ninterface Option {\n id: string\n type?: string\n label: string\n icon?: string | null\n img?: string | null\n inverted?: boolean\n operator?: 'AND' | 'OR'\n values?: FilterValue[]\n allowsCustomValues?: boolean\n allowHasValue?: boolean\n allowNoValue?: boolean\n allowExcludes?: boolean\n operatorChangeable?: boolean\n singleSelect?: boolean\n}\n\n/**\n * Converts a QueryFilter back to Filter[] objects that can be consumed by the SearchFilter component\n * This requires the filter options to properly reconstruct the Filter objects with all their metadata\n */\nexport const queryFilterToClientFilter = (\n queryFilter: QueryFilter | undefined,\n filterOptions: Option[],\n): Filter[] => {\n if (!queryFilter?.conditions || queryFilter.conditions.length === 0) {\n return []\n }\n\n const filters: Filter[] = []\n const processedConditions = new Set<string>()\n\n // Process each condition in the query filter\n queryFilter.conditions.forEach((condition) => {\n if ('key' in condition) {\n // This is a QueryCondition\n const filter = convertConditionToFilter(condition, filterOptions, processedConditions)\n if (filter) {\n filters.push(filter)\n }\n } else {\n // This is a nested QueryFilter - check if it's a datetime range (gte+lte same key)\n const datetimeFilter = tryMergeDatetimeRange(condition, filterOptions)\n if (datetimeFilter) {\n filters.push(datetimeFilter)\n } else {\n // Recursively process other nested QueryFilters\n const nestedFilters = queryFilterToClientFilter(condition, filterOptions)\n filters.push(...nestedFilters)\n }\n }\n })\n\n return filters\n}\n\n/**\n * Detects nested QueryFilters that represent datetime ranges (gte+lte on the same key)\n * and merges them into a single datetime Filter with proper range values.\n */\nexport const tryMergeDatetimeRange = (\n nestedFilter: QueryFilter,\n filterOptions: Option[],\n): Filter | null => {\n if (!nestedFilter.conditions || nestedFilter.conditions.length < 1) return null\n\n // All conditions must be QueryConditions (not nested QueryFilters)\n const conditions = nestedFilter.conditions.filter((c): c is QueryCondition => 'key' in c)\n if (conditions.length !== nestedFilter.conditions.length) return null\n\n // All conditions must share the same key\n const key = conditions[0].key\n if (!conditions.every((c) => c.key === key)) return null\n\n // Find the matching filter option and check it's a datetime type\n const filterOption = findFilterOption(key, filterOptions)\n if (!filterOption || filterOption.type !== 'datetime') return null\n\n // Extract gte (start) and lte (end) values, resolving relative dates\n const gteCondition = conditions.find((c) => c.operator === 'gte')\n const lteCondition = conditions.find((c) => c.operator === 'lte')\n if (!gteCondition && !lteCondition) return null\n\n const rawStartValue = gteCondition?.value as string | undefined\n const rawEndValue = lteCondition?.value as string | undefined\n const startISO =\n rawStartValue && isRelativeDateValue(rawStartValue)\n ? resolveRelativeValue(rawStartValue)\n : rawStartValue\n const endISO =\n rawEndValue && isRelativeDateValue(rawEndValue)\n ? resolveRelativeValue(rawEndValue)\n : rawEndValue\n\n // Build the range label\n let label = 'Custom range'\n if (startISO && endISO) {\n // Check if it matches a relative date pattern first\n const relativePattern = detectRelativeDatePattern(startISO, endISO)\n if (relativePattern) {\n label = relativePattern.label\n } else {\n // Fall back to showing the date range\n const startDate = parseISO(startISO)\n const endDate = parseISO(endISO)\n if (isValid(startDate) && isValid(endDate)) {\n const currentYear = new Date().getFullYear()\n const endDateFormat = endDate.getFullYear() === currentYear ? 'MMM d' : 'MMM d, yyyy'\n label = `${format(startDate, 'MMM d')} – ${format(endDate, endDateFormat)}`\n }\n }\n }\n\n // `values` holds the gte/lte range pair — used by clientFilterToQueryFilter for round-trip\n // but not part of the FilterValue type, so we extend it at runtime\n const rangeValue = {\n id: `custom-${startISO || ''}-${endISO || ''}`,\n label,\n values: [\n ...(startISO\n ? [\n {\n id: startISO,\n label: isValid(parseISO(startISO))\n ? format(parseISO(startISO), 'MMM d, yyyy')\n : startISO,\n },\n ]\n : []),\n ...(endISO\n ? [\n {\n id: endISO,\n label: isValid(parseISO(endISO)) ? format(parseISO(endISO), 'MMM d, yyyy') : endISO,\n },\n ]\n : []),\n ],\n } as FilterValue\n\n return {\n id: filterOption.id,\n type: filterOption.type as Filter['type'],\n label: filterOption.label,\n icon: filterOption.icon,\n inverted: nestedFilter.operator === 'or',\n values: [rangeValue],\n singleSelect: filterOption.singleSelect,\n }\n}\n\nconst convertConditionToFilter = (\n condition: QueryCondition,\n filterOptions: Option[],\n processedConditions: Set<string>,\n): Filter | null => {\n const { key, value, operator } = condition\n\n // check if the filter is a text search filter\n if (key === SEARCH_FILTER_ID) {\n const valuesArray = Array.isArray(value) ? value : [value || '']\n const filter: Filter = {\n id: SEARCH_FILTER_ID,\n type: 'string',\n label: '',\n values: valuesArray.map((v) => ({ id: String(v), label: String(v) })),\n }\n\n return filter\n }\n\n // Find the matching filter option\n const filterOption = findFilterOption(key, filterOptions)\n if (!filterOption) {\n return null\n }\n\n // Create a unique key for this condition to avoid duplicates\n const conditionKey = `${key}_${operator}_${JSON.stringify(value)}`\n if (processedConditions.has(conditionKey)) {\n return null\n }\n processedConditions.add(conditionKey)\n\n // Convert the condition values to FilterValue objects\n const filterValues = convertConditionValueToFilterValues(value, operator, filterOption)\n\n // hasValue/noValue chips encode the null-check in the value itself — marking them\n // inverted would flip the operator back on the next conversion (notnull <-> isnull)\n const isNullnessCheck =\n filterValues.length === 1 && ['hasValue', 'noValue'].includes(String(filterValues[0].id))\n\n // Determine if the filter is inverted based on the operator\n const inverted = isNullnessCheck ? false : isInvertedOperator(operator, filterOption.type)\n\n // Determine the filter operator (AND/OR)\n const filterOperator = getFilterOperator(operator, filterOption.type)\n\n const filter: Filter = {\n id: filterOption.id,\n type: filterOption.type as Filter['type'],\n label: filterOption.label,\n inverted,\n operator: filterOperator,\n icon: filterOption.icon,\n values: filterValues,\n isCustom: filterOption.allowsCustomValues,\n singleSelect: filterOption.singleSelect,\n }\n\n return filter\n}\n\nconst findFilterOption = (key: string, filterOptions: Option[]): Option | undefined => {\n // Try exact match first\n let option = filterOptions.find((opt) => opt.id === key)\n if (option) return option\n\n // Try to find by the base key (without prefixes)\n option = filterOptions.find(\n (opt) =>\n opt.id.endsWith(key) ||\n opt.id.replace(/^[^.]*\\./, '') === key ||\n opt.id.split('_').pop() === key,\n )\n if (option) return option\n\n // Try to find by label match\n option = filterOptions.find((opt) => opt.label?.toLowerCase() === key.toLowerCase())\n\n return option\n}\n\nconst convertConditionValueToFilterValues = (\n value: QueryCondition['value'],\n operator: QueryCondition['operator'],\n filterOption: Option,\n): FilterValue[] => {\n // Handle special operators for null/empty checks\n if (operator === 'isnull' || operator === 'notnull') {\n return operator === 'isnull'\n ? [{ id: 'noValue', label: 'No Value' }]\n : [{ id: 'hasValue', label: 'Has Value' }]\n }\n\n // Handle empty array cases - these represent \"No Value\" and \"Has Value\" conditions\n if (Array.isArray(value) && value.length === 0) {\n if (operator === 'eq') {\n // Empty array with 'eq' operator means \"No Value\"\n return [{ id: 'noValue', label: 'No Value' }]\n } else if (operator === 'ne') {\n // Empty array with 'ne' operator means \"Has Value\"\n return [{ id: 'hasValue', label: 'Has Value' }]\n }\n }\n\n if (value === undefined || value === null) {\n return []\n }\n\n // Convert value(s) to FilterValue objects\n const values = Array.isArray(value) ? value : [value]\n\n return values.map((val) => {\n let stringValue = String(val)\n let isCustomValue = false\n\n // Handle LIKE operator with wildcards - strip them and mark as custom\n if (operator === 'like' && typeof val === 'string') {\n // Remove leading and trailing % wildcards\n stringValue = val.replace(/^%/, '').replace(/%$/, '')\n isCustomValue = true\n }\n\n // Try to find existing option value with metadata (only if not already marked as custom from LIKE)\n if (!isCustomValue) {\n const existingValue = filterOption.values?.find((v: FilterValue) => v.id === stringValue)\n if (existingValue) {\n return existingValue\n }\n }\n\n // Format datetime values nicely instead of showing raw ISO strings\n if (filterOption.type === 'datetime' && typeof val === 'string') {\n try {\n const date = parseISO(val)\n if (isValid(date)) {\n return {\n id: stringValue,\n label: format(date, 'MMM d, yyyy'),\n isCustom: true,\n }\n }\n } catch {\n // fall through to default\n }\n }\n\n // Create a basic FilterValue if no existing option found or if it's a LIKE value\n return {\n id: stringValue,\n label: stringValue,\n isCustom: true,\n }\n })\n}\n\nconst isInvertedOperator = (operator: QueryCondition['operator'], type?: string): boolean => {\n const invertedOperators = ['ne', 'notin', 'excludes', 'excludesall', 'excludesany', 'notnull']\n return operator ? invertedOperators.includes(operator) : false\n}\n\nconst getFilterOperator = (operator: QueryCondition['operator'], type?: string): 'AND' | 'OR' => {\n // For list types, determine AND/OR based on the operator\n if (type?.startsWith('list_of_')) {\n if (operator === 'includesall' || operator === 'excludesall') {\n return 'AND'\n }\n return 'OR'\n }\n\n // Default to OR for most cases\n return 'OR'\n}\n\nexport default queryFilterToClientFilter\n"],"names":["queryFilterToClientFilter","queryFilter","filterOptions","filters","processedConditions","condition","filter","convertConditionToFilter","datetimeFilter","tryMergeDatetimeRange","nestedFilters","nestedFilter","conditions","c","key","filterOption","findFilterOption","gteCondition","lteCondition","rawStartValue","rawEndValue","startISO","isRelativeDateValue","resolveRelativeValue","endISO","label","relativePattern","detectRelativeDatePattern","startDate","parseISO","endDate","isValid","currentYear","endDateFormat","format","rangeValue","value","operator","SEARCH_FILTER_ID","valuesArray","v","conditionKey","filterValues","convertConditionValueToFilterValues","inverted","isInvertedOperator","filterOperator","getFilterOperator","option","opt","val","stringValue","isCustomValue","existingValue","date","type"],"mappings":"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"}
1
+ {"version":3,"file":"queryFilterToClientFilter.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.ts"],"sourcesContent":["import { Filter, FilterValue, SEARCH_FILTER_ID } from '@ynput/ayon-react-components'\nimport { QueryFilter, QueryCondition } from '../types/operations'\nimport { format, parseISO, isValid } from 'date-fns'\nimport { detectRelativeDatePattern } from '@shared/components/SearchFilter/filterDates'\nimport { isRelativeDateValue, resolveRelativeValue } from './expandRelativeDates'\n\n// Option interface for filter options (from useBuildFilterOptions)\ninterface Option {\n id: string\n type?: string\n label: string\n icon?: string | null\n img?: string | null\n inverted?: boolean\n operator?: 'AND' | 'OR'\n values?: FilterValue[]\n allowsCustomValues?: boolean\n allowHasValue?: boolean\n allowNoValue?: boolean\n allowExcludes?: boolean\n operatorChangeable?: boolean\n singleSelect?: boolean\n}\n\n/**\n * Converts a QueryFilter back to Filter[] objects that can be consumed by the SearchFilter component\n * This requires the filter options to properly reconstruct the Filter objects with all their metadata\n */\nexport const queryFilterToClientFilter = (\n queryFilter: QueryFilter | undefined,\n filterOptions: Option[],\n): Filter[] => {\n if (!queryFilter?.conditions || queryFilter.conditions.length === 0) {\n return []\n }\n\n const filters: Filter[] = []\n const processedConditions = new Set<string>()\n\n // Process each condition in the query filter\n queryFilter.conditions.forEach((condition) => {\n if ('key' in condition) {\n // This is a QueryCondition\n const filter = convertConditionToFilter(condition, filterOptions, processedConditions)\n if (filter) {\n filters.push(filter)\n }\n } else {\n // This is a nested QueryFilter - check if it's a datetime range (gte+lte same key)\n const datetimeFilter = tryMergeDatetimeRange(condition, filterOptions)\n if (datetimeFilter) {\n filters.push(datetimeFilter)\n } else {\n // Recursively process other nested QueryFilters\n const nestedFilters = queryFilterToClientFilter(condition, filterOptions)\n filters.push(...nestedFilters)\n }\n }\n })\n\n return mergeFiltersById(filters)\n}\n\n/**\n * Merges filters that share the same id by combining their values.\n * This handles the case where custom + non-custom values for the same field\n * are stored as separate conditions in the query filter (e.g. `in` + `like`)\n * but should be represented as a single filter with all values combined.\n */\nconst mergeFiltersById = (filters: Filter[]): Filter[] => {\n const filterMap = new Map<string, Filter>()\n\n for (const filter of filters) {\n const existing = filterMap.get(filter.id)\n if (existing) {\n // Merge values, avoiding duplicates by id\n const existingValueIds = new Set((existing.values || []).map((v) => v.id))\n const newValues = (filter.values || []).filter((v) => !existingValueIds.has(v.id))\n existing.values = [...(existing.values || []), ...newValues]\n } else {\n filterMap.set(filter.id, { ...filter, values: [...(filter.values || [])] })\n }\n }\n\n return Array.from(filterMap.values())\n}\n\n/**\n * Detects nested QueryFilters that represent datetime ranges (gte+lte on the same key)\n * and merges them into a single datetime Filter with proper range values.\n */\nexport const tryMergeDatetimeRange = (\n nestedFilter: QueryFilter,\n filterOptions: Option[],\n): Filter | null => {\n if (!nestedFilter.conditions || nestedFilter.conditions.length < 1) return null\n\n // All conditions must be QueryConditions (not nested QueryFilters)\n const conditions = nestedFilter.conditions.filter((c): c is QueryCondition => 'key' in c)\n if (conditions.length !== nestedFilter.conditions.length) return null\n\n // All conditions must share the same key\n const key = conditions[0].key\n if (!conditions.every((c) => c.key === key)) return null\n\n // Find the matching filter option and check it's a datetime type\n const filterOption = findFilterOption(key, filterOptions)\n if (!filterOption || filterOption.type !== 'datetime') return null\n\n // Extract gte (start) and lte (end) values, resolving relative dates\n const gteCondition = conditions.find((c) => c.operator === 'gte')\n const lteCondition = conditions.find((c) => c.operator === 'lte')\n if (!gteCondition && !lteCondition) return null\n\n const rawStartValue = gteCondition?.value as string | undefined\n const rawEndValue = lteCondition?.value as string | undefined\n const startISO =\n rawStartValue && isRelativeDateValue(rawStartValue)\n ? resolveRelativeValue(rawStartValue)\n : rawStartValue\n const endISO =\n rawEndValue && isRelativeDateValue(rawEndValue)\n ? resolveRelativeValue(rawEndValue)\n : rawEndValue\n\n // Build the range label\n let label = 'Custom range'\n if (startISO && endISO) {\n // Check if it matches a relative date pattern first\n const relativePattern = detectRelativeDatePattern(startISO, endISO)\n if (relativePattern) {\n label = relativePattern.label\n } else {\n // Fall back to showing the date range\n const startDate = parseISO(startISO)\n const endDate = parseISO(endISO)\n if (isValid(startDate) && isValid(endDate)) {\n const currentYear = new Date().getFullYear()\n const endDateFormat = endDate.getFullYear() === currentYear ? 'MMM d' : 'MMM d, yyyy'\n label = `${format(startDate, 'MMM d')} – ${format(endDate, endDateFormat)}`\n }\n }\n }\n\n // `values` holds the gte/lte range pair — used by clientFilterToQueryFilter for round-trip\n // but not part of the FilterValue type, so we extend it at runtime\n const rangeValue = {\n id: `custom-${startISO || ''}-${endISO || ''}`,\n label,\n values: [\n ...(startISO\n ? [\n {\n id: startISO,\n label: isValid(parseISO(startISO))\n ? format(parseISO(startISO), 'MMM d, yyyy')\n : startISO,\n },\n ]\n : []),\n ...(endISO\n ? [\n {\n id: endISO,\n label: isValid(parseISO(endISO)) ? format(parseISO(endISO), 'MMM d, yyyy') : endISO,\n },\n ]\n : []),\n ],\n } as FilterValue\n\n return {\n id: filterOption.id,\n type: filterOption.type as Filter['type'],\n label: filterOption.label,\n icon: filterOption.icon,\n inverted: nestedFilter.operator === 'or',\n values: [rangeValue],\n singleSelect: filterOption.singleSelect,\n }\n}\n\nconst convertConditionToFilter = (\n condition: QueryCondition,\n filterOptions: Option[],\n processedConditions: Set<string>,\n): Filter | null => {\n const { key, value, operator } = condition\n\n // check if the filter is a text search filter\n if (key === SEARCH_FILTER_ID) {\n const valuesArray = Array.isArray(value) ? value : [value || '']\n const filter: Filter = {\n id: SEARCH_FILTER_ID,\n type: 'string',\n label: '',\n values: valuesArray.map((v) => ({ id: String(v), label: String(v) })),\n }\n\n return filter\n }\n\n // Find the matching filter option\n const filterOption = findFilterOption(key, filterOptions)\n if (!filterOption) {\n return null\n }\n\n // Create a unique key for this condition to avoid duplicates\n const conditionKey = `${key}_${operator}_${JSON.stringify(value)}`\n if (processedConditions.has(conditionKey)) {\n return null\n }\n processedConditions.add(conditionKey)\n\n // Convert the condition values to FilterValue objects\n const filterValues = convertConditionValueToFilterValues(value, operator, filterOption)\n\n // hasValue/noValue chips encode the null-check in the value itself — marking them\n // inverted would flip the operator back on the next conversion (notnull <-> isnull)\n const isNullnessCheck =\n filterValues.length === 1 && ['hasValue', 'noValue'].includes(String(filterValues[0].id))\n\n // Determine if the filter is inverted based on the operator\n const inverted = isNullnessCheck ? false : isInvertedOperator(operator, filterOption.type)\n\n // Determine the filter operator (AND/OR)\n const filterOperator = getFilterOperator(operator, filterOption.type)\n\n const filter: Filter = {\n id: filterOption.id,\n type: filterOption.type as Filter['type'],\n label: filterOption.label,\n inverted,\n operator: filterOperator,\n icon: filterOption.icon,\n values: filterValues,\n isCustom: filterOption.allowsCustomValues,\n singleSelect: filterOption.singleSelect,\n }\n\n return filter\n}\n\nconst findFilterOption = (key: string, filterOptions: Option[]): Option | undefined => {\n // Try exact match first\n let option = filterOptions.find((opt) => opt.id === key)\n if (option) return option\n\n // Try to find by the base key (without prefixes)\n option = filterOptions.find(\n (opt) =>\n opt.id.endsWith(key) ||\n opt.id.replace(/^[^.]*\\./, '') === key ||\n opt.id.split('_').pop() === key,\n )\n if (option) return option\n\n // Try to find by label match\n option = filterOptions.find((opt) => opt.label?.toLowerCase() === key.toLowerCase())\n\n return option\n}\n\nconst convertConditionValueToFilterValues = (\n value: QueryCondition['value'],\n operator: QueryCondition['operator'],\n filterOption: Option,\n): FilterValue[] => {\n // Handle special operators for null/empty checks\n if (operator === 'isnull' || operator === 'notnull') {\n return operator === 'isnull'\n ? [{ id: 'noValue', label: 'No Value' }]\n : [{ id: 'hasValue', label: 'Has Value' }]\n }\n\n // Handle empty array cases - these represent \"No Value\" and \"Has Value\" conditions\n if (Array.isArray(value) && value.length === 0) {\n if (operator === 'eq') {\n // Empty array with 'eq' operator means \"No Value\"\n return [{ id: 'noValue', label: 'No Value' }]\n } else if (operator === 'ne') {\n // Empty array with 'ne' operator means \"Has Value\"\n return [{ id: 'hasValue', label: 'Has Value' }]\n }\n }\n\n if (value === undefined || value === null) {\n return []\n }\n\n // Convert value(s) to FilterValue objects\n const values = Array.isArray(value) ? value : [value]\n\n return values.map((val) => {\n let stringValue = String(val)\n let isCustomValue = false\n\n // Handle LIKE operator with wildcards - strip them and mark as custom\n if (operator === 'like' && typeof val === 'string') {\n // Remove leading and trailing % wildcards\n stringValue = val.replace(/^%/, '').replace(/%$/, '')\n isCustomValue = true\n }\n\n // Try to find existing option value with metadata (only if not already marked as custom from LIKE)\n if (!isCustomValue) {\n const existingValue = filterOption.values?.find((v: FilterValue) => v.id === stringValue)\n if (existingValue) {\n return existingValue\n }\n }\n\n // Format datetime values nicely instead of showing raw ISO strings\n if (filterOption.type === 'datetime' && typeof val === 'string') {\n try {\n const date = parseISO(val)\n if (isValid(date)) {\n return {\n id: stringValue,\n label: format(date, 'MMM d, yyyy'),\n isCustom: true,\n }\n }\n } catch {\n // fall through to default\n }\n }\n\n // Create a basic FilterValue if no existing option found or if it's a LIKE value\n return {\n id: stringValue,\n label: stringValue,\n isCustom: true,\n }\n })\n}\n\nconst isInvertedOperator = (operator: QueryCondition['operator'], type?: string): boolean => {\n const invertedOperators = ['ne', 'notin', 'excludes', 'excludesall', 'excludesany', 'notnull']\n return operator ? invertedOperators.includes(operator) : false\n}\n\nconst getFilterOperator = (operator: QueryCondition['operator'], type?: string): 'AND' | 'OR' => {\n // For list types, determine AND/OR based on the operator\n if (type?.startsWith('list_of_')) {\n if (operator === 'includesall' || operator === 'excludesall') {\n return 'AND'\n }\n return 'OR'\n }\n\n // Default to OR for most cases\n return 'OR'\n}\n\nexport default queryFilterToClientFilter\n"],"names":["queryFilterToClientFilter","queryFilter","filterOptions","filters","processedConditions","condition","filter","convertConditionToFilter","datetimeFilter","tryMergeDatetimeRange","nestedFilters","mergeFiltersById","filterMap","existing","existingValueIds","v","newValues","nestedFilter","conditions","c","key","filterOption","findFilterOption","gteCondition","lteCondition","rawStartValue","rawEndValue","startISO","isRelativeDateValue","resolveRelativeValue","endISO","label","relativePattern","detectRelativeDatePattern","startDate","parseISO","endDate","isValid","currentYear","endDateFormat","format","rangeValue","value","operator","SEARCH_FILTER_ID","valuesArray","conditionKey","filterValues","convertConditionValueToFilterValues","inverted","isInvertedOperator","filterOperator","getFilterOperator","option","opt","val","stringValue","isCustomValue","existingValue","date","type"],"mappings":"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"}