@ynput/ayon-frontend-shared 0.2.39 → 0.2.41

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 (436) hide show
  1. package/dist/DetailsPanel.cjs.js +1 -1
  2. package/dist/DetailsPanel.es.js +24 -22
  3. package/dist/DetailsPanel.es.js.map +1 -1
  4. package/dist/api.cjs.js +1 -1
  5. package/dist/api.es.js +256 -248
  6. package/dist/api.es.js.map +1 -1
  7. package/dist/index.cjs.js +1 -1
  8. package/dist/index.es.js +11 -9
  9. package/dist/index.es.js.map +1 -1
  10. package/dist/shared/src/api/queries/activities/util/activityRealtimeHandler.cjs.js +1 -1
  11. package/dist/shared/src/api/queries/activities/util/activityRealtimeHandler.cjs.js.map +1 -1
  12. package/dist/shared/src/api/queries/activities/util/activityRealtimeHandler.es.js +16 -16
  13. package/dist/shared/src/api/queries/activities/util/activityRealtimeHandler.es.js.map +1 -1
  14. package/dist/shared/src/api/queries/config/getConfig.cjs.js +2 -0
  15. package/dist/shared/src/api/queries/config/getConfig.cjs.js.map +1 -0
  16. package/dist/shared/src/api/queries/config/getConfig.es.js +111 -0
  17. package/dist/shared/src/api/queries/config/getConfig.es.js.map +1 -0
  18. package/dist/shared/src/api/queries/config/updateConfig.cjs.js +2 -0
  19. package/dist/shared/src/api/queries/config/updateConfig.cjs.js.map +1 -0
  20. package/dist/shared/src/api/queries/config/updateConfig.es.js +13 -0
  21. package/dist/shared/src/api/queries/config/updateConfig.es.js.map +1 -0
  22. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js +1 -1
  23. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js.map +1 -1
  24. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js +5 -3
  25. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js.map +1 -1
  26. package/dist/shared/src/api/queries/entities/updateEntity.cjs.js +1 -1
  27. package/dist/shared/src/api/queries/entities/updateEntity.cjs.js.map +1 -1
  28. package/dist/shared/src/api/queries/entities/updateEntity.es.js +5 -3
  29. package/dist/shared/src/api/queries/entities/updateEntity.es.js.map +1 -1
  30. package/dist/shared/src/api/queries/links/getEntityLinks.cjs.js +1 -1
  31. package/dist/shared/src/api/queries/links/getEntityLinks.cjs.js.map +1 -1
  32. package/dist/shared/src/api/queries/links/getEntityLinks.es.js +106 -86
  33. package/dist/shared/src/api/queries/links/getEntityLinks.es.js.map +1 -1
  34. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js +1 -1
  35. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js.map +1 -1
  36. package/dist/shared/src/api/queries/overview/updateOverview.es.js +68 -66
  37. package/dist/shared/src/api/queries/overview/updateOverview.es.js.map +1 -1
  38. package/dist/shared/src/api/queries/users/getUsers.cjs.js +2 -2
  39. package/dist/shared/src/api/queries/users/getUsers.cjs.js.map +1 -1
  40. package/dist/shared/src/api/queries/users/getUsers.es.js +34 -32
  41. package/dist/shared/src/api/queries/users/getUsers.es.js.map +1 -1
  42. package/dist/shared/src/components/AddonLoadingScreen/AddonLoadingScreen.cjs.js +8 -7
  43. package/dist/shared/src/components/AddonLoadingScreen/AddonLoadingScreen.cjs.js.map +1 -1
  44. package/dist/shared/src/components/AddonLoadingScreen/AddonLoadingScreen.es.js +24 -20
  45. package/dist/shared/src/components/AddonLoadingScreen/AddonLoadingScreen.es.js.map +1 -1
  46. package/dist/shared/src/components/Chips/Chips.cjs.js +10 -6
  47. package/dist/shared/src/components/Chips/Chips.cjs.js.map +1 -1
  48. package/dist/shared/src/components/Chips/Chips.es.js +44 -38
  49. package/dist/shared/src/components/Chips/Chips.es.js.map +1 -1
  50. package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js +1 -1
  51. package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js.map +1 -1
  52. package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js +4 -2
  53. package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js.map +1 -1
  54. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
  55. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
  56. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +4 -2
  57. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
  58. package/dist/shared/src/components/DetailsPanelDetails/DescriptionSection.cjs.js +1 -1
  59. package/dist/shared/src/components/DetailsPanelDetails/DescriptionSection.cjs.js.map +1 -1
  60. package/dist/shared/src/components/DetailsPanelDetails/DescriptionSection.es.js +4 -2
  61. package/dist/shared/src/components/DetailsPanelDetails/DescriptionSection.es.js.map +1 -1
  62. package/dist/shared/src/components/DetailsPanelDetails/DetailsPanelDetails.cjs.js +1 -1
  63. package/dist/shared/src/components/DetailsPanelDetails/DetailsPanelDetails.cjs.js.map +1 -1
  64. package/dist/shared/src/components/DetailsPanelDetails/DetailsPanelDetails.es.js +4 -2
  65. package/dist/shared/src/components/DetailsPanelDetails/DetailsPanelDetails.es.js.map +1 -1
  66. package/dist/shared/src/components/DetailsPanelDetails/hooks/useEntityEditing.cjs.js +1 -1
  67. package/dist/shared/src/components/DetailsPanelDetails/hooks/useEntityEditing.cjs.js.map +1 -1
  68. package/dist/shared/src/components/DetailsPanelDetails/hooks/useEntityEditing.es.js +4 -2
  69. package/dist/shared/src/components/DetailsPanelDetails/hooks/useEntityEditing.es.js.map +1 -1
  70. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js +1 -1
  71. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js.map +1 -1
  72. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js +4 -2
  73. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js.map +1 -1
  74. package/dist/shared/src/components/Feedback/FeedbackContext.cjs.js +1 -1
  75. package/dist/shared/src/components/Feedback/FeedbackContext.cjs.js.map +1 -1
  76. package/dist/shared/src/components/Feedback/FeedbackContext.es.js +6 -4
  77. package/dist/shared/src/components/Feedback/FeedbackContext.es.js.map +1 -1
  78. package/dist/shared/src/components/LinksManager/AddNewLinks.cjs.js +1 -1
  79. package/dist/shared/src/components/LinksManager/AddNewLinks.cjs.js.map +1 -1
  80. package/dist/shared/src/components/LinksManager/AddNewLinks.es.js +4 -2
  81. package/dist/shared/src/components/LinksManager/AddNewLinks.es.js.map +1 -1
  82. package/dist/shared/src/components/LinksManager/LinkManagerItem.cjs.js +1 -1
  83. package/dist/shared/src/components/LinksManager/LinkManagerItem.cjs.js.map +1 -1
  84. package/dist/shared/src/components/LinksManager/LinkManagerItem.es.js +28 -25
  85. package/dist/shared/src/components/LinksManager/LinkManagerItem.es.js.map +1 -1
  86. package/dist/shared/src/components/LinksManager/LinksManager.cjs.js.map +1 -1
  87. package/dist/shared/src/components/LinksManager/LinksManager.es.js.map +1 -1
  88. package/dist/shared/src/components/LinksManager/LinksManager.styled.cjs.js +5 -0
  89. package/dist/shared/src/components/LinksManager/LinksManager.styled.cjs.js.map +1 -1
  90. package/dist/shared/src/components/LinksManager/LinksManager.styled.es.js +5 -0
  91. package/dist/shared/src/components/LinksManager/LinksManager.styled.es.js.map +1 -1
  92. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.cjs.js +1 -1
  93. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.cjs.js.map +1 -1
  94. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.es.js +4 -2
  95. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.es.js.map +1 -1
  96. package/dist/shared/src/components/ListAttributeForm/ListAttributeForm.cjs.js +1 -1
  97. package/dist/shared/src/components/ListAttributeForm/ListAttributeForm.cjs.js.map +1 -1
  98. package/dist/shared/src/components/ListAttributeForm/ListAttributeForm.es.js +4 -2
  99. package/dist/shared/src/components/ListAttributeForm/ListAttributeForm.es.js.map +1 -1
  100. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js +1 -1
  101. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js.map +1 -1
  102. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js +4 -2
  103. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js.map +1 -1
  104. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +1 -1
  105. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
  106. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +6 -4
  107. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
  108. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js +1 -1
  109. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js.map +1 -1
  110. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js +4 -2
  111. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js.map +1 -1
  112. package/dist/shared/src/components/RenameForm/RenameForm.cjs.js +1 -1
  113. package/dist/shared/src/components/RenameForm/RenameForm.cjs.js.map +1 -1
  114. package/dist/shared/src/components/RenameForm/RenameForm.es.js +4 -2
  115. package/dist/shared/src/components/RenameForm/RenameForm.es.js.map +1 -1
  116. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.cjs.js +1 -1
  117. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.cjs.js.map +1 -1
  118. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.es.js +4 -2
  119. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.es.js.map +1 -1
  120. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +1 -1
  121. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
  122. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +4 -2
  123. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
  124. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +1 -1
  125. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
  126. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +5 -3
  127. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
  128. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +1 -1
  129. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
  130. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +4 -2
  131. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
  132. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.cjs.js +1 -1
  133. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.cjs.js.map +1 -1
  134. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.es.js +4 -2
  135. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.es.js.map +1 -1
  136. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +1 -1
  137. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -1
  138. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +8 -6
  139. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js.map +1 -1
  140. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +1 -1
  141. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
  142. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +4 -2
  143. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
  144. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js +1 -1
  145. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js.map +1 -1
  146. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js +4 -2
  147. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js.map +1 -1
  148. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.cjs.js +1 -1
  149. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.cjs.js.map +1 -1
  150. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.es.js +6 -4
  151. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.es.js.map +1 -1
  152. package/dist/shared/src/components/Watchers/Watchers.cjs.js +1 -1
  153. package/dist/shared/src/components/Watchers/Watchers.cjs.js.map +1 -1
  154. package/dist/shared/src/components/Watchers/Watchers.es.js +4 -2
  155. package/dist/shared/src/components/Watchers/Watchers.es.js.map +1 -1
  156. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +1 -1
  157. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
  158. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +4 -2
  159. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
  160. package/dist/shared/src/containers/Actions/Actions.cjs.js +1 -1
  161. package/dist/shared/src/containers/Actions/Actions.cjs.js.map +1 -1
  162. package/dist/shared/src/containers/Actions/Actions.es.js +4 -2
  163. package/dist/shared/src/containers/Actions/Actions.es.js.map +1 -1
  164. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +1 -1
  165. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
  166. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +4 -2
  167. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
  168. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  169. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  170. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +4 -2
  171. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  172. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +1 -1
  173. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
  174. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +4 -2
  175. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
  176. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +1 -1
  177. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
  178. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +5 -3
  179. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
  180. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +1 -1
  181. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
  182. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +4 -2
  183. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
  184. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js +1 -1
  185. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js.map +1 -1
  186. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js +4 -2
  187. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js.map +1 -1
  188. package/dist/shared/src/containers/DetailsPanel/FeedContextWrapper.cjs.js +1 -1
  189. package/dist/shared/src/containers/DetailsPanel/FeedContextWrapper.cjs.js.map +1 -1
  190. package/dist/shared/src/containers/DetailsPanel/FeedContextWrapper.es.js +4 -2
  191. package/dist/shared/src/containers/DetailsPanel/FeedContextWrapper.es.js.map +1 -1
  192. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.cjs.js +1 -1
  193. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.cjs.js.map +1 -1
  194. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.es.js +4 -2
  195. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.es.js.map +1 -1
  196. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.cjs.js +1 -1
  197. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.cjs.js.map +1 -1
  198. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.es.js +4 -2
  199. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.es.js.map +1 -1
  200. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.cjs.js +1 -1
  201. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.cjs.js.map +1 -1
  202. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.es.js +4 -2
  203. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.es.js.map +1 -1
  204. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.cjs.js +1 -1
  205. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.cjs.js.map +1 -1
  206. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.es.js +4 -2
  207. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.es.js.map +1 -1
  208. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.cjs.js +1 -1
  209. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.cjs.js.map +1 -1
  210. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.es.js +4 -2
  211. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.es.js.map +1 -1
  212. package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.cjs.js +1 -1
  213. package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.cjs.js.map +1 -1
  214. package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.es.js +4 -2
  215. package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.es.js.map +1 -1
  216. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +1 -1
  217. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
  218. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +4 -2
  219. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
  220. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.cjs.js +1 -1
  221. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.cjs.js.map +1 -1
  222. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.es.js +4 -2
  223. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.es.js.map +1 -1
  224. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js +1 -1
  225. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js.map +1 -1
  226. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js +4 -2
  227. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js.map +1 -1
  228. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js +1 -1
  229. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js.map +1 -1
  230. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js +4 -2
  231. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js.map +1 -1
  232. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js +1 -1
  233. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js.map +1 -1
  234. package/dist/shared/src/containers/Feed/context/FeedContext.es.js +7 -5
  235. package/dist/shared/src/containers/Feed/context/FeedContext.es.js.map +1 -1
  236. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.cjs.js +1 -1
  237. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.cjs.js.map +1 -1
  238. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.es.js +4 -2
  239. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.es.js.map +1 -1
  240. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
  241. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  242. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +4 -2
  243. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  244. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  245. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  246. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +4 -2
  247. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  248. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.cjs.js +1 -1
  249. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.cjs.js.map +1 -1
  250. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.es.js +4 -2
  251. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.es.js.map +1 -1
  252. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
  253. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
  254. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +4 -2
  255. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
  256. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js +1 -1
  257. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js.map +1 -1
  258. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js +4 -2
  259. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js.map +1 -1
  260. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.cjs.js +1 -1
  261. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.cjs.js.map +1 -1
  262. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.es.js +6 -4
  263. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.es.js.map +1 -1
  264. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js +1 -1
  265. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js.map +1 -1
  266. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js +4 -2
  267. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js.map +1 -1
  268. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
  269. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
  270. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +7 -5
  271. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
  272. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js +1 -1
  273. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -1
  274. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js +4 -2
  275. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -1
  276. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js +1 -1
  277. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js.map +1 -1
  278. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js +4 -2
  279. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js.map +1 -1
  280. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js +1 -1
  281. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js.map +1 -1
  282. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js +4 -2
  283. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js.map +1 -1
  284. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.cjs.js +1 -1
  285. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.cjs.js.map +1 -1
  286. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.es.js +4 -2
  287. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.es.js.map +1 -1
  288. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +1 -1
  289. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
  290. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +30 -28
  291. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
  292. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js +1 -1
  293. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js.map +1 -1
  294. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js +4 -2
  295. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js.map +1 -1
  296. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.cjs.js +1 -1
  297. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.cjs.js.map +1 -1
  298. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.es.js +4 -2
  299. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.es.js.map +1 -1
  300. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js +1 -1
  301. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js.map +1 -1
  302. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js +4 -2
  303. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js.map +1 -1
  304. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.cjs.js +1 -1
  305. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.cjs.js.map +1 -1
  306. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.es.js +4 -2
  307. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.es.js.map +1 -1
  308. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.cjs.js +1 -1
  309. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.cjs.js.map +1 -1
  310. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.es.js +4 -2
  311. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.es.js.map +1 -1
  312. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +1 -1
  313. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
  314. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +4 -2
  315. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
  316. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js +1 -1
  317. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js.map +1 -1
  318. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js +15 -13
  319. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js.map +1 -1
  320. package/dist/shared/src/containers/ProjectTreeTable/utils/linksToTableData.cjs.js +1 -1
  321. package/dist/shared/src/containers/ProjectTreeTable/utils/linksToTableData.cjs.js.map +1 -1
  322. package/dist/shared/src/containers/ProjectTreeTable/utils/linksToTableData.es.js +34 -21
  323. package/dist/shared/src/containers/ProjectTreeTable/utils/linksToTableData.es.js.map +1 -1
  324. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.cjs.js +1 -1
  325. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.cjs.js.map +1 -1
  326. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.es.js +31 -28
  327. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.es.js.map +1 -1
  328. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.cjs.js +1 -1
  329. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.cjs.js.map +1 -1
  330. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.es.js +4 -2
  331. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.es.js.map +1 -1
  332. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +1 -1
  333. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
  334. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +4 -2
  335. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
  336. package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js +1 -1
  337. package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js.map +1 -1
  338. package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js +4 -2
  339. package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js.map +1 -1
  340. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.cjs.js +1 -1
  341. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.cjs.js.map +1 -1
  342. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.es.js +4 -2
  343. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.es.js.map +1 -1
  344. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
  345. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
  346. package/dist/shared/src/containers/Views/context/ViewsContext.es.js +6 -4
  347. package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
  348. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.cjs.js +1 -1
  349. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.cjs.js.map +1 -1
  350. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.es.js +4 -2
  351. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.es.js.map +1 -1
  352. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.cjs.js +1 -1
  353. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.cjs.js.map +1 -1
  354. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.es.js +4 -2
  355. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.es.js.map +1 -1
  356. package/dist/shared/src/containers/Views/hooks/useSelectedView.cjs.js +1 -1
  357. package/dist/shared/src/containers/Views/hooks/useSelectedView.cjs.js.map +1 -1
  358. package/dist/shared/src/containers/Views/hooks/useSelectedView.es.js +4 -2
  359. package/dist/shared/src/containers/Views/hooks/useSelectedView.es.js.map +1 -1
  360. package/dist/shared/src/containers/Views/hooks/useViewsMutations.cjs.js +1 -1
  361. package/dist/shared/src/containers/Views/hooks/useViewsMutations.cjs.js.map +1 -1
  362. package/dist/shared/src/containers/Views/hooks/useViewsMutations.es.js +4 -2
  363. package/dist/shared/src/containers/Views/hooks/useViewsMutations.es.js.map +1 -1
  364. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +1 -1
  365. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -1
  366. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js +4 -2
  367. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -1
  368. package/dist/shared/src/context/AddonProjectContext.cjs.js +1 -1
  369. package/dist/shared/src/context/AddonProjectContext.cjs.js.map +1 -1
  370. package/dist/shared/src/context/AddonProjectContext.es.js +6 -4
  371. package/dist/shared/src/context/AddonProjectContext.es.js.map +1 -1
  372. package/dist/shared/src/context/DetailsPanelContext.cjs.js +1 -1
  373. package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
  374. package/dist/shared/src/context/DetailsPanelContext.es.js +6 -4
  375. package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
  376. package/dist/shared/src/context/GlobalContext.cjs.js +1 -1
  377. package/dist/shared/src/context/GlobalContext.cjs.js.map +1 -1
  378. package/dist/shared/src/context/GlobalContext.es.js +6 -4
  379. package/dist/shared/src/context/GlobalContext.es.js.map +1 -1
  380. package/dist/shared/src/context/PowerpackContext.cjs.js +1 -1
  381. package/dist/shared/src/context/PowerpackContext.cjs.js.map +1 -1
  382. package/dist/shared/src/context/PowerpackContext.es.js +8 -6
  383. package/dist/shared/src/context/PowerpackContext.es.js.map +1 -1
  384. package/dist/shared/src/context/ProjectContext.cjs.js +1 -1
  385. package/dist/shared/src/context/ProjectContext.cjs.js.map +1 -1
  386. package/dist/shared/src/context/ProjectContext.es.js +44 -38
  387. package/dist/shared/src/context/ProjectContext.es.js.map +1 -1
  388. package/dist/shared/src/context/ProjectFoldersContext.cjs.js +1 -1
  389. package/dist/shared/src/context/ProjectFoldersContext.cjs.js.map +1 -1
  390. package/dist/shared/src/context/ProjectFoldersContext.es.js +6 -4
  391. package/dist/shared/src/context/ProjectFoldersContext.es.js.map +1 -1
  392. package/dist/shared/src/context/RemoteModulesContext.cjs.js +1 -1
  393. package/dist/shared/src/context/RemoteModulesContext.cjs.js.map +1 -1
  394. package/dist/shared/src/context/RemoteModulesContext.es.js +6 -4
  395. package/dist/shared/src/context/RemoteModulesContext.es.js.map +1 -1
  396. package/dist/shared/src/context/UriContext.cjs.js +1 -1
  397. package/dist/shared/src/context/UriContext.cjs.js.map +1 -1
  398. package/dist/shared/src/context/UriContext.es.js +7 -5
  399. package/dist/shared/src/context/UriContext.es.js.map +1 -1
  400. package/dist/shared/src/context/WebsocketContext.cjs.js +1 -1
  401. package/dist/shared/src/context/WebsocketContext.cjs.js.map +1 -1
  402. package/dist/shared/src/context/WebsocketContext.es.js +6 -4
  403. package/dist/shared/src/context/WebsocketContext.es.js.map +1 -1
  404. package/dist/shared/src/hooks/useActionTriggers.cjs.js +1 -1
  405. package/dist/shared/src/hooks/useActionTriggers.cjs.js.map +1 -1
  406. package/dist/shared/src/hooks/useActionTriggers.es.js +4 -2
  407. package/dist/shared/src/hooks/useActionTriggers.es.js.map +1 -1
  408. package/dist/shared/src/hooks/useEntityUpdate.cjs.js +1 -1
  409. package/dist/shared/src/hooks/useEntityUpdate.cjs.js.map +1 -1
  410. package/dist/shared/src/hooks/useEntityUpdate.es.js +4 -2
  411. package/dist/shared/src/hooks/useEntityUpdate.es.js.map +1 -1
  412. package/dist/shared/src/hooks/useGetEntityGroups.cjs.js +1 -1
  413. package/dist/shared/src/hooks/useGetEntityGroups.cjs.js.map +1 -1
  414. package/dist/shared/src/hooks/useGetEntityGroups.es.js +4 -2
  415. package/dist/shared/src/hooks/useGetEntityGroups.es.js.map +1 -1
  416. package/dist/shared/src/hooks/useGroupByRemoteModules.cjs.js +1 -1
  417. package/dist/shared/src/hooks/useGroupByRemoteModules.cjs.js.map +1 -1
  418. package/dist/shared/src/hooks/useGroupByRemoteModules.es.js +4 -2
  419. package/dist/shared/src/hooks/useGroupByRemoteModules.es.js.map +1 -1
  420. package/dist/shared/src/hooks/useScopedStatuses.cjs.js +1 -1
  421. package/dist/shared/src/hooks/useScopedStatuses.cjs.js.map +1 -1
  422. package/dist/shared/src/hooks/useScopedStatuses.es.js +6 -4
  423. package/dist/shared/src/hooks/useScopedStatuses.es.js.map +1 -1
  424. package/dist/shared/src/hooks/useUserProjectConfig.cjs.js +1 -1
  425. package/dist/shared/src/hooks/useUserProjectConfig.cjs.js.map +1 -1
  426. package/dist/shared/src/hooks/useUserProjectConfig.es.js +4 -2
  427. package/dist/shared/src/hooks/useUserProjectConfig.es.js.map +1 -1
  428. package/dist/types/api/queries/config/getConfig.d.ts +747 -0
  429. package/dist/types/api/queries/config/index.d.ts +2 -0
  430. package/dist/types/api/queries/config/updateConfig.d.ts +171 -0
  431. package/dist/types/api/queries/index.d.ts +1 -0
  432. package/dist/types/api/queries/links/getEntityLinks.d.ts +2 -1
  433. package/dist/types/components/AddonLoadingScreen/AddonLoadingScreen.d.ts +7 -2
  434. package/dist/types/components/Chips/Chips.d.ts +1 -0
  435. package/dist/types/components/LinksManager/LinksManager.d.ts +1 -0
  436. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildFilterOptions.cjs.js","sources":["../../../../../src/components/SearchFilter/useBuildFilterOptions.tsx"],"sourcesContent":["import { getAttributeIcon, getEntityTypeIcon } from '@shared/util'\nimport {\n ProductType,\n useGetEntityGroupsQuery,\n useGetKanbanProjectUsersQuery,\n useGetProjectsInfoQuery,\n} from '@shared/api'\nimport type {\n GetProjectsInfoResponse,\n FolderType,\n Status,\n Tag,\n TaskType,\n AttributeModel,\n AttributeEnumItem,\n AttributeData,\n EntityGroup,\n} from '@shared/api'\nimport { ColumnOrderState } from '@tanstack/react-table'\nimport { Icon, Option, Filter } from '@ynput/ayon-react-components'\nimport { dateOptions } from './filterDates'\nimport { isEmpty } from 'lodash'\nimport { SliceFilter } from '@shared/containers'\nimport { FEATURED_VERSION_TYPES } from '../FeaturedVersionOrder'\nimport { useGlobalContext } from '@shared/context'\n\ntype ScopeType = 'folder' | 'product' | 'task' | 'user' | 'version'\ntype Scope = ScopeType | ScopeType[]\n\nexport type ScopeWithFilterTypes = {\n scope: ScopeType\n filterTypes: FilterFieldType[]\n}\n\nexport type FilterFieldType =\n | 'folderType'\n | 'taskType'\n | 'productType'\n | ('users' | 'assignees' | 'author')\n | 'attributes'\n | 'status'\n | 'tags'\n | 'version'\n | 'hasReviewables'\n | 'productName'\ntype AttributeType =\n | string\n | number\n | boolean\n | Date\n | string[]\n | number[]\n | any[]\n | { [key: string]: any }\n\ntype AttributeDataValue = AttributeType | null | undefined\n\ntype FilterConfig = {\n enableExcludes?: boolean\n enableOperatorChange?: boolean\n enableRelativeValues?: boolean\n prefixes?: Partial<Record<FilterFieldType, string>> // strings that will be prepended to the id of the option\n keys?: Partial<Record<FilterFieldType, string>> // replaces the default keys for the filter\n}\n\nexport type BuildFilterOptions = {\n filterTypes?: FilterFieldType[]\n projectNames: string[]\n scope?: Scope\n scopes?: ScopeWithFilterTypes[]\n data: {\n tags?: string[]\n attributes?: Record<string, AttributeDataValue[]>\n assignees?: string[]\n productTypes?: ProductType[]\n productNames?: string[]\n }\n columnOrder?: ColumnOrderState\n config?: FilterConfig\n power?: boolean\n}\n\nexport const useBuildFilterOptions = ({\n filterTypes: globalFilterTypes = [],\n projectNames,\n scope,\n scopes: customScopes,\n data,\n config,\n columnOrder = [],\n power,\n}: BuildFilterOptions): Option[] => {\n let options: Option[] = []\n\n // Determine which scopes to use\n // If customScopes is provided, use it; otherwise, fall back to the old method\n const scopesWithTypes: Array<{ scope: ScopeType; filterTypes: FilterFieldType[] }> = customScopes\n ? customScopes\n : (() => {\n // Fallback to old method: normalize scope to array and use globalFilterTypes for all\n const normalizedScopes = scope ? (Array.isArray(scope) ? scope : [scope]) : []\n return normalizedScopes.map((s) => ({\n scope: s,\n filterTypes: globalFilterTypes,\n }))\n })()\n\n const isMultiScope = scopesWithTypes.length > 1\n\n // QUERIES\n //\n //\n // Check if any scope needs these filter types\n const anyNeedsEntitySubType = scopesWithTypes.some((s) =>\n ['entitySubType', 'status'].some((type) => s.filterTypes.includes(type as FilterFieldType)),\n )\n const anyNeedsUsers = scopesWithTypes.some((s) =>\n ['assignees', 'users', 'author'].some((type) =>\n s.filterTypes.includes(type as FilterFieldType),\n ),\n )\n // find if any search field is in any of the scopesWithTypes\n const fieldInScopes = (field: FilterFieldType): boolean => {\n return scopesWithTypes.some((s) => s.filterTypes.includes(field))\n }\n\n // get grouping options for productTypes\n // NOTE: We should revisit this to be used for all attribs and fields\n const { data: { groups: productTypes = [] } = {} } = useGetEntityGroupsQuery(\n {\n entityType: 'product',\n groupingKey: 'productType',\n projectName: projectNames[0],\n empty: true,\n },\n { skip: !projectNames?.length || !fieldInScopes('productType') },\n )\n\n const { data: projectsInfo = {} } = useGetProjectsInfoQuery(\n {\n projects: projectNames,\n },\n {\n skip: !projectNames?.length || !anyNeedsEntitySubType,\n },\n )\n\n const { data: projectUsers = [] } = useGetKanbanProjectUsersQuery(\n { projects: projectNames },\n {\n skip: !projectNames?.length || !anyNeedsUsers,\n },\n )\n\n const { attributes } = useGlobalContext()\n //\n //\n // QUERIES\n\n // ADD OPTIONS\n\n // Helper to get scope label (capitalize first letter)\n const getScopeLabel = (scope: ScopeType) => scope.charAt(0).toUpperCase() + scope.slice(1)\n\n // Loop through each scope to build options\n scopesWithTypes.forEach(({ scope: currentScope, filterTypes: scopeFilterTypes }) => {\n const scopePrefix = isMultiScope ? currentScope : undefined\n const scopeLabel = isMultiScope ? getScopeLabel(currentScope) : undefined\n\n // TASK TYPE\n // add taskType option\n if (scopeFilterTypes.includes('taskType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'taskType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'task')\n\n entitySubTypeOption.values?.push(...subTypes)\n\n options.push(entitySubTypeOption)\n }\n }\n\n // FOLDER TYPE\n // add folderType option\n if (scopeFilterTypes.includes('folderType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'folderType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'folder')\n\n entitySubTypeOption.values?.push(...subTypes)\n\n options.push(entitySubTypeOption)\n }\n }\n\n // PRODUCT TYPE\n // add productType option\n if (scopeFilterTypes.includes('productType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'productType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'product')\n entitySubTypeOption.values?.push(...subTypes)\n options.push(entitySubTypeOption)\n }\n }\n // PRODUCT NAME\n // add product name option\n if (scopeFilterTypes.includes('productName') && currentScope === 'product') {\n const productNameOption = getOptionRoot('productName', config, scopePrefix, scopeLabel)\n\n if (productNameOption) {\n // Populate with product names from data as suggestions (optional since allowsCustomValues: true)\n data.productNames?.forEach((name) => {\n if (!productNameOption.values?.some((value) => value.id === name)) {\n productNameOption.values?.push({\n id: name,\n label: name,\n })\n }\n })\n\n options.push(productNameOption)\n }\n }\n\n // STATUS\n // add status option\n if (scopeFilterTypes.includes('status')) {\n const statusOption = getOptionRoot(\n 'status',\n { ...config, enableOperatorChange: false },\n scopePrefix,\n scopeLabel,\n )\n\n if (statusOption) {\n Object.values(projectsInfo).forEach((project) => {\n const statuses = project?.statuses || []\n statuses\n .filter((status) => status.scope?.includes(currentScope))\n .forEach((status: Status) => {\n if (!statusOption.values?.some((value) => value.id === status.name)) {\n statusOption.values?.push({\n id: status.name,\n label: status.name,\n icon: status.icon,\n color: status.color,\n })\n }\n })\n })\n\n options.push(statusOption)\n }\n }\n\n // ASSIGNEES\n // add users/assignees option\n if (scopeFilterTypes.includes('assignees')) {\n const assigneesOption = getOptionRoot('assignees', config, scopePrefix, scopeLabel)\n\n if (assigneesOption) {\n // add every user for the projects (skip duplicates)\n projectUsers.forEach((user) => {\n if (!assigneesOption.values?.some((value) => value.id === user.name)) {\n assigneesOption.values?.push({\n id: user.name,\n label: user.attrib.fullName || user.name,\n img: `/api/users/${user.name}/avatar`,\n icon: null,\n })\n }\n })\n\n // sort the assignees based on the number of times they appear in data.assignees\n assigneesOption.values?.sort((a, b) => {\n const aCount = data.assignees?.filter((assignee) => assignee === a.id).length || 0\n const bCount = data.assignees?.filter((assignee) => assignee === b.id).length || 0\n return bCount - aCount\n })\n\n options.push(assigneesOption)\n }\n }\n\n if (scopeFilterTypes.includes('author')) {\n const authorOption = getOptionRoot('author', config, scopePrefix, scopeLabel)\n if (authorOption) {\n // add every user for the projects (skip duplicates)\n projectUsers.forEach((user) => {\n if (!authorOption.values?.some((value) => value.id === user.name)) {\n authorOption.values?.push({\n id: user.name,\n label: user.attrib.fullName || user.name,\n img: `/api/users/${user.name}/avatar`,\n icon: null,\n })\n }\n })\n options.push(authorOption)\n }\n }\n\n // TAGS\n // add tags options\n if (scopeFilterTypes.includes('tags')) {\n const tagsOption = getOptionRoot('tags', config, scopePrefix, scopeLabel)\n\n if (tagsOption) {\n // reduce projectsInfo to get all tags\n const tagsAnatomy = new Map<string, Tag>()\n Object.values(projectsInfo).forEach((project) => {\n if (project?.tags) {\n project.tags.forEach((tag) => {\n if (!tagsAnatomy.has(tag.name)) {\n tagsAnatomy.set(tag.name, tag)\n }\n })\n }\n })\n\n // create options for each tag, finding color if in tagsAnatomy\n const tagOptionValuesMap = new Map<string, Option & { count: number }>()\n data.tags?.forEach((tag) => {\n const existingTag = tagOptionValuesMap.get(tag)\n if (existingTag) {\n // increment count\n existingTag.count++\n return\n } else {\n // create new tag\n const tagData = tagsAnatomy.get(tag)\n\n tagOptionValuesMap.set(tag, {\n id: tag,\n type: 'string',\n label: tag,\n values: [],\n color: tagData?.color || null,\n count: 1,\n })\n }\n })\n\n // convert values map to array and sort based on count\n const tagOptionValues = Array.from(tagOptionValuesMap.values()).sort(\n (a, b) => b.count - a.count,\n )\n\n // add tag options to the tagsOption\n tagsOption.values?.push(...tagOptionValues)\n\n options.push(tagsOption)\n }\n }\n\n // VERSION\n // add version options\n if (scopeFilterTypes.includes('version')) {\n const versionOption = getOptionRoot('version', config, scopePrefix, scopeLabel)\n\n if (versionOption) {\n // add featured version types as options\n FEATURED_VERSION_TYPES.forEach((versionType) => {\n versionOption.values?.push({\n id: versionType.value,\n label: versionType.label,\n icon: versionType.icon,\n })\n })\n\n options.push(versionOption)\n }\n }\n\n // HAS REVIEWABLES\n // add hasReviewables option\n if (scopeFilterTypes.includes('hasReviewables')) {\n const hasReviewablesOption = getOptionRoot('hasReviewables', config, scopePrefix, scopeLabel)\n\n if (hasReviewablesOption) {\n const options_list = [\n {\n id: 'true',\n label: 'Yes',\n values: [],\n icon: 'radio_button_checked',\n },\n {\n id: 'false',\n label: 'No',\n values: [],\n icon: 'radio_button_unchecked',\n },\n ]\n hasReviewablesOption.values?.push(...options_list)\n options.push(hasReviewablesOption)\n }\n }\n\n // ATTRIBUTES\n // dynamically add attributes options\n if (scopeFilterTypes.includes('attributes')) {\n const attributesByScope = attributes.filter((attribute) =>\n attribute.scope?.includes(currentScope),\n )\n // if attributesData is provided, filter out attributes that are not in the attributesData\n const attributesByValues = !isEmpty(data.attributes)\n ? attributesByScope.filter(\n (attribute) => data.attributes && data.attributes[attribute.name],\n )\n : attributesByScope\n\n const attributesWithoutDates = config?.enableRelativeValues\n ? attributesByValues\n : attributesByValues.filter((attribute) => attribute.data.type !== 'datetime')\n\n attributesWithoutDates.forEach((attribute) => {\n const realData = data.attributes && data.attributes[attribute.name]\n const enums = attribute.data.enum\n const type = attribute.data.type\n\n const isListOf = [\n 'list_of_strings',\n 'list_of_integers',\n 'list_of_any',\n 'list_of_submodels',\n ].includes(type || '')\n const isDate = type === 'datetime'\n const enableOperatorChange = isListOf ? config?.enableOperatorChange : false\n const enableRelativeValues = isListOf || isDate ? config?.enableRelativeValues : false\n // for the attribute, get the option root\n const option = getAttributeFieldOptionRoot(\n attribute,\n {\n ...config,\n allowsCustomValues: true,\n enableOperatorChange: enableOperatorChange,\n enableRelativeValues: enableRelativeValues,\n },\n scopePrefix,\n scopeLabel,\n )\n\n const suggestValuesForTypes: AttributeData['type'][] = [\n 'string',\n 'integer',\n 'float',\n 'list_of_strings',\n 'list_of_integers',\n ]\n\n const optionValues: Option[] = []\n\n // if the attribute type is in the suggestValuesForTypes, get the options based on real values\n if (suggestValuesForTypes.includes(type)) {\n const options = getAttributeOptions(realData, enums, type)\n optionValues.push(...options)\n }\n\n // if the attribute type is boolean, add yes/no options\n if (type === 'boolean') {\n const options = [\n {\n id: 'true',\n label: 'Yes',\n values: [],\n icon: 'radio_button_checked',\n },\n {\n id: 'false',\n label: 'No',\n values: [],\n icon: 'radio_button_unchecked',\n },\n ]\n optionValues.push(...options)\n }\n\n // if the attribute type is datetime, add datetime options\n\n if (isDate) {\n optionValues.push(\n ...dateOptions.map((o) => ({\n ...o,\n contentAfter: power ? undefined : <Icon icon=\"bolt\" />,\n })),\n )\n }\n\n // add option to the list of options\n option.values?.push(...optionValues)\n\n // add option to the list of options\n options.push(option)\n })\n }\n }) // End of scopes.forEach loop\n\n // order options by columnOrder\n if (columnOrder) {\n return sortOptionsBasedOnColumns(options, columnOrder)\n } else return options\n}\n\n// HELPER FUNCTIONS\n//\n//\n//\n//\nconst getSubTypes = (\n {\n projectsInfo,\n productTypes,\n }: { projectsInfo: GetProjectsInfoResponse; productTypes: EntityGroup[] },\n type: ScopeType,\n): Option[] => {\n const options: Option[] = []\n if (type === 'product') {\n productTypes.forEach(({ icon, label, value }) => {\n options.push({\n id: value,\n type: 'string',\n label: label || value,\n icon: icon || getEntityTypeIcon('product'),\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n })\n } else if (type === 'task') {\n Object.values(projectsInfo).forEach((project) => {\n // for each project, get all task types and add them to the options (if they don't already exist)\n const taskTypes = project?.taskTypes || []\n taskTypes.forEach((taskType: TaskType) => {\n if (!options.some((option) => option.id === taskType.name)) {\n options.push({\n id: taskType.name,\n type: 'string',\n label: taskType.name,\n icon: taskType.icon,\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n }\n })\n })\n } else if (type === 'folder') {\n Object.values(projectsInfo).forEach((project) => {\n // for each project, get all folder types and add them to the options (if they don't already exist)\n const folderTypes = project?.folderTypes || []\n folderTypes.forEach((folderType: FolderType) => {\n if (!options.some((option) => option.id === folderType.name)) {\n options.push({\n id: folderType.name,\n type: 'string',\n label: folderType.name,\n icon: folderType.icon,\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n }\n })\n })\n }\n\n return options\n}\n\nconst getFormattedId = (\n base: string,\n fieldType: FilterFieldType,\n config?: FilterConfig,\n scopePrefix?: string,\n) => {\n const { prefixes, keys } = config || {}\n let result = base\n\n if (keys && fieldType in keys) {\n result = `${keys[fieldType]}`\n } else if (prefixes && fieldType in prefixes) {\n result = `${prefixes[fieldType]}${base}`\n }\n\n // Add scope prefix if provided\n if (scopePrefix) {\n result = `${scopePrefix}_${result}`\n }\n\n return result\n}\n\nconst formatLabel = (baseLabel: string, scopeLabel?: string) =>\n scopeLabel ? `${baseLabel} - ${scopeLabel}` : baseLabel\n\nconst getOptionRoot = (\n fieldType: FilterFieldType,\n config?: FilterConfig,\n scopePrefix?: string,\n scopeLabel?: string,\n) => {\n const getRootIdWithPrefix = (base: string) => getFormattedId(base, fieldType, config, scopePrefix)\n const formatLabelWithScope = (baseLabel: string) => formatLabel(baseLabel, scopeLabel)\n\n let rootOption: Option | null = null\n switch (fieldType) {\n case 'taskType':\n rootOption = {\n id: getRootIdWithPrefix(`taskType`),\n type: 'string',\n label: formatLabelWithScope(`Task Type`),\n icon: getAttributeIcon('task'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'folderType':\n rootOption = {\n id: getRootIdWithPrefix(`folderType`),\n type: 'string',\n label: formatLabelWithScope(`Folder Type`),\n icon: getAttributeIcon('folder'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'productType':\n rootOption = {\n id: getRootIdWithPrefix(`productType`),\n type: 'string',\n label: formatLabelWithScope(`Product Type`),\n icon: getAttributeIcon('product'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'productName':\n rootOption = {\n id: getRootIdWithPrefix(`productNames`),\n type: 'string',\n label: formatLabelWithScope(`Product Name`),\n icon: getAttributeIcon('productName', 'string'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: false,\n operatorChangeable: true,\n }\n break\n case 'status':\n rootOption = {\n id: getRootIdWithPrefix('status'),\n type: 'string',\n label: formatLabelWithScope('Status'),\n icon: getAttributeIcon('status'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'assignees':\n rootOption = {\n id: getRootIdWithPrefix('assignees'),\n type: 'list_of_strings',\n label: formatLabelWithScope('Assignee'),\n icon: getAttributeIcon('assignees'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'author':\n rootOption = {\n id: getRootIdWithPrefix('author'),\n type: 'string',\n label: formatLabelWithScope('Author'),\n icon: getAttributeIcon('author'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'tags':\n rootOption = {\n id: getRootIdWithPrefix('tags'),\n type: 'list_of_strings',\n label: formatLabelWithScope('Tags'),\n icon: getAttributeIcon('tags'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'version':\n rootOption = {\n id: getRootIdWithPrefix('version'),\n type: 'string',\n label: formatLabelWithScope('Version'),\n icon: getAttributeIcon('version'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: false,\n operatorChangeable: false,\n }\n break\n case 'hasReviewables':\n rootOption = {\n id: getRootIdWithPrefix('hasReviewables'),\n type: 'boolean',\n label: formatLabelWithScope('Has Reviewables'),\n icon: 'play_circle',\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n singleSelect: true,\n }\n break\n default:\n break\n\n // Note: attributes are handled separately\n }\n\n return rootOption\n}\n\nconst getAttributeFieldOptionRoot = (\n attribute: AttributeModel,\n config: FilterConfig & { allowsCustomValues: boolean },\n scopePrefix?: string,\n scopeLabel?: string,\n): Option => ({\n id: getFormattedId(attribute.name, 'attributes', config, scopePrefix),\n type: attribute.data.type,\n label: scopeLabel\n ? formatLabel(attribute.data.title || attribute.name, scopeLabel)\n : attribute.data.title || attribute.name,\n operator: 'OR',\n inverted: false,\n values: [],\n allowsCustomValues: config?.allowsCustomValues,\n allowHasValue: config.enableRelativeValues,\n allowNoValue: config.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n icon: getAttributeIcon(attribute.name, attribute.data.type, !!attribute.data.enum?.length),\n singleSelect: ['boolean', 'datetime'].includes(attribute.data.type || ''),\n})\n\nconst getAttributeOptions = (\n values?: AttributeDataValue[],\n enums?: AttributeEnumItem[],\n type?: AttributeData['type'],\n): Option[] => {\n const enumOptions: Option[] = []\n const options: (Option & { count: number })[] = []\n\n // add the enum values first\n if (enums) {\n enums.forEach((enumItem) => {\n enumOptions.push({\n id: enumItem.value.toString(),\n type: type,\n label: enumItem.label,\n values: [],\n icon: enumItem.icon,\n color: enumItem.color,\n })\n })\n }\n\n values?.forEach((value) => {\n // no value? do nothing\n if (!value) return\n\n let text = ''\n\n // convert value to text\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n text = value.toString()\n break\n case 'object':\n if (Array.isArray(value)) {\n text = value.join(', ')\n } else {\n text = JSON.stringify(value)\n }\n break\n default:\n break\n }\n\n // create id for text value\n const id = text\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, '-')\n\n // check if the option already exists in enums\n const existingOption = enumOptions?.find((enumItem) => enumItem.id === id)\n if (existingOption) return\n\n // check if options already has the value, if so, increment the count\n const existingValue = options.find((option) => option.id === id)\n if (existingValue) {\n existingValue.count++\n return\n } else {\n // add option\n options.push({\n id,\n type: type,\n label: text,\n values: [],\n count: 1,\n })\n }\n })\n\n // sort options based on count\n options.sort((a, b) => b.count - a.count)\n\n // enum options first, then the rest\n return [...enumOptions, ...options]\n}\n\nconst sortOptionsBasedOnColumns = (options: Option[], columnOrder: ColumnOrderState) => {\n const columnOrderWithSubTypes = columnOrder.flatMap((col) => {\n if (col === 'subType') {\n return ['taskType', 'folderType']\n }\n return col\n })\n return [...options].sort((a, b) => {\n const aIndex = columnOrderWithSubTypes.indexOf(a.id.replace('.', '_'))\n const bIndex = columnOrderWithSubTypes.indexOf(b.id.replace('.', '_'))\n\n // If both options are in columnOrder, sort them based on their index in columnOrder\n if (aIndex !== -1 && bIndex !== -1) {\n return aIndex - bIndex\n }\n\n // If only one of the options is in columnOrder, sort the one in columnOrder first\n if (aIndex !== -1) {\n return -1\n }\n if (bIndex !== -1) {\n return 1\n }\n\n // If neither option is in columnOrder, keep their original order\n return 0\n })\n}\n\n/**\n * Splits combined filters by their scope and removes the scope prefix from filter IDs.\n * Used to separate multi-scope filters back into individual scope filters.\n *\n * @param combinedFilter - The filter with potentially scope-prefixed IDs\n * @param scopes - Array of scopes to split by\n * @param config - Filter config containing prefixes for field types\n * @param filterIdToScopeMap - Optional mapping of filter IDs (without scope prefix) to their scopes (e.g., { taskType: 'task', folderType: 'folder' })\n * @returns Object with scope-keyed filters (including 'unscoped' for filters that don't match any scope), with prefixes removed from IDs\n *\n * @example\n * // Input: combinedFilter with IDs like \"version_status\", \"folder_status\", \"taskType\"\n * // With filterIdToScopeMap: { taskType: 'task' }\n * // Output: { version: { conditions: [...] }, folder: { conditions: [...] }, task: { conditions: [...] }, unscoped: { conditions: [] } }\n */\nexport const splitFiltersByScope = (\n combinedFilter: Record<string, any> | null,\n scopes: ScopeType[],\n config?: FilterConfig,\n filterIdToScopeMap?: Record<string, ScopeType>,\n): Record<ScopeType | 'unscoped', Record<string, any>> => {\n // Initialize with all scopes having empty conditions, plus unscoped\n const result: Record<ScopeType | 'unscoped', Record<string, any>> = {\n folder: { conditions: [] },\n product: { conditions: [] },\n task: { conditions: [] },\n user: { conditions: [] },\n version: { conditions: [] },\n unscoped: { conditions: [] },\n }\n\n if (!combinedFilter?.conditions || combinedFilter?.conditions.length === 0) {\n return result\n }\n\n // Helper to extract scope prefix from an ID\n const extractScopeAndRemovePrefix = (\n id: string,\n currentConfig?: FilterConfig,\n ): { scope: ScopeType | null; cleanId: string } => {\n // Check if ID starts with any scope prefix\n const scopeMatch = scopes.find((scope) => id.startsWith(`${scope}_`))\n\n if (scopeMatch) {\n // Remove scope prefix\n const cleanId = id.substring(`${scopeMatch}_`.length)\n return { scope: scopeMatch, cleanId }\n }\n\n // If no scope prefix, return null scope (shouldn't happen in multi-scope scenario)\n return { scope: null, cleanId: id }\n }\n\n // Helper to process a filter recursively\n const processConditions = (\n conditions: any[] | undefined,\n targetFilters: Record<ScopeType | 'unscoped', Record<string, any>>,\n ) => {\n if (!conditions || conditions.length === 0) return\n\n conditions.forEach((condition) => {\n // If this is a nested filter\n if ('conditions' in condition && !('key' in condition)) {\n processConditions(condition.conditions, targetFilters)\n } else if ('key' in condition) {\n // This is a QueryCondition\n const { scope, cleanId } = extractScopeAndRemovePrefix(condition.key, config)\n\n if (scope && targetFilters[scope]) {\n // Add the condition with cleaned ID to the appropriate scope\n targetFilters[scope].conditions?.push({\n ...condition,\n key: cleanId,\n })\n } else if (!scope) {\n // No explicit scope prefix found, check filterIdToScopeMap\n const mappedScope = filterIdToScopeMap?.[condition.key]\n\n if (mappedScope && targetFilters[mappedScope]) {\n // Found in the map, add to mapped scope\n targetFilters[mappedScope].conditions?.push(condition)\n } else {\n // Not in map, add to unscoped\n targetFilters['unscoped']?.conditions?.push(condition)\n }\n }\n }\n })\n }\n\n // Process the combined filter\n processConditions(combinedFilter.conditions, result)\n\n return result\n}\n\n/**\n * Splits combined Filter objects by their scope and removes the scope prefix from filter IDs.\n * Used to separate multi-scope Filter arrays back into individual scope Filter arrays.\n * This function works with Filter objects from @ynput/ayon-react-components, not QueryFilter objects.\n *\n * @param filters - Array of Filter objects with potentially scope-prefixed IDs\n * @param scopes - Array of scopes to split by\n * @param filterIdToScopeMap - Optional mapping of filter IDs (without scope prefix) to their scopes (e.g., { taskType: 'task', folderType: 'folder' })\n * @returns Object with scope-keyed Filter arrays (including 'unscoped' for filters that don't match any scope)\n *\n * @example\n * // Input: filters with IDs like \"version_status\", \"folder_status\", \"taskType\"\n * // With filterIdToScopeMap: { taskType: 'task' }\n * // Output: { version: [...], folder: [...], task: [...], product: [...], user: [...], unscoped: [...] }\n */\nexport const splitClientFiltersByScope = (\n filters: (Filter | SliceFilter)[] | null | undefined,\n scopes: ScopeType[],\n filterIdToScopeMap?: Record<string, ScopeType>,\n): Record<ScopeType | 'unscoped', Filter[]> => {\n // Initialize with all scopes having empty arrays, plus unscoped\n const result: Record<ScopeType | 'unscoped', Filter[]> = {\n folder: [],\n product: [],\n task: [],\n user: [],\n version: [],\n unscoped: [],\n }\n\n if (!filters || filters.length === 0) {\n return result\n }\n\n // Helper to extract scope prefix from a filter ID\n const extractScopeFromId = (id: string): ScopeType | null => {\n // Check if ID starts with any scope prefix\n const scopeMatch = scopes.find((scope) => id.startsWith(`${scope}_`))\n return scopeMatch || null\n }\n\n // Helper to remove scope prefix from ID\n const removeScopePrefix = (id: string, scope: ScopeType): string => {\n const prefix = `${scope}_`\n return id.startsWith(prefix) ? id.substring(prefix.length) : id\n }\n\n // Process each filter\n filters.forEach((filter) => {\n if (!filter.id) return\n\n const scope = extractScopeFromId(filter.id)\n\n // If a scope was found, create a new filter without the scope prefix\n if (scope) {\n const cleanedFilter: Filter = {\n ...filter,\n id: removeScopePrefix(filter.id, scope),\n }\n result[scope].push(cleanedFilter)\n } else {\n // No explicit scope prefix found, check filterIdToScopeMap\n const mappedScope = filterIdToScopeMap?.[filter.id]\n\n if (mappedScope) {\n // Found in the map, add to mapped scope\n result[mappedScope].push(filter)\n } else {\n // Not in map, add to unscoped\n result['unscoped'].push(filter)\n }\n }\n })\n\n return result\n}\n"],"names":["useBuildFilterOptions","globalFilterTypes","projectNames","scope","customScopes","data","config","columnOrder","power","options","scopesWithTypes","s","isMultiScope","anyNeedsEntitySubType","type","anyNeedsUsers","fieldInScopes","field","productTypes","useGetEntityGroupsQuery","projectsInfo","useGetProjectsInfoQuery","projectUsers","useGetKanbanProjectUsersQuery","attributes","useGlobalContext","getScopeLabel","currentScope","scopeFilterTypes","scopePrefix","scopeLabel","entitySubTypeOption","getOptionRoot","subTypes","getSubTypes","_a","_b","_c","productNameOption","_d","name","value","statusOption","project","status","assigneesOption","user","_e","a","b","aCount","assignee","authorOption","tagsOption","tagsAnatomy","tag","tagOptionValuesMap","_f","existingTag","tagData","tagOptionValues","_g","versionOption","FEATURED_VERSION_TYPES","versionType","hasReviewablesOption","options_list","_h","attributesByScope","attribute","attributesByValues","isEmpty","realData","enums","isListOf","isDate","enableOperatorChange","enableRelativeValues","option","getAttributeFieldOptionRoot","suggestValuesForTypes","optionValues","getAttributeOptions","dateOptions","o","jsx","Icon","sortOptionsBasedOnColumns","icon","label","getEntityTypeIcon","taskType","folderType","getFormattedId","base","fieldType","prefixes","keys","result","formatLabel","baseLabel","getRootIdWithPrefix","formatLabelWithScope","rootOption","getAttributeIcon","values","enumOptions","enumItem","text","id","existingValue","columnOrderWithSubTypes","col","aIndex","bIndex","splitFiltersByScope","combinedFilter","scopes","filterIdToScopeMap","extractScopeAndRemovePrefix","currentConfig","scopeMatch","cleanId","processConditions","conditions","targetFilters","condition","mappedScope","splitClientFiltersByScope","filters","extractScopeFromId","removeScopePrefix","prefix","filter","cleanedFilter"],"mappings":"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"}
1
+ {"version":3,"file":"useBuildFilterOptions.cjs.js","sources":["../../../../../src/components/SearchFilter/useBuildFilterOptions.tsx"],"sourcesContent":["import { getAttributeIcon, getEntityTypeIcon } from '@shared/util'\nimport {\n ProductType,\n useGetEntityGroupsQuery,\n useGetKanbanProjectUsersQuery,\n useGetProjectsInfoQuery,\n} from '@shared/api'\nimport type {\n GetProjectsInfoResponse,\n FolderType,\n Status,\n Tag,\n TaskType,\n AttributeModel,\n AttributeEnumItem,\n AttributeData,\n EntityGroup,\n} from '@shared/api'\nimport { ColumnOrderState } from '@tanstack/react-table'\nimport { Icon, Option, Filter } from '@ynput/ayon-react-components'\nimport { dateOptions } from './filterDates'\nimport { isEmpty } from 'lodash'\nimport { SliceFilter } from '@shared/containers'\nimport { FEATURED_VERSION_TYPES } from '../FeaturedVersionOrder'\nimport { useGlobalContext } from '@shared/context'\n\ntype ScopeType = 'folder' | 'product' | 'task' | 'user' | 'version'\ntype Scope = ScopeType | ScopeType[]\n\nexport type ScopeWithFilterTypes = {\n scope: ScopeType\n filterTypes: FilterFieldType[]\n}\n\nexport type FilterFieldType =\n | 'folderType'\n | 'taskType'\n | 'productType'\n | ('users' | 'assignees' | 'author')\n | 'attributes'\n | 'status'\n | 'tags'\n | 'version'\n | 'hasReviewables'\n | 'productName'\ntype AttributeType =\n | string\n | number\n | boolean\n | Date\n | string[]\n | number[]\n | any[]\n | { [key: string]: any }\n\ntype AttributeDataValue = AttributeType | null | undefined\n\ntype FilterConfig = {\n enableExcludes?: boolean\n enableOperatorChange?: boolean\n enableRelativeValues?: boolean\n prefixes?: Partial<Record<FilterFieldType, string>> // strings that will be prepended to the id of the option\n keys?: Partial<Record<FilterFieldType, string>> // replaces the default keys for the filter\n}\n\nexport type BuildFilterOptions = {\n filterTypes?: FilterFieldType[]\n projectNames: string[]\n scope?: Scope\n scopes?: ScopeWithFilterTypes[]\n data: {\n tags?: string[]\n attributes?: Record<string, AttributeDataValue[]>\n assignees?: string[]\n productTypes?: ProductType[]\n productNames?: string[]\n }\n columnOrder?: ColumnOrderState\n config?: FilterConfig\n power?: boolean\n}\n\nexport const useBuildFilterOptions = ({\n filterTypes: globalFilterTypes = [],\n projectNames,\n scope,\n scopes: customScopes,\n data,\n config,\n columnOrder = [],\n power,\n}: BuildFilterOptions): Option[] => {\n let options: Option[] = []\n\n // Determine which scopes to use\n // If customScopes is provided, use it; otherwise, fall back to the old method\n const scopesWithTypes: Array<{ scope: ScopeType; filterTypes: FilterFieldType[] }> = customScopes\n ? customScopes\n : (() => {\n // Fallback to old method: normalize scope to array and use globalFilterTypes for all\n const normalizedScopes = scope ? (Array.isArray(scope) ? scope : [scope]) : []\n return normalizedScopes.map((s) => ({\n scope: s,\n filterTypes: globalFilterTypes,\n }))\n })()\n\n const isMultiScope = scopesWithTypes.length > 1\n\n // QUERIES\n //\n //\n // Check if any scope needs these filter types\n const anyNeedsEntitySubType = scopesWithTypes.some((s) =>\n ['entitySubType', 'status'].some((type) => s.filterTypes.includes(type as FilterFieldType)),\n )\n const anyNeedsUsers = scopesWithTypes.some((s) =>\n ['assignees', 'users', 'author'].some((type) =>\n s.filterTypes.includes(type as FilterFieldType),\n ),\n )\n // find if any search field is in any of the scopesWithTypes\n const fieldInScopes = (field: FilterFieldType): boolean => {\n return scopesWithTypes.some((s) => s.filterTypes.includes(field))\n }\n\n // get grouping options for productTypes\n // NOTE: We should revisit this to be used for all attribs and fields\n const { data: { groups: productTypes = [] } = {} } = useGetEntityGroupsQuery(\n {\n entityType: 'product',\n groupingKey: 'productType',\n projectName: projectNames[0],\n empty: true,\n },\n { skip: !projectNames?.length || !fieldInScopes('productType') },\n )\n\n const { data: projectsInfo = {} } = useGetProjectsInfoQuery(\n {\n projects: projectNames,\n },\n {\n skip: !projectNames?.length || !anyNeedsEntitySubType,\n },\n )\n\n const { data: projectUsers = [] } = useGetKanbanProjectUsersQuery(\n { projects: projectNames },\n {\n skip: !projectNames?.length || !anyNeedsUsers,\n },\n )\n\n const { attributes } = useGlobalContext()\n //\n //\n // QUERIES\n\n // ADD OPTIONS\n\n // Helper to get scope label (capitalize first letter)\n const getScopeLabel = (scope: ScopeType) => scope.charAt(0).toUpperCase() + scope.slice(1)\n\n // Loop through each scope to build options\n scopesWithTypes.forEach(({ scope: currentScope, filterTypes: scopeFilterTypes }) => {\n const scopePrefix = isMultiScope ? currentScope : undefined\n const scopeLabel = isMultiScope ? getScopeLabel(currentScope) : undefined\n\n // TASK TYPE\n // add taskType option\n if (scopeFilterTypes.includes('taskType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'taskType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'task')\n\n entitySubTypeOption.values?.push(...subTypes)\n\n options.push(entitySubTypeOption)\n }\n }\n\n // FOLDER TYPE\n // add folderType option\n if (scopeFilterTypes.includes('folderType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'folderType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'folder')\n\n entitySubTypeOption.values?.push(...subTypes)\n\n options.push(entitySubTypeOption)\n }\n }\n\n // PRODUCT TYPE\n // add productType option\n if (scopeFilterTypes.includes('productType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'productType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'product')\n entitySubTypeOption.values?.push(...subTypes)\n options.push(entitySubTypeOption)\n }\n }\n // PRODUCT NAME\n // add product name option\n if (scopeFilterTypes.includes('productName') && currentScope === 'product') {\n const productNameOption = getOptionRoot('productName', config, scopePrefix, scopeLabel)\n\n if (productNameOption) {\n // Populate with product names from data as suggestions (optional since allowsCustomValues: true)\n data.productNames?.forEach((name) => {\n if (!productNameOption.values?.some((value) => value.id === name)) {\n productNameOption.values?.push({\n id: name,\n label: name,\n })\n }\n })\n\n options.push(productNameOption)\n }\n }\n\n // STATUS\n // add status option\n if (scopeFilterTypes.includes('status')) {\n const statusOption = getOptionRoot(\n 'status',\n { ...config, enableOperatorChange: false },\n scopePrefix,\n scopeLabel,\n )\n\n if (statusOption) {\n Object.values(projectsInfo).forEach((project) => {\n const statuses = project?.statuses || []\n statuses\n .filter((status) => status.scope?.includes(currentScope))\n .forEach((status: Status) => {\n if (!statusOption.values?.some((value) => value.id === status.name)) {\n statusOption.values?.push({\n id: status.name,\n label: status.name,\n icon: status.icon,\n color: status.color,\n })\n }\n })\n })\n\n options.push(statusOption)\n }\n }\n\n // ASSIGNEES\n // add users/assignees option\n if (scopeFilterTypes.includes('assignees')) {\n const assigneesOption = getOptionRoot('assignees', config, scopePrefix, scopeLabel)\n\n if (assigneesOption) {\n // add every user for the projects (skip duplicates)\n projectUsers.forEach((user) => {\n if (!assigneesOption.values?.some((value) => value.id === user.name)) {\n assigneesOption.values?.push({\n id: user.name,\n label: user.attrib.fullName || user.name,\n img: `/api/users/${user.name}/avatar`,\n icon: null,\n })\n }\n })\n\n // sort the assignees based on the number of times they appear in data.assignees\n assigneesOption.values?.sort((a, b) => {\n const aCount = data.assignees?.filter((assignee) => assignee === a.id).length || 0\n const bCount = data.assignees?.filter((assignee) => assignee === b.id).length || 0\n return bCount - aCount\n })\n\n options.push(assigneesOption)\n }\n }\n\n if (scopeFilterTypes.includes('author')) {\n const authorOption = getOptionRoot('author', config, scopePrefix, scopeLabel)\n if (authorOption) {\n // add every user for the projects (skip duplicates)\n projectUsers.forEach((user) => {\n if (!authorOption.values?.some((value) => value.id === user.name)) {\n authorOption.values?.push({\n id: user.name,\n label: user.attrib.fullName || user.name,\n img: `/api/users/${user.name}/avatar`,\n icon: null,\n })\n }\n })\n options.push(authorOption)\n }\n }\n\n // TAGS\n // add tags options\n if (scopeFilterTypes.includes('tags')) {\n const tagsOption = getOptionRoot('tags', config, scopePrefix, scopeLabel)\n\n if (tagsOption) {\n // reduce projectsInfo to get all tags\n const tagsAnatomy = new Map<string, Tag>()\n Object.values(projectsInfo).forEach((project) => {\n if (project?.tags) {\n project.tags.forEach((tag) => {\n if (!tagsAnatomy.has(tag.name)) {\n tagsAnatomy.set(tag.name, tag)\n }\n })\n }\n })\n\n // create options for each tag, finding color if in tagsAnatomy\n const tagOptionValuesMap = new Map<string, Option & { count: number }>()\n data.tags?.forEach((tag) => {\n const existingTag = tagOptionValuesMap.get(tag)\n if (existingTag) {\n // increment count\n existingTag.count++\n return\n } else {\n // create new tag\n const tagData = tagsAnatomy.get(tag)\n\n tagOptionValuesMap.set(tag, {\n id: tag,\n type: 'string',\n label: tag,\n values: [],\n color: tagData?.color || null,\n count: 1,\n })\n }\n })\n\n // convert values map to array and sort based on count\n const tagOptionValues = Array.from(tagOptionValuesMap.values()).sort(\n (a, b) => b.count - a.count,\n )\n\n // add tag options to the tagsOption\n tagsOption.values?.push(...tagOptionValues)\n\n options.push(tagsOption)\n }\n }\n\n // VERSION\n // add version options\n if (scopeFilterTypes.includes('version')) {\n const versionOption = getOptionRoot('version', config, scopePrefix, scopeLabel)\n\n if (versionOption) {\n // add featured version types as options\n FEATURED_VERSION_TYPES.forEach((versionType) => {\n versionOption.values?.push({\n id: versionType.value,\n label: versionType.label,\n icon: versionType.icon,\n })\n })\n\n options.push(versionOption)\n }\n }\n\n // HAS REVIEWABLES\n // add hasReviewables option\n if (scopeFilterTypes.includes('hasReviewables')) {\n const hasReviewablesOption = getOptionRoot('hasReviewables', config, scopePrefix, scopeLabel)\n\n if (hasReviewablesOption) {\n const options_list = [\n {\n id: 'true',\n label: 'Yes',\n values: [],\n icon: 'radio_button_checked',\n },\n {\n id: 'false',\n label: 'No',\n values: [],\n icon: 'radio_button_unchecked',\n },\n ]\n hasReviewablesOption.values?.push(...options_list)\n options.push(hasReviewablesOption)\n }\n }\n\n // ATTRIBUTES\n // dynamically add attributes options\n if (scopeFilterTypes.includes('attributes')) {\n const attributesByScope = attributes.filter((attribute) =>\n attribute.scope?.includes(currentScope),\n )\n // if attributesData is provided, filter out attributes that are not in the attributesData\n const attributesByValues = !isEmpty(data.attributes)\n ? attributesByScope.filter(\n (attribute) => data.attributes && data.attributes[attribute.name],\n )\n : attributesByScope\n\n const attributesWithoutDates = config?.enableRelativeValues\n ? attributesByValues\n : attributesByValues.filter((attribute) => attribute.data.type !== 'datetime')\n\n attributesWithoutDates.forEach((attribute) => {\n const realData = data.attributes && data.attributes[attribute.name]\n const enums = attribute.data.enum\n const type = attribute.data.type\n\n const isListOf = [\n 'list_of_strings',\n 'list_of_integers',\n 'list_of_any',\n 'list_of_submodels',\n ].includes(type || '')\n const isDate = type === 'datetime'\n const enableOperatorChange = isListOf ? config?.enableOperatorChange : false\n const enableRelativeValues = isListOf || isDate ? config?.enableRelativeValues : false\n // for the attribute, get the option root\n const option = getAttributeFieldOptionRoot(\n attribute,\n {\n ...config,\n allowsCustomValues: true,\n enableOperatorChange: enableOperatorChange,\n enableRelativeValues: enableRelativeValues,\n },\n scopePrefix,\n scopeLabel,\n )\n\n const suggestValuesForTypes: AttributeData['type'][] = [\n 'string',\n 'integer',\n 'float',\n 'list_of_strings',\n 'list_of_integers',\n ]\n\n const optionValues: Option[] = []\n\n // if the attribute type is in the suggestValuesForTypes, get the options based on real values\n if (suggestValuesForTypes.includes(type)) {\n const options = getAttributeOptions(realData, enums, type)\n optionValues.push(...options)\n }\n\n // if the attribute type is boolean, add yes/no options\n if (type === 'boolean') {\n const options = [\n {\n id: 'true',\n label: 'Yes',\n values: [],\n icon: 'radio_button_checked',\n },\n {\n id: 'false',\n label: 'No',\n values: [],\n icon: 'radio_button_unchecked',\n },\n ]\n optionValues.push(...options)\n }\n\n // if the attribute type is datetime, add datetime options\n\n if (isDate) {\n optionValues.push(\n ...dateOptions.map((o) => ({\n ...o,\n contentAfter: power ? undefined : <Icon icon=\"bolt\" />,\n })),\n )\n }\n\n // add option to the list of options\n option.values?.push(...optionValues)\n\n // add option to the list of options\n options.push(option)\n })\n }\n }) // End of scopes.forEach loop\n\n // order options by columnOrder\n if (columnOrder) {\n return sortOptionsBasedOnColumns(options, columnOrder)\n } else return options\n}\n\n// HELPER FUNCTIONS\n//\n//\n//\n//\nconst getSubTypes = (\n {\n projectsInfo,\n productTypes,\n }: { projectsInfo: GetProjectsInfoResponse; productTypes: EntityGroup[] },\n type: ScopeType,\n): Option[] => {\n const options: Option[] = []\n if (type === 'product') {\n productTypes.forEach(({ icon, label, value }) => {\n options.push({\n id: value,\n type: 'string',\n label: label || value,\n icon: icon || getEntityTypeIcon('product'),\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n })\n } else if (type === 'task') {\n Object.values(projectsInfo).forEach((project) => {\n // for each project, get all task types and add them to the options (if they don't already exist)\n const taskTypes = project?.taskTypes || []\n taskTypes.forEach((taskType: TaskType) => {\n if (!options.some((option) => option.id === taskType.name)) {\n options.push({\n id: taskType.name,\n type: 'string',\n label: taskType.name,\n icon: taskType.icon,\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n }\n })\n })\n } else if (type === 'folder') {\n Object.values(projectsInfo).forEach((project) => {\n // for each project, get all folder types and add them to the options (if they don't already exist)\n const folderTypes = project?.folderTypes || []\n folderTypes.forEach((folderType: FolderType) => {\n if (!options.some((option) => option.id === folderType.name)) {\n options.push({\n id: folderType.name,\n type: 'string',\n label: folderType.name,\n icon: folderType.icon,\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n }\n })\n })\n }\n\n return options\n}\n\nconst getFormattedId = (\n base: string,\n fieldType: FilterFieldType,\n config?: FilterConfig,\n scopePrefix?: string,\n) => {\n const { prefixes, keys } = config || {}\n let result = base\n\n if (keys && fieldType in keys) {\n result = `${keys[fieldType]}`\n } else if (prefixes && fieldType in prefixes) {\n result = `${prefixes[fieldType]}${base}`\n }\n\n // Add scope prefix if provided\n if (scopePrefix) {\n result = `${scopePrefix}_${result}`\n }\n\n return result\n}\n\nconst formatLabel = (baseLabel: string, scopeLabel?: string) =>\n scopeLabel ? `${baseLabel} - ${scopeLabel}` : baseLabel\n\nconst getOptionRoot = (\n fieldType: FilterFieldType,\n config?: FilterConfig,\n scopePrefix?: string,\n scopeLabel?: string,\n) => {\n const getRootIdWithPrefix = (base: string) => getFormattedId(base, fieldType, config, scopePrefix)\n const formatLabelWithScope = (baseLabel: string) => formatLabel(baseLabel, scopeLabel)\n\n let rootOption: Option | null = null\n switch (fieldType) {\n case 'taskType':\n rootOption = {\n id: getRootIdWithPrefix(`taskType`),\n type: 'string',\n label: formatLabelWithScope(`Task Type`),\n icon: getAttributeIcon('task'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'folderType':\n rootOption = {\n id: getRootIdWithPrefix(`folderType`),\n type: 'string',\n label: formatLabelWithScope(`Folder Type`),\n icon: getAttributeIcon('folder'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'productType':\n rootOption = {\n id: getRootIdWithPrefix(`productType`),\n type: 'string',\n label: formatLabelWithScope(`Product Type`),\n icon: getAttributeIcon('product'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'productName':\n rootOption = {\n id: getRootIdWithPrefix(`productNames`),\n type: 'string',\n label: formatLabelWithScope(`Product Name`),\n icon: getAttributeIcon('productName', 'string'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: false,\n operatorChangeable: true,\n }\n break\n case 'status':\n rootOption = {\n id: getRootIdWithPrefix('status'),\n type: 'string',\n label: formatLabelWithScope('Status'),\n icon: getAttributeIcon('status'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'assignees':\n rootOption = {\n id: getRootIdWithPrefix('assignees'),\n type: 'list_of_strings',\n label: formatLabelWithScope('Assignee'),\n icon: getAttributeIcon('assignees'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'author':\n rootOption = {\n id: getRootIdWithPrefix('author'),\n type: 'string',\n label: formatLabelWithScope('Author'),\n icon: getAttributeIcon('author'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'tags':\n rootOption = {\n id: getRootIdWithPrefix('tags'),\n type: 'list_of_strings',\n label: formatLabelWithScope('Tags'),\n icon: getAttributeIcon('tags'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'version':\n rootOption = {\n id: getRootIdWithPrefix('version'),\n type: 'string',\n label: formatLabelWithScope('Version'),\n icon: getAttributeIcon('version'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: false,\n operatorChangeable: false,\n }\n break\n case 'hasReviewables':\n rootOption = {\n id: getRootIdWithPrefix('hasReviewables'),\n type: 'boolean',\n label: formatLabelWithScope('Has Reviewables'),\n icon: 'play_circle',\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n singleSelect: true,\n }\n break\n default:\n break\n\n // Note: attributes are handled separately\n }\n\n return rootOption\n}\n\nconst getAttributeFieldOptionRoot = (\n attribute: AttributeModel,\n config: FilterConfig & { allowsCustomValues: boolean },\n scopePrefix?: string,\n scopeLabel?: string,\n): Option => ({\n id: getFormattedId(attribute.name, 'attributes', config, scopePrefix),\n type: attribute.data.type,\n label: scopeLabel\n ? formatLabel(attribute.data.title || attribute.name, scopeLabel)\n : attribute.data.title || attribute.name,\n operator: 'OR',\n inverted: false,\n values: [],\n allowsCustomValues: config?.allowsCustomValues,\n allowHasValue: config.enableRelativeValues,\n allowNoValue: config.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n icon: getAttributeIcon(attribute.name, attribute.data.type, !!attribute.data.enum?.length),\n singleSelect: ['boolean', 'datetime'].includes(attribute.data.type || ''),\n})\n\nconst getAttributeOptions = (\n values?: AttributeDataValue[],\n enums?: AttributeEnumItem[],\n type?: AttributeData['type'],\n): Option[] => {\n const enumOptions: Option[] = []\n const options: (Option & { count: number })[] = []\n\n // add the enum values first\n if (enums) {\n enums.forEach((enumItem) => {\n enumOptions.push({\n id: enumItem.value.toString(),\n type: type,\n label: enumItem.label,\n values: [],\n icon: enumItem.icon,\n color: enumItem.color,\n })\n })\n }\n\n values?.forEach((value) => {\n // no value? do nothing\n if (!value) return\n\n let text = ''\n\n // convert value to text\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n text = value.toString()\n break\n case 'object':\n if (Array.isArray(value)) {\n text = value.join(', ')\n } else {\n text = JSON.stringify(value)\n }\n break\n default:\n break\n }\n\n // create id for text value\n const id = text\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, '-')\n\n // check if the option already exists in enums\n const existingOption = enumOptions?.find((enumItem) => enumItem.id === id)\n if (existingOption) return\n\n // check if options already has the value, if so, increment the count\n const existingValue = options.find((option) => option.id === id)\n if (existingValue) {\n existingValue.count++\n return\n } else {\n // add option\n options.push({\n id,\n type: type,\n label: text,\n values: [],\n count: 1,\n })\n }\n })\n\n // sort options based on count\n options.sort((a, b) => b.count - a.count)\n\n // enum options first, then the rest\n return [...enumOptions, ...options]\n}\n\nconst sortOptionsBasedOnColumns = (options: Option[], columnOrder: ColumnOrderState) => {\n const columnOrderWithSubTypes = columnOrder.flatMap((col) => {\n if (col === 'subType') {\n return ['taskType', 'folderType']\n }\n return col\n })\n return [...options].sort((a, b) => {\n const aIndex = columnOrderWithSubTypes.indexOf(a.id.replace('.', '_'))\n const bIndex = columnOrderWithSubTypes.indexOf(b.id.replace('.', '_'))\n\n // If both options are in columnOrder, sort them based on their index in columnOrder\n if (aIndex !== -1 && bIndex !== -1) {\n return aIndex - bIndex\n }\n\n // If only one of the options is in columnOrder, sort the one in columnOrder first\n if (aIndex !== -1) {\n return -1\n }\n if (bIndex !== -1) {\n return 1\n }\n\n // If neither option is in columnOrder, keep their original order\n return 0\n })\n}\n\n/**\n * Splits combined filters by their scope and removes the scope prefix from filter IDs.\n * Used to separate multi-scope filters back into individual scope filters.\n *\n * @param combinedFilter - The filter with potentially scope-prefixed IDs\n * @param scopes - Array of scopes to split by\n * @param config - Filter config containing prefixes for field types\n * @param filterIdToScopeMap - Optional mapping of filter IDs (without scope prefix) to their scopes (e.g., { taskType: 'task', folderType: 'folder' })\n * @returns Object with scope-keyed filters (including 'unscoped' for filters that don't match any scope), with prefixes removed from IDs\n *\n * @example\n * // Input: combinedFilter with IDs like \"version_status\", \"folder_status\", \"taskType\"\n * // With filterIdToScopeMap: { taskType: 'task' }\n * // Output: { version: { conditions: [...] }, folder: { conditions: [...] }, task: { conditions: [...] }, unscoped: { conditions: [] } }\n */\nexport const splitFiltersByScope = (\n combinedFilter: Record<string, any> | null,\n scopes: ScopeType[],\n config?: FilterConfig,\n filterIdToScopeMap?: Record<string, ScopeType>,\n): Record<ScopeType | 'unscoped', Record<string, any>> => {\n // Initialize with all scopes having empty conditions, plus unscoped\n const result: Record<ScopeType | 'unscoped', Record<string, any>> = {\n folder: { conditions: [] },\n product: { conditions: [] },\n task: { conditions: [] },\n user: { conditions: [] },\n version: { conditions: [] },\n unscoped: { conditions: [] },\n }\n\n if (!combinedFilter?.conditions || combinedFilter?.conditions.length === 0) {\n return result\n }\n\n // Helper to extract scope prefix from an ID\n const extractScopeAndRemovePrefix = (\n id: string,\n currentConfig?: FilterConfig,\n ): { scope: ScopeType | null; cleanId: string } => {\n // Check if ID starts with any scope prefix\n const scopeMatch = scopes.find((scope) => id.startsWith(`${scope}_`))\n\n if (scopeMatch) {\n // Remove scope prefix\n const cleanId = id.substring(`${scopeMatch}_`.length)\n return { scope: scopeMatch, cleanId }\n }\n\n // If no scope prefix, return null scope (shouldn't happen in multi-scope scenario)\n return { scope: null, cleanId: id }\n }\n\n // Helper to process a filter recursively\n const processConditions = (\n conditions: any[] | undefined,\n targetFilters: Record<ScopeType | 'unscoped', Record<string, any>>,\n ) => {\n if (!conditions || conditions.length === 0) return\n\n conditions.forEach((condition) => {\n // If this is a nested filter\n if ('conditions' in condition && !('key' in condition)) {\n processConditions(condition.conditions, targetFilters)\n } else if ('key' in condition) {\n // This is a QueryCondition\n const { scope, cleanId } = extractScopeAndRemovePrefix(condition.key, config)\n\n if (scope && targetFilters[scope]) {\n // Add the condition with cleaned ID to the appropriate scope\n targetFilters[scope].conditions?.push({\n ...condition,\n key: cleanId,\n })\n } else if (!scope) {\n // No explicit scope prefix found, check filterIdToScopeMap\n const mappedScope = filterIdToScopeMap?.[condition.key]\n\n if (mappedScope && targetFilters[mappedScope]) {\n // Found in the map, add to mapped scope\n targetFilters[mappedScope].conditions?.push(condition)\n } else {\n // Not in map, add to unscoped\n targetFilters['unscoped']?.conditions?.push(condition)\n }\n }\n }\n })\n }\n\n // Process the combined filter\n processConditions(combinedFilter.conditions, result)\n\n return result\n}\n\n/**\n * Splits combined Filter objects by their scope and removes the scope prefix from filter IDs.\n * Used to separate multi-scope Filter arrays back into individual scope Filter arrays.\n * This function works with Filter objects from @ynput/ayon-react-components, not QueryFilter objects.\n *\n * @param filters - Array of Filter objects with potentially scope-prefixed IDs\n * @param scopes - Array of scopes to split by\n * @param filterIdToScopeMap - Optional mapping of filter IDs (without scope prefix) to their scopes (e.g., { taskType: 'task', folderType: 'folder' })\n * @returns Object with scope-keyed Filter arrays (including 'unscoped' for filters that don't match any scope)\n *\n * @example\n * // Input: filters with IDs like \"version_status\", \"folder_status\", \"taskType\"\n * // With filterIdToScopeMap: { taskType: 'task' }\n * // Output: { version: [...], folder: [...], task: [...], product: [...], user: [...], unscoped: [...] }\n */\nexport const splitClientFiltersByScope = (\n filters: (Filter | SliceFilter)[] | null | undefined,\n scopes: ScopeType[],\n filterIdToScopeMap?: Record<string, ScopeType>,\n): Record<ScopeType | 'unscoped', Filter[]> => {\n // Initialize with all scopes having empty arrays, plus unscoped\n const result: Record<ScopeType | 'unscoped', Filter[]> = {\n folder: [],\n product: [],\n task: [],\n user: [],\n version: [],\n unscoped: [],\n }\n\n if (!filters || filters.length === 0) {\n return result\n }\n\n // Helper to extract scope prefix from a filter ID\n const extractScopeFromId = (id: string): ScopeType | null => {\n // Check if ID starts with any scope prefix\n const scopeMatch = scopes.find((scope) => id.startsWith(`${scope}_`))\n return scopeMatch || null\n }\n\n // Helper to remove scope prefix from ID\n const removeScopePrefix = (id: string, scope: ScopeType): string => {\n const prefix = `${scope}_`\n return id.startsWith(prefix) ? id.substring(prefix.length) : id\n }\n\n // Process each filter\n filters.forEach((filter) => {\n if (!filter.id) return\n\n const scope = extractScopeFromId(filter.id)\n\n // If a scope was found, create a new filter without the scope prefix\n if (scope) {\n const cleanedFilter: Filter = {\n ...filter,\n id: removeScopePrefix(filter.id, scope),\n }\n result[scope].push(cleanedFilter)\n } else {\n // No explicit scope prefix found, check filterIdToScopeMap\n const mappedScope = filterIdToScopeMap?.[filter.id]\n\n if (mappedScope) {\n // Found in the map, add to mapped scope\n result[mappedScope].push(filter)\n } else {\n // Not in map, add to unscoped\n result['unscoped'].push(filter)\n }\n }\n })\n\n return result\n}\n"],"names":["useBuildFilterOptions","globalFilterTypes","projectNames","scope","customScopes","data","config","columnOrder","power","options","scopesWithTypes","s","isMultiScope","anyNeedsEntitySubType","type","anyNeedsUsers","fieldInScopes","field","productTypes","useGetEntityGroupsQuery","projectsInfo","useGetProjectsInfoQuery","projectUsers","useGetKanbanProjectUsersQuery","attributes","useGlobalContext","getScopeLabel","currentScope","scopeFilterTypes","scopePrefix","scopeLabel","entitySubTypeOption","getOptionRoot","subTypes","getSubTypes","_a","_b","_c","productNameOption","_d","name","value","statusOption","project","status","assigneesOption","user","_e","a","b","aCount","assignee","authorOption","tagsOption","tagsAnatomy","tag","tagOptionValuesMap","_f","existingTag","tagData","tagOptionValues","_g","versionOption","FEATURED_VERSION_TYPES","versionType","hasReviewablesOption","options_list","_h","attributesByScope","attribute","attributesByValues","isEmpty","realData","enums","isListOf","isDate","enableOperatorChange","enableRelativeValues","option","getAttributeFieldOptionRoot","suggestValuesForTypes","optionValues","getAttributeOptions","dateOptions","o","jsx","Icon","sortOptionsBasedOnColumns","icon","label","getEntityTypeIcon","taskType","folderType","getFormattedId","base","fieldType","prefixes","keys","result","formatLabel","baseLabel","getRootIdWithPrefix","formatLabelWithScope","rootOption","getAttributeIcon","values","enumOptions","enumItem","text","id","existingValue","columnOrderWithSubTypes","col","aIndex","bIndex","splitFiltersByScope","combinedFilter","scopes","filterIdToScopeMap","extractScopeAndRemovePrefix","currentConfig","scopeMatch","cleanId","processConditions","conditions","targetFilters","condition","mappedScope","splitClientFiltersByScope","filters","extractScopeFromId","removeScopePrefix","prefix","filter","cleanedFilter"],"mappings":"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"}
@@ -55,6 +55,8 @@ import "../../api/queries/attributes/getAttributes.es.js";
55
55
  import "../../api/queries/attributes/updateAttributes.es.js";
56
56
  import "../../api/queries/authentication/getAuthentication.es.js";
57
57
  import "../../api/queries/cloud/cloud.es.js";
58
+ import "../../api/queries/config/getConfig.es.js";
59
+ import "../../api/queries/config/updateConfig.es.js";
58
60
  import "../../api/queries/entities/getEntity.es.js";
59
61
  import "../../api/queries/entities/getEntityPanel.es.js";
60
62
  import "../../api/queries/entities/updateEntity.es.js";
@@ -108,7 +110,7 @@ import { useGlobalContext as ue } from "../../context/GlobalContext.es.js";
108
110
  import "../../context/ProjectContext.es.js";
109
111
  import "../../context/ProjectFoldersContext.es.js";
110
112
  import "../../context/UriContext.es.js";
111
- const ht = ({
113
+ const ct = ({
112
114
  filterTypes: o = [],
113
115
  projectNames: e,
114
116
  scope: d,
@@ -657,7 +659,7 @@ const ht = ({
657
659
  const t = d.indexOf(u.id.replace(".", "_")), s = d.indexOf(a.id.replace(".", "_"));
658
660
  return t !== -1 && s !== -1 ? t - s : t !== -1 ? -1 : s !== -1 ? 1 : 0;
659
661
  });
660
- }, bt = (o, e, d, u) => {
662
+ }, yt = (o, e, d, u) => {
661
663
  const a = {
662
664
  folder: { conditions: [] },
663
665
  product: { conditions: [] },
@@ -695,7 +697,7 @@ const ht = ({
695
697
  });
696
698
  };
697
699
  return s(o.conditions, a), a;
698
- }, ct = (o, e, d) => {
700
+ }, vt = (o, e, d) => {
699
701
  const u = {
700
702
  folder: [],
701
703
  product: [],
@@ -726,8 +728,8 @@ const ht = ({
726
728
  }), u;
727
729
  };
728
730
  export {
729
- ct as splitClientFiltersByScope,
730
- bt as splitFiltersByScope,
731
- ht as useBuildFilterOptions
731
+ vt as splitClientFiltersByScope,
732
+ yt as splitFiltersByScope,
733
+ ct as useBuildFilterOptions
732
734
  };
733
735
  //# sourceMappingURL=useBuildFilterOptions.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildFilterOptions.es.js","sources":["../../../../../src/components/SearchFilter/useBuildFilterOptions.tsx"],"sourcesContent":["import { getAttributeIcon, getEntityTypeIcon } from '@shared/util'\nimport {\n ProductType,\n useGetEntityGroupsQuery,\n useGetKanbanProjectUsersQuery,\n useGetProjectsInfoQuery,\n} from '@shared/api'\nimport type {\n GetProjectsInfoResponse,\n FolderType,\n Status,\n Tag,\n TaskType,\n AttributeModel,\n AttributeEnumItem,\n AttributeData,\n EntityGroup,\n} from '@shared/api'\nimport { ColumnOrderState } from '@tanstack/react-table'\nimport { Icon, Option, Filter } from '@ynput/ayon-react-components'\nimport { dateOptions } from './filterDates'\nimport { isEmpty } from 'lodash'\nimport { SliceFilter } from '@shared/containers'\nimport { FEATURED_VERSION_TYPES } from '../FeaturedVersionOrder'\nimport { useGlobalContext } from '@shared/context'\n\ntype ScopeType = 'folder' | 'product' | 'task' | 'user' | 'version'\ntype Scope = ScopeType | ScopeType[]\n\nexport type ScopeWithFilterTypes = {\n scope: ScopeType\n filterTypes: FilterFieldType[]\n}\n\nexport type FilterFieldType =\n | 'folderType'\n | 'taskType'\n | 'productType'\n | ('users' | 'assignees' | 'author')\n | 'attributes'\n | 'status'\n | 'tags'\n | 'version'\n | 'hasReviewables'\n | 'productName'\ntype AttributeType =\n | string\n | number\n | boolean\n | Date\n | string[]\n | number[]\n | any[]\n | { [key: string]: any }\n\ntype AttributeDataValue = AttributeType | null | undefined\n\ntype FilterConfig = {\n enableExcludes?: boolean\n enableOperatorChange?: boolean\n enableRelativeValues?: boolean\n prefixes?: Partial<Record<FilterFieldType, string>> // strings that will be prepended to the id of the option\n keys?: Partial<Record<FilterFieldType, string>> // replaces the default keys for the filter\n}\n\nexport type BuildFilterOptions = {\n filterTypes?: FilterFieldType[]\n projectNames: string[]\n scope?: Scope\n scopes?: ScopeWithFilterTypes[]\n data: {\n tags?: string[]\n attributes?: Record<string, AttributeDataValue[]>\n assignees?: string[]\n productTypes?: ProductType[]\n productNames?: string[]\n }\n columnOrder?: ColumnOrderState\n config?: FilterConfig\n power?: boolean\n}\n\nexport const useBuildFilterOptions = ({\n filterTypes: globalFilterTypes = [],\n projectNames,\n scope,\n scopes: customScopes,\n data,\n config,\n columnOrder = [],\n power,\n}: BuildFilterOptions): Option[] => {\n let options: Option[] = []\n\n // Determine which scopes to use\n // If customScopes is provided, use it; otherwise, fall back to the old method\n const scopesWithTypes: Array<{ scope: ScopeType; filterTypes: FilterFieldType[] }> = customScopes\n ? customScopes\n : (() => {\n // Fallback to old method: normalize scope to array and use globalFilterTypes for all\n const normalizedScopes = scope ? (Array.isArray(scope) ? scope : [scope]) : []\n return normalizedScopes.map((s) => ({\n scope: s,\n filterTypes: globalFilterTypes,\n }))\n })()\n\n const isMultiScope = scopesWithTypes.length > 1\n\n // QUERIES\n //\n //\n // Check if any scope needs these filter types\n const anyNeedsEntitySubType = scopesWithTypes.some((s) =>\n ['entitySubType', 'status'].some((type) => s.filterTypes.includes(type as FilterFieldType)),\n )\n const anyNeedsUsers = scopesWithTypes.some((s) =>\n ['assignees', 'users', 'author'].some((type) =>\n s.filterTypes.includes(type as FilterFieldType),\n ),\n )\n // find if any search field is in any of the scopesWithTypes\n const fieldInScopes = (field: FilterFieldType): boolean => {\n return scopesWithTypes.some((s) => s.filterTypes.includes(field))\n }\n\n // get grouping options for productTypes\n // NOTE: We should revisit this to be used for all attribs and fields\n const { data: { groups: productTypes = [] } = {} } = useGetEntityGroupsQuery(\n {\n entityType: 'product',\n groupingKey: 'productType',\n projectName: projectNames[0],\n empty: true,\n },\n { skip: !projectNames?.length || !fieldInScopes('productType') },\n )\n\n const { data: projectsInfo = {} } = useGetProjectsInfoQuery(\n {\n projects: projectNames,\n },\n {\n skip: !projectNames?.length || !anyNeedsEntitySubType,\n },\n )\n\n const { data: projectUsers = [] } = useGetKanbanProjectUsersQuery(\n { projects: projectNames },\n {\n skip: !projectNames?.length || !anyNeedsUsers,\n },\n )\n\n const { attributes } = useGlobalContext()\n //\n //\n // QUERIES\n\n // ADD OPTIONS\n\n // Helper to get scope label (capitalize first letter)\n const getScopeLabel = (scope: ScopeType) => scope.charAt(0).toUpperCase() + scope.slice(1)\n\n // Loop through each scope to build options\n scopesWithTypes.forEach(({ scope: currentScope, filterTypes: scopeFilterTypes }) => {\n const scopePrefix = isMultiScope ? currentScope : undefined\n const scopeLabel = isMultiScope ? getScopeLabel(currentScope) : undefined\n\n // TASK TYPE\n // add taskType option\n if (scopeFilterTypes.includes('taskType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'taskType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'task')\n\n entitySubTypeOption.values?.push(...subTypes)\n\n options.push(entitySubTypeOption)\n }\n }\n\n // FOLDER TYPE\n // add folderType option\n if (scopeFilterTypes.includes('folderType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'folderType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'folder')\n\n entitySubTypeOption.values?.push(...subTypes)\n\n options.push(entitySubTypeOption)\n }\n }\n\n // PRODUCT TYPE\n // add productType option\n if (scopeFilterTypes.includes('productType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'productType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'product')\n entitySubTypeOption.values?.push(...subTypes)\n options.push(entitySubTypeOption)\n }\n }\n // PRODUCT NAME\n // add product name option\n if (scopeFilterTypes.includes('productName') && currentScope === 'product') {\n const productNameOption = getOptionRoot('productName', config, scopePrefix, scopeLabel)\n\n if (productNameOption) {\n // Populate with product names from data as suggestions (optional since allowsCustomValues: true)\n data.productNames?.forEach((name) => {\n if (!productNameOption.values?.some((value) => value.id === name)) {\n productNameOption.values?.push({\n id: name,\n label: name,\n })\n }\n })\n\n options.push(productNameOption)\n }\n }\n\n // STATUS\n // add status option\n if (scopeFilterTypes.includes('status')) {\n const statusOption = getOptionRoot(\n 'status',\n { ...config, enableOperatorChange: false },\n scopePrefix,\n scopeLabel,\n )\n\n if (statusOption) {\n Object.values(projectsInfo).forEach((project) => {\n const statuses = project?.statuses || []\n statuses\n .filter((status) => status.scope?.includes(currentScope))\n .forEach((status: Status) => {\n if (!statusOption.values?.some((value) => value.id === status.name)) {\n statusOption.values?.push({\n id: status.name,\n label: status.name,\n icon: status.icon,\n color: status.color,\n })\n }\n })\n })\n\n options.push(statusOption)\n }\n }\n\n // ASSIGNEES\n // add users/assignees option\n if (scopeFilterTypes.includes('assignees')) {\n const assigneesOption = getOptionRoot('assignees', config, scopePrefix, scopeLabel)\n\n if (assigneesOption) {\n // add every user for the projects (skip duplicates)\n projectUsers.forEach((user) => {\n if (!assigneesOption.values?.some((value) => value.id === user.name)) {\n assigneesOption.values?.push({\n id: user.name,\n label: user.attrib.fullName || user.name,\n img: `/api/users/${user.name}/avatar`,\n icon: null,\n })\n }\n })\n\n // sort the assignees based on the number of times they appear in data.assignees\n assigneesOption.values?.sort((a, b) => {\n const aCount = data.assignees?.filter((assignee) => assignee === a.id).length || 0\n const bCount = data.assignees?.filter((assignee) => assignee === b.id).length || 0\n return bCount - aCount\n })\n\n options.push(assigneesOption)\n }\n }\n\n if (scopeFilterTypes.includes('author')) {\n const authorOption = getOptionRoot('author', config, scopePrefix, scopeLabel)\n if (authorOption) {\n // add every user for the projects (skip duplicates)\n projectUsers.forEach((user) => {\n if (!authorOption.values?.some((value) => value.id === user.name)) {\n authorOption.values?.push({\n id: user.name,\n label: user.attrib.fullName || user.name,\n img: `/api/users/${user.name}/avatar`,\n icon: null,\n })\n }\n })\n options.push(authorOption)\n }\n }\n\n // TAGS\n // add tags options\n if (scopeFilterTypes.includes('tags')) {\n const tagsOption = getOptionRoot('tags', config, scopePrefix, scopeLabel)\n\n if (tagsOption) {\n // reduce projectsInfo to get all tags\n const tagsAnatomy = new Map<string, Tag>()\n Object.values(projectsInfo).forEach((project) => {\n if (project?.tags) {\n project.tags.forEach((tag) => {\n if (!tagsAnatomy.has(tag.name)) {\n tagsAnatomy.set(tag.name, tag)\n }\n })\n }\n })\n\n // create options for each tag, finding color if in tagsAnatomy\n const tagOptionValuesMap = new Map<string, Option & { count: number }>()\n data.tags?.forEach((tag) => {\n const existingTag = tagOptionValuesMap.get(tag)\n if (existingTag) {\n // increment count\n existingTag.count++\n return\n } else {\n // create new tag\n const tagData = tagsAnatomy.get(tag)\n\n tagOptionValuesMap.set(tag, {\n id: tag,\n type: 'string',\n label: tag,\n values: [],\n color: tagData?.color || null,\n count: 1,\n })\n }\n })\n\n // convert values map to array and sort based on count\n const tagOptionValues = Array.from(tagOptionValuesMap.values()).sort(\n (a, b) => b.count - a.count,\n )\n\n // add tag options to the tagsOption\n tagsOption.values?.push(...tagOptionValues)\n\n options.push(tagsOption)\n }\n }\n\n // VERSION\n // add version options\n if (scopeFilterTypes.includes('version')) {\n const versionOption = getOptionRoot('version', config, scopePrefix, scopeLabel)\n\n if (versionOption) {\n // add featured version types as options\n FEATURED_VERSION_TYPES.forEach((versionType) => {\n versionOption.values?.push({\n id: versionType.value,\n label: versionType.label,\n icon: versionType.icon,\n })\n })\n\n options.push(versionOption)\n }\n }\n\n // HAS REVIEWABLES\n // add hasReviewables option\n if (scopeFilterTypes.includes('hasReviewables')) {\n const hasReviewablesOption = getOptionRoot('hasReviewables', config, scopePrefix, scopeLabel)\n\n if (hasReviewablesOption) {\n const options_list = [\n {\n id: 'true',\n label: 'Yes',\n values: [],\n icon: 'radio_button_checked',\n },\n {\n id: 'false',\n label: 'No',\n values: [],\n icon: 'radio_button_unchecked',\n },\n ]\n hasReviewablesOption.values?.push(...options_list)\n options.push(hasReviewablesOption)\n }\n }\n\n // ATTRIBUTES\n // dynamically add attributes options\n if (scopeFilterTypes.includes('attributes')) {\n const attributesByScope = attributes.filter((attribute) =>\n attribute.scope?.includes(currentScope),\n )\n // if attributesData is provided, filter out attributes that are not in the attributesData\n const attributesByValues = !isEmpty(data.attributes)\n ? attributesByScope.filter(\n (attribute) => data.attributes && data.attributes[attribute.name],\n )\n : attributesByScope\n\n const attributesWithoutDates = config?.enableRelativeValues\n ? attributesByValues\n : attributesByValues.filter((attribute) => attribute.data.type !== 'datetime')\n\n attributesWithoutDates.forEach((attribute) => {\n const realData = data.attributes && data.attributes[attribute.name]\n const enums = attribute.data.enum\n const type = attribute.data.type\n\n const isListOf = [\n 'list_of_strings',\n 'list_of_integers',\n 'list_of_any',\n 'list_of_submodels',\n ].includes(type || '')\n const isDate = type === 'datetime'\n const enableOperatorChange = isListOf ? config?.enableOperatorChange : false\n const enableRelativeValues = isListOf || isDate ? config?.enableRelativeValues : false\n // for the attribute, get the option root\n const option = getAttributeFieldOptionRoot(\n attribute,\n {\n ...config,\n allowsCustomValues: true,\n enableOperatorChange: enableOperatorChange,\n enableRelativeValues: enableRelativeValues,\n },\n scopePrefix,\n scopeLabel,\n )\n\n const suggestValuesForTypes: AttributeData['type'][] = [\n 'string',\n 'integer',\n 'float',\n 'list_of_strings',\n 'list_of_integers',\n ]\n\n const optionValues: Option[] = []\n\n // if the attribute type is in the suggestValuesForTypes, get the options based on real values\n if (suggestValuesForTypes.includes(type)) {\n const options = getAttributeOptions(realData, enums, type)\n optionValues.push(...options)\n }\n\n // if the attribute type is boolean, add yes/no options\n if (type === 'boolean') {\n const options = [\n {\n id: 'true',\n label: 'Yes',\n values: [],\n icon: 'radio_button_checked',\n },\n {\n id: 'false',\n label: 'No',\n values: [],\n icon: 'radio_button_unchecked',\n },\n ]\n optionValues.push(...options)\n }\n\n // if the attribute type is datetime, add datetime options\n\n if (isDate) {\n optionValues.push(\n ...dateOptions.map((o) => ({\n ...o,\n contentAfter: power ? undefined : <Icon icon=\"bolt\" />,\n })),\n )\n }\n\n // add option to the list of options\n option.values?.push(...optionValues)\n\n // add option to the list of options\n options.push(option)\n })\n }\n }) // End of scopes.forEach loop\n\n // order options by columnOrder\n if (columnOrder) {\n return sortOptionsBasedOnColumns(options, columnOrder)\n } else return options\n}\n\n// HELPER FUNCTIONS\n//\n//\n//\n//\nconst getSubTypes = (\n {\n projectsInfo,\n productTypes,\n }: { projectsInfo: GetProjectsInfoResponse; productTypes: EntityGroup[] },\n type: ScopeType,\n): Option[] => {\n const options: Option[] = []\n if (type === 'product') {\n productTypes.forEach(({ icon, label, value }) => {\n options.push({\n id: value,\n type: 'string',\n label: label || value,\n icon: icon || getEntityTypeIcon('product'),\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n })\n } else if (type === 'task') {\n Object.values(projectsInfo).forEach((project) => {\n // for each project, get all task types and add them to the options (if they don't already exist)\n const taskTypes = project?.taskTypes || []\n taskTypes.forEach((taskType: TaskType) => {\n if (!options.some((option) => option.id === taskType.name)) {\n options.push({\n id: taskType.name,\n type: 'string',\n label: taskType.name,\n icon: taskType.icon,\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n }\n })\n })\n } else if (type === 'folder') {\n Object.values(projectsInfo).forEach((project) => {\n // for each project, get all folder types and add them to the options (if they don't already exist)\n const folderTypes = project?.folderTypes || []\n folderTypes.forEach((folderType: FolderType) => {\n if (!options.some((option) => option.id === folderType.name)) {\n options.push({\n id: folderType.name,\n type: 'string',\n label: folderType.name,\n icon: folderType.icon,\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n }\n })\n })\n }\n\n return options\n}\n\nconst getFormattedId = (\n base: string,\n fieldType: FilterFieldType,\n config?: FilterConfig,\n scopePrefix?: string,\n) => {\n const { prefixes, keys } = config || {}\n let result = base\n\n if (keys && fieldType in keys) {\n result = `${keys[fieldType]}`\n } else if (prefixes && fieldType in prefixes) {\n result = `${prefixes[fieldType]}${base}`\n }\n\n // Add scope prefix if provided\n if (scopePrefix) {\n result = `${scopePrefix}_${result}`\n }\n\n return result\n}\n\nconst formatLabel = (baseLabel: string, scopeLabel?: string) =>\n scopeLabel ? `${baseLabel} - ${scopeLabel}` : baseLabel\n\nconst getOptionRoot = (\n fieldType: FilterFieldType,\n config?: FilterConfig,\n scopePrefix?: string,\n scopeLabel?: string,\n) => {\n const getRootIdWithPrefix = (base: string) => getFormattedId(base, fieldType, config, scopePrefix)\n const formatLabelWithScope = (baseLabel: string) => formatLabel(baseLabel, scopeLabel)\n\n let rootOption: Option | null = null\n switch (fieldType) {\n case 'taskType':\n rootOption = {\n id: getRootIdWithPrefix(`taskType`),\n type: 'string',\n label: formatLabelWithScope(`Task Type`),\n icon: getAttributeIcon('task'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'folderType':\n rootOption = {\n id: getRootIdWithPrefix(`folderType`),\n type: 'string',\n label: formatLabelWithScope(`Folder Type`),\n icon: getAttributeIcon('folder'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'productType':\n rootOption = {\n id: getRootIdWithPrefix(`productType`),\n type: 'string',\n label: formatLabelWithScope(`Product Type`),\n icon: getAttributeIcon('product'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'productName':\n rootOption = {\n id: getRootIdWithPrefix(`productNames`),\n type: 'string',\n label: formatLabelWithScope(`Product Name`),\n icon: getAttributeIcon('productName', 'string'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: false,\n operatorChangeable: true,\n }\n break\n case 'status':\n rootOption = {\n id: getRootIdWithPrefix('status'),\n type: 'string',\n label: formatLabelWithScope('Status'),\n icon: getAttributeIcon('status'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'assignees':\n rootOption = {\n id: getRootIdWithPrefix('assignees'),\n type: 'list_of_strings',\n label: formatLabelWithScope('Assignee'),\n icon: getAttributeIcon('assignees'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'author':\n rootOption = {\n id: getRootIdWithPrefix('author'),\n type: 'string',\n label: formatLabelWithScope('Author'),\n icon: getAttributeIcon('author'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'tags':\n rootOption = {\n id: getRootIdWithPrefix('tags'),\n type: 'list_of_strings',\n label: formatLabelWithScope('Tags'),\n icon: getAttributeIcon('tags'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'version':\n rootOption = {\n id: getRootIdWithPrefix('version'),\n type: 'string',\n label: formatLabelWithScope('Version'),\n icon: getAttributeIcon('version'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: false,\n operatorChangeable: false,\n }\n break\n case 'hasReviewables':\n rootOption = {\n id: getRootIdWithPrefix('hasReviewables'),\n type: 'boolean',\n label: formatLabelWithScope('Has Reviewables'),\n icon: 'play_circle',\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n singleSelect: true,\n }\n break\n default:\n break\n\n // Note: attributes are handled separately\n }\n\n return rootOption\n}\n\nconst getAttributeFieldOptionRoot = (\n attribute: AttributeModel,\n config: FilterConfig & { allowsCustomValues: boolean },\n scopePrefix?: string,\n scopeLabel?: string,\n): Option => ({\n id: getFormattedId(attribute.name, 'attributes', config, scopePrefix),\n type: attribute.data.type,\n label: scopeLabel\n ? formatLabel(attribute.data.title || attribute.name, scopeLabel)\n : attribute.data.title || attribute.name,\n operator: 'OR',\n inverted: false,\n values: [],\n allowsCustomValues: config?.allowsCustomValues,\n allowHasValue: config.enableRelativeValues,\n allowNoValue: config.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n icon: getAttributeIcon(attribute.name, attribute.data.type, !!attribute.data.enum?.length),\n singleSelect: ['boolean', 'datetime'].includes(attribute.data.type || ''),\n})\n\nconst getAttributeOptions = (\n values?: AttributeDataValue[],\n enums?: AttributeEnumItem[],\n type?: AttributeData['type'],\n): Option[] => {\n const enumOptions: Option[] = []\n const options: (Option & { count: number })[] = []\n\n // add the enum values first\n if (enums) {\n enums.forEach((enumItem) => {\n enumOptions.push({\n id: enumItem.value.toString(),\n type: type,\n label: enumItem.label,\n values: [],\n icon: enumItem.icon,\n color: enumItem.color,\n })\n })\n }\n\n values?.forEach((value) => {\n // no value? do nothing\n if (!value) return\n\n let text = ''\n\n // convert value to text\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n text = value.toString()\n break\n case 'object':\n if (Array.isArray(value)) {\n text = value.join(', ')\n } else {\n text = JSON.stringify(value)\n }\n break\n default:\n break\n }\n\n // create id for text value\n const id = text\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, '-')\n\n // check if the option already exists in enums\n const existingOption = enumOptions?.find((enumItem) => enumItem.id === id)\n if (existingOption) return\n\n // check if options already has the value, if so, increment the count\n const existingValue = options.find((option) => option.id === id)\n if (existingValue) {\n existingValue.count++\n return\n } else {\n // add option\n options.push({\n id,\n type: type,\n label: text,\n values: [],\n count: 1,\n })\n }\n })\n\n // sort options based on count\n options.sort((a, b) => b.count - a.count)\n\n // enum options first, then the rest\n return [...enumOptions, ...options]\n}\n\nconst sortOptionsBasedOnColumns = (options: Option[], columnOrder: ColumnOrderState) => {\n const columnOrderWithSubTypes = columnOrder.flatMap((col) => {\n if (col === 'subType') {\n return ['taskType', 'folderType']\n }\n return col\n })\n return [...options].sort((a, b) => {\n const aIndex = columnOrderWithSubTypes.indexOf(a.id.replace('.', '_'))\n const bIndex = columnOrderWithSubTypes.indexOf(b.id.replace('.', '_'))\n\n // If both options are in columnOrder, sort them based on their index in columnOrder\n if (aIndex !== -1 && bIndex !== -1) {\n return aIndex - bIndex\n }\n\n // If only one of the options is in columnOrder, sort the one in columnOrder first\n if (aIndex !== -1) {\n return -1\n }\n if (bIndex !== -1) {\n return 1\n }\n\n // If neither option is in columnOrder, keep their original order\n return 0\n })\n}\n\n/**\n * Splits combined filters by their scope and removes the scope prefix from filter IDs.\n * Used to separate multi-scope filters back into individual scope filters.\n *\n * @param combinedFilter - The filter with potentially scope-prefixed IDs\n * @param scopes - Array of scopes to split by\n * @param config - Filter config containing prefixes for field types\n * @param filterIdToScopeMap - Optional mapping of filter IDs (without scope prefix) to their scopes (e.g., { taskType: 'task', folderType: 'folder' })\n * @returns Object with scope-keyed filters (including 'unscoped' for filters that don't match any scope), with prefixes removed from IDs\n *\n * @example\n * // Input: combinedFilter with IDs like \"version_status\", \"folder_status\", \"taskType\"\n * // With filterIdToScopeMap: { taskType: 'task' }\n * // Output: { version: { conditions: [...] }, folder: { conditions: [...] }, task: { conditions: [...] }, unscoped: { conditions: [] } }\n */\nexport const splitFiltersByScope = (\n combinedFilter: Record<string, any> | null,\n scopes: ScopeType[],\n config?: FilterConfig,\n filterIdToScopeMap?: Record<string, ScopeType>,\n): Record<ScopeType | 'unscoped', Record<string, any>> => {\n // Initialize with all scopes having empty conditions, plus unscoped\n const result: Record<ScopeType | 'unscoped', Record<string, any>> = {\n folder: { conditions: [] },\n product: { conditions: [] },\n task: { conditions: [] },\n user: { conditions: [] },\n version: { conditions: [] },\n unscoped: { conditions: [] },\n }\n\n if (!combinedFilter?.conditions || combinedFilter?.conditions.length === 0) {\n return result\n }\n\n // Helper to extract scope prefix from an ID\n const extractScopeAndRemovePrefix = (\n id: string,\n currentConfig?: FilterConfig,\n ): { scope: ScopeType | null; cleanId: string } => {\n // Check if ID starts with any scope prefix\n const scopeMatch = scopes.find((scope) => id.startsWith(`${scope}_`))\n\n if (scopeMatch) {\n // Remove scope prefix\n const cleanId = id.substring(`${scopeMatch}_`.length)\n return { scope: scopeMatch, cleanId }\n }\n\n // If no scope prefix, return null scope (shouldn't happen in multi-scope scenario)\n return { scope: null, cleanId: id }\n }\n\n // Helper to process a filter recursively\n const processConditions = (\n conditions: any[] | undefined,\n targetFilters: Record<ScopeType | 'unscoped', Record<string, any>>,\n ) => {\n if (!conditions || conditions.length === 0) return\n\n conditions.forEach((condition) => {\n // If this is a nested filter\n if ('conditions' in condition && !('key' in condition)) {\n processConditions(condition.conditions, targetFilters)\n } else if ('key' in condition) {\n // This is a QueryCondition\n const { scope, cleanId } = extractScopeAndRemovePrefix(condition.key, config)\n\n if (scope && targetFilters[scope]) {\n // Add the condition with cleaned ID to the appropriate scope\n targetFilters[scope].conditions?.push({\n ...condition,\n key: cleanId,\n })\n } else if (!scope) {\n // No explicit scope prefix found, check filterIdToScopeMap\n const mappedScope = filterIdToScopeMap?.[condition.key]\n\n if (mappedScope && targetFilters[mappedScope]) {\n // Found in the map, add to mapped scope\n targetFilters[mappedScope].conditions?.push(condition)\n } else {\n // Not in map, add to unscoped\n targetFilters['unscoped']?.conditions?.push(condition)\n }\n }\n }\n })\n }\n\n // Process the combined filter\n processConditions(combinedFilter.conditions, result)\n\n return result\n}\n\n/**\n * Splits combined Filter objects by their scope and removes the scope prefix from filter IDs.\n * Used to separate multi-scope Filter arrays back into individual scope Filter arrays.\n * This function works with Filter objects from @ynput/ayon-react-components, not QueryFilter objects.\n *\n * @param filters - Array of Filter objects with potentially scope-prefixed IDs\n * @param scopes - Array of scopes to split by\n * @param filterIdToScopeMap - Optional mapping of filter IDs (without scope prefix) to their scopes (e.g., { taskType: 'task', folderType: 'folder' })\n * @returns Object with scope-keyed Filter arrays (including 'unscoped' for filters that don't match any scope)\n *\n * @example\n * // Input: filters with IDs like \"version_status\", \"folder_status\", \"taskType\"\n * // With filterIdToScopeMap: { taskType: 'task' }\n * // Output: { version: [...], folder: [...], task: [...], product: [...], user: [...], unscoped: [...] }\n */\nexport const splitClientFiltersByScope = (\n filters: (Filter | SliceFilter)[] | null | undefined,\n scopes: ScopeType[],\n filterIdToScopeMap?: Record<string, ScopeType>,\n): Record<ScopeType | 'unscoped', Filter[]> => {\n // Initialize with all scopes having empty arrays, plus unscoped\n const result: Record<ScopeType | 'unscoped', Filter[]> = {\n folder: [],\n product: [],\n task: [],\n user: [],\n version: [],\n unscoped: [],\n }\n\n if (!filters || filters.length === 0) {\n return result\n }\n\n // Helper to extract scope prefix from a filter ID\n const extractScopeFromId = (id: string): ScopeType | null => {\n // Check if ID starts with any scope prefix\n const scopeMatch = scopes.find((scope) => id.startsWith(`${scope}_`))\n return scopeMatch || null\n }\n\n // Helper to remove scope prefix from ID\n const removeScopePrefix = (id: string, scope: ScopeType): string => {\n const prefix = `${scope}_`\n return id.startsWith(prefix) ? id.substring(prefix.length) : id\n }\n\n // Process each filter\n filters.forEach((filter) => {\n if (!filter.id) return\n\n const scope = extractScopeFromId(filter.id)\n\n // If a scope was found, create a new filter without the scope prefix\n if (scope) {\n const cleanedFilter: Filter = {\n ...filter,\n id: removeScopePrefix(filter.id, scope),\n }\n result[scope].push(cleanedFilter)\n } else {\n // No explicit scope prefix found, check filterIdToScopeMap\n const mappedScope = filterIdToScopeMap?.[filter.id]\n\n if (mappedScope) {\n // Found in the map, add to mapped scope\n result[mappedScope].push(filter)\n } else {\n // Not in map, add to unscoped\n result['unscoped'].push(filter)\n }\n }\n })\n\n return result\n}\n"],"names":["useBuildFilterOptions","globalFilterTypes","projectNames","scope","customScopes","data","config","columnOrder","power","options","scopesWithTypes","s","isMultiScope","anyNeedsEntitySubType","type","anyNeedsUsers","fieldInScopes","field","productTypes","useGetEntityGroupsQuery","projectsInfo","useGetProjectsInfoQuery","projectUsers","useGetKanbanProjectUsersQuery","attributes","useGlobalContext","getScopeLabel","currentScope","scopeFilterTypes","scopePrefix","scopeLabel","entitySubTypeOption","getOptionRoot","subTypes","getSubTypes","_a","_b","_c","productNameOption","_d","name","value","statusOption","project","status","assigneesOption","user","_e","a","b","aCount","assignee","authorOption","tagsOption","tagsAnatomy","tag","tagOptionValuesMap","_f","existingTag","tagData","tagOptionValues","_g","versionOption","FEATURED_VERSION_TYPES","versionType","hasReviewablesOption","options_list","_h","attributesByScope","attribute","attributesByValues","isEmpty","realData","enums","isListOf","isDate","enableOperatorChange","enableRelativeValues","option","getAttributeFieldOptionRoot","suggestValuesForTypes","optionValues","getAttributeOptions","dateOptions","o","jsx","Icon","sortOptionsBasedOnColumns","icon","label","getEntityTypeIcon","taskType","folderType","getFormattedId","base","fieldType","prefixes","keys","result","formatLabel","baseLabel","getRootIdWithPrefix","formatLabelWithScope","rootOption","getAttributeIcon","values","enumOptions","enumItem","text","id","existingValue","columnOrderWithSubTypes","col","aIndex","bIndex","splitFiltersByScope","combinedFilter","scopes","filterIdToScopeMap","extractScopeAndRemovePrefix","currentConfig","scopeMatch","cleanId","processConditions","conditions","targetFilters","condition","mappedScope","splitClientFiltersByScope","filters","extractScopeFromId","removeScopePrefix","prefix","filter","cleanedFilter"],"mappings":"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"}
1
+ {"version":3,"file":"useBuildFilterOptions.es.js","sources":["../../../../../src/components/SearchFilter/useBuildFilterOptions.tsx"],"sourcesContent":["import { getAttributeIcon, getEntityTypeIcon } from '@shared/util'\nimport {\n ProductType,\n useGetEntityGroupsQuery,\n useGetKanbanProjectUsersQuery,\n useGetProjectsInfoQuery,\n} from '@shared/api'\nimport type {\n GetProjectsInfoResponse,\n FolderType,\n Status,\n Tag,\n TaskType,\n AttributeModel,\n AttributeEnumItem,\n AttributeData,\n EntityGroup,\n} from '@shared/api'\nimport { ColumnOrderState } from '@tanstack/react-table'\nimport { Icon, Option, Filter } from '@ynput/ayon-react-components'\nimport { dateOptions } from './filterDates'\nimport { isEmpty } from 'lodash'\nimport { SliceFilter } from '@shared/containers'\nimport { FEATURED_VERSION_TYPES } from '../FeaturedVersionOrder'\nimport { useGlobalContext } from '@shared/context'\n\ntype ScopeType = 'folder' | 'product' | 'task' | 'user' | 'version'\ntype Scope = ScopeType | ScopeType[]\n\nexport type ScopeWithFilterTypes = {\n scope: ScopeType\n filterTypes: FilterFieldType[]\n}\n\nexport type FilterFieldType =\n | 'folderType'\n | 'taskType'\n | 'productType'\n | ('users' | 'assignees' | 'author')\n | 'attributes'\n | 'status'\n | 'tags'\n | 'version'\n | 'hasReviewables'\n | 'productName'\ntype AttributeType =\n | string\n | number\n | boolean\n | Date\n | string[]\n | number[]\n | any[]\n | { [key: string]: any }\n\ntype AttributeDataValue = AttributeType | null | undefined\n\ntype FilterConfig = {\n enableExcludes?: boolean\n enableOperatorChange?: boolean\n enableRelativeValues?: boolean\n prefixes?: Partial<Record<FilterFieldType, string>> // strings that will be prepended to the id of the option\n keys?: Partial<Record<FilterFieldType, string>> // replaces the default keys for the filter\n}\n\nexport type BuildFilterOptions = {\n filterTypes?: FilterFieldType[]\n projectNames: string[]\n scope?: Scope\n scopes?: ScopeWithFilterTypes[]\n data: {\n tags?: string[]\n attributes?: Record<string, AttributeDataValue[]>\n assignees?: string[]\n productTypes?: ProductType[]\n productNames?: string[]\n }\n columnOrder?: ColumnOrderState\n config?: FilterConfig\n power?: boolean\n}\n\nexport const useBuildFilterOptions = ({\n filterTypes: globalFilterTypes = [],\n projectNames,\n scope,\n scopes: customScopes,\n data,\n config,\n columnOrder = [],\n power,\n}: BuildFilterOptions): Option[] => {\n let options: Option[] = []\n\n // Determine which scopes to use\n // If customScopes is provided, use it; otherwise, fall back to the old method\n const scopesWithTypes: Array<{ scope: ScopeType; filterTypes: FilterFieldType[] }> = customScopes\n ? customScopes\n : (() => {\n // Fallback to old method: normalize scope to array and use globalFilterTypes for all\n const normalizedScopes = scope ? (Array.isArray(scope) ? scope : [scope]) : []\n return normalizedScopes.map((s) => ({\n scope: s,\n filterTypes: globalFilterTypes,\n }))\n })()\n\n const isMultiScope = scopesWithTypes.length > 1\n\n // QUERIES\n //\n //\n // Check if any scope needs these filter types\n const anyNeedsEntitySubType = scopesWithTypes.some((s) =>\n ['entitySubType', 'status'].some((type) => s.filterTypes.includes(type as FilterFieldType)),\n )\n const anyNeedsUsers = scopesWithTypes.some((s) =>\n ['assignees', 'users', 'author'].some((type) =>\n s.filterTypes.includes(type as FilterFieldType),\n ),\n )\n // find if any search field is in any of the scopesWithTypes\n const fieldInScopes = (field: FilterFieldType): boolean => {\n return scopesWithTypes.some((s) => s.filterTypes.includes(field))\n }\n\n // get grouping options for productTypes\n // NOTE: We should revisit this to be used for all attribs and fields\n const { data: { groups: productTypes = [] } = {} } = useGetEntityGroupsQuery(\n {\n entityType: 'product',\n groupingKey: 'productType',\n projectName: projectNames[0],\n empty: true,\n },\n { skip: !projectNames?.length || !fieldInScopes('productType') },\n )\n\n const { data: projectsInfo = {} } = useGetProjectsInfoQuery(\n {\n projects: projectNames,\n },\n {\n skip: !projectNames?.length || !anyNeedsEntitySubType,\n },\n )\n\n const { data: projectUsers = [] } = useGetKanbanProjectUsersQuery(\n { projects: projectNames },\n {\n skip: !projectNames?.length || !anyNeedsUsers,\n },\n )\n\n const { attributes } = useGlobalContext()\n //\n //\n // QUERIES\n\n // ADD OPTIONS\n\n // Helper to get scope label (capitalize first letter)\n const getScopeLabel = (scope: ScopeType) => scope.charAt(0).toUpperCase() + scope.slice(1)\n\n // Loop through each scope to build options\n scopesWithTypes.forEach(({ scope: currentScope, filterTypes: scopeFilterTypes }) => {\n const scopePrefix = isMultiScope ? currentScope : undefined\n const scopeLabel = isMultiScope ? getScopeLabel(currentScope) : undefined\n\n // TASK TYPE\n // add taskType option\n if (scopeFilterTypes.includes('taskType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'taskType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'task')\n\n entitySubTypeOption.values?.push(...subTypes)\n\n options.push(entitySubTypeOption)\n }\n }\n\n // FOLDER TYPE\n // add folderType option\n if (scopeFilterTypes.includes('folderType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'folderType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'folder')\n\n entitySubTypeOption.values?.push(...subTypes)\n\n options.push(entitySubTypeOption)\n }\n }\n\n // PRODUCT TYPE\n // add productType option\n if (scopeFilterTypes.includes('productType') && currentScope !== 'user') {\n const entitySubTypeOption = getOptionRoot(\n 'productType',\n {\n ...config,\n enableOperatorChange: false,\n },\n scopePrefix,\n scopeLabel,\n )\n if (entitySubTypeOption) {\n // get all subTypes for the current scope (entityType)\n let subTypes = getSubTypes({ projectsInfo, productTypes }, 'product')\n entitySubTypeOption.values?.push(...subTypes)\n options.push(entitySubTypeOption)\n }\n }\n // PRODUCT NAME\n // add product name option\n if (scopeFilterTypes.includes('productName') && currentScope === 'product') {\n const productNameOption = getOptionRoot('productName', config, scopePrefix, scopeLabel)\n\n if (productNameOption) {\n // Populate with product names from data as suggestions (optional since allowsCustomValues: true)\n data.productNames?.forEach((name) => {\n if (!productNameOption.values?.some((value) => value.id === name)) {\n productNameOption.values?.push({\n id: name,\n label: name,\n })\n }\n })\n\n options.push(productNameOption)\n }\n }\n\n // STATUS\n // add status option\n if (scopeFilterTypes.includes('status')) {\n const statusOption = getOptionRoot(\n 'status',\n { ...config, enableOperatorChange: false },\n scopePrefix,\n scopeLabel,\n )\n\n if (statusOption) {\n Object.values(projectsInfo).forEach((project) => {\n const statuses = project?.statuses || []\n statuses\n .filter((status) => status.scope?.includes(currentScope))\n .forEach((status: Status) => {\n if (!statusOption.values?.some((value) => value.id === status.name)) {\n statusOption.values?.push({\n id: status.name,\n label: status.name,\n icon: status.icon,\n color: status.color,\n })\n }\n })\n })\n\n options.push(statusOption)\n }\n }\n\n // ASSIGNEES\n // add users/assignees option\n if (scopeFilterTypes.includes('assignees')) {\n const assigneesOption = getOptionRoot('assignees', config, scopePrefix, scopeLabel)\n\n if (assigneesOption) {\n // add every user for the projects (skip duplicates)\n projectUsers.forEach((user) => {\n if (!assigneesOption.values?.some((value) => value.id === user.name)) {\n assigneesOption.values?.push({\n id: user.name,\n label: user.attrib.fullName || user.name,\n img: `/api/users/${user.name}/avatar`,\n icon: null,\n })\n }\n })\n\n // sort the assignees based on the number of times they appear in data.assignees\n assigneesOption.values?.sort((a, b) => {\n const aCount = data.assignees?.filter((assignee) => assignee === a.id).length || 0\n const bCount = data.assignees?.filter((assignee) => assignee === b.id).length || 0\n return bCount - aCount\n })\n\n options.push(assigneesOption)\n }\n }\n\n if (scopeFilterTypes.includes('author')) {\n const authorOption = getOptionRoot('author', config, scopePrefix, scopeLabel)\n if (authorOption) {\n // add every user for the projects (skip duplicates)\n projectUsers.forEach((user) => {\n if (!authorOption.values?.some((value) => value.id === user.name)) {\n authorOption.values?.push({\n id: user.name,\n label: user.attrib.fullName || user.name,\n img: `/api/users/${user.name}/avatar`,\n icon: null,\n })\n }\n })\n options.push(authorOption)\n }\n }\n\n // TAGS\n // add tags options\n if (scopeFilterTypes.includes('tags')) {\n const tagsOption = getOptionRoot('tags', config, scopePrefix, scopeLabel)\n\n if (tagsOption) {\n // reduce projectsInfo to get all tags\n const tagsAnatomy = new Map<string, Tag>()\n Object.values(projectsInfo).forEach((project) => {\n if (project?.tags) {\n project.tags.forEach((tag) => {\n if (!tagsAnatomy.has(tag.name)) {\n tagsAnatomy.set(tag.name, tag)\n }\n })\n }\n })\n\n // create options for each tag, finding color if in tagsAnatomy\n const tagOptionValuesMap = new Map<string, Option & { count: number }>()\n data.tags?.forEach((tag) => {\n const existingTag = tagOptionValuesMap.get(tag)\n if (existingTag) {\n // increment count\n existingTag.count++\n return\n } else {\n // create new tag\n const tagData = tagsAnatomy.get(tag)\n\n tagOptionValuesMap.set(tag, {\n id: tag,\n type: 'string',\n label: tag,\n values: [],\n color: tagData?.color || null,\n count: 1,\n })\n }\n })\n\n // convert values map to array and sort based on count\n const tagOptionValues = Array.from(tagOptionValuesMap.values()).sort(\n (a, b) => b.count - a.count,\n )\n\n // add tag options to the tagsOption\n tagsOption.values?.push(...tagOptionValues)\n\n options.push(tagsOption)\n }\n }\n\n // VERSION\n // add version options\n if (scopeFilterTypes.includes('version')) {\n const versionOption = getOptionRoot('version', config, scopePrefix, scopeLabel)\n\n if (versionOption) {\n // add featured version types as options\n FEATURED_VERSION_TYPES.forEach((versionType) => {\n versionOption.values?.push({\n id: versionType.value,\n label: versionType.label,\n icon: versionType.icon,\n })\n })\n\n options.push(versionOption)\n }\n }\n\n // HAS REVIEWABLES\n // add hasReviewables option\n if (scopeFilterTypes.includes('hasReviewables')) {\n const hasReviewablesOption = getOptionRoot('hasReviewables', config, scopePrefix, scopeLabel)\n\n if (hasReviewablesOption) {\n const options_list = [\n {\n id: 'true',\n label: 'Yes',\n values: [],\n icon: 'radio_button_checked',\n },\n {\n id: 'false',\n label: 'No',\n values: [],\n icon: 'radio_button_unchecked',\n },\n ]\n hasReviewablesOption.values?.push(...options_list)\n options.push(hasReviewablesOption)\n }\n }\n\n // ATTRIBUTES\n // dynamically add attributes options\n if (scopeFilterTypes.includes('attributes')) {\n const attributesByScope = attributes.filter((attribute) =>\n attribute.scope?.includes(currentScope),\n )\n // if attributesData is provided, filter out attributes that are not in the attributesData\n const attributesByValues = !isEmpty(data.attributes)\n ? attributesByScope.filter(\n (attribute) => data.attributes && data.attributes[attribute.name],\n )\n : attributesByScope\n\n const attributesWithoutDates = config?.enableRelativeValues\n ? attributesByValues\n : attributesByValues.filter((attribute) => attribute.data.type !== 'datetime')\n\n attributesWithoutDates.forEach((attribute) => {\n const realData = data.attributes && data.attributes[attribute.name]\n const enums = attribute.data.enum\n const type = attribute.data.type\n\n const isListOf = [\n 'list_of_strings',\n 'list_of_integers',\n 'list_of_any',\n 'list_of_submodels',\n ].includes(type || '')\n const isDate = type === 'datetime'\n const enableOperatorChange = isListOf ? config?.enableOperatorChange : false\n const enableRelativeValues = isListOf || isDate ? config?.enableRelativeValues : false\n // for the attribute, get the option root\n const option = getAttributeFieldOptionRoot(\n attribute,\n {\n ...config,\n allowsCustomValues: true,\n enableOperatorChange: enableOperatorChange,\n enableRelativeValues: enableRelativeValues,\n },\n scopePrefix,\n scopeLabel,\n )\n\n const suggestValuesForTypes: AttributeData['type'][] = [\n 'string',\n 'integer',\n 'float',\n 'list_of_strings',\n 'list_of_integers',\n ]\n\n const optionValues: Option[] = []\n\n // if the attribute type is in the suggestValuesForTypes, get the options based on real values\n if (suggestValuesForTypes.includes(type)) {\n const options = getAttributeOptions(realData, enums, type)\n optionValues.push(...options)\n }\n\n // if the attribute type is boolean, add yes/no options\n if (type === 'boolean') {\n const options = [\n {\n id: 'true',\n label: 'Yes',\n values: [],\n icon: 'radio_button_checked',\n },\n {\n id: 'false',\n label: 'No',\n values: [],\n icon: 'radio_button_unchecked',\n },\n ]\n optionValues.push(...options)\n }\n\n // if the attribute type is datetime, add datetime options\n\n if (isDate) {\n optionValues.push(\n ...dateOptions.map((o) => ({\n ...o,\n contentAfter: power ? undefined : <Icon icon=\"bolt\" />,\n })),\n )\n }\n\n // add option to the list of options\n option.values?.push(...optionValues)\n\n // add option to the list of options\n options.push(option)\n })\n }\n }) // End of scopes.forEach loop\n\n // order options by columnOrder\n if (columnOrder) {\n return sortOptionsBasedOnColumns(options, columnOrder)\n } else return options\n}\n\n// HELPER FUNCTIONS\n//\n//\n//\n//\nconst getSubTypes = (\n {\n projectsInfo,\n productTypes,\n }: { projectsInfo: GetProjectsInfoResponse; productTypes: EntityGroup[] },\n type: ScopeType,\n): Option[] => {\n const options: Option[] = []\n if (type === 'product') {\n productTypes.forEach(({ icon, label, value }) => {\n options.push({\n id: value,\n type: 'string',\n label: label || value,\n icon: icon || getEntityTypeIcon('product'),\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n })\n } else if (type === 'task') {\n Object.values(projectsInfo).forEach((project) => {\n // for each project, get all task types and add them to the options (if they don't already exist)\n const taskTypes = project?.taskTypes || []\n taskTypes.forEach((taskType: TaskType) => {\n if (!options.some((option) => option.id === taskType.name)) {\n options.push({\n id: taskType.name,\n type: 'string',\n label: taskType.name,\n icon: taskType.icon,\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n }\n })\n })\n } else if (type === 'folder') {\n Object.values(projectsInfo).forEach((project) => {\n // for each project, get all folder types and add them to the options (if they don't already exist)\n const folderTypes = project?.folderTypes || []\n folderTypes.forEach((folderType: FolderType) => {\n if (!options.some((option) => option.id === folderType.name)) {\n options.push({\n id: folderType.name,\n type: 'string',\n label: folderType.name,\n icon: folderType.icon,\n inverted: false,\n values: [],\n allowsCustomValues: false,\n })\n }\n })\n })\n }\n\n return options\n}\n\nconst getFormattedId = (\n base: string,\n fieldType: FilterFieldType,\n config?: FilterConfig,\n scopePrefix?: string,\n) => {\n const { prefixes, keys } = config || {}\n let result = base\n\n if (keys && fieldType in keys) {\n result = `${keys[fieldType]}`\n } else if (prefixes && fieldType in prefixes) {\n result = `${prefixes[fieldType]}${base}`\n }\n\n // Add scope prefix if provided\n if (scopePrefix) {\n result = `${scopePrefix}_${result}`\n }\n\n return result\n}\n\nconst formatLabel = (baseLabel: string, scopeLabel?: string) =>\n scopeLabel ? `${baseLabel} - ${scopeLabel}` : baseLabel\n\nconst getOptionRoot = (\n fieldType: FilterFieldType,\n config?: FilterConfig,\n scopePrefix?: string,\n scopeLabel?: string,\n) => {\n const getRootIdWithPrefix = (base: string) => getFormattedId(base, fieldType, config, scopePrefix)\n const formatLabelWithScope = (baseLabel: string) => formatLabel(baseLabel, scopeLabel)\n\n let rootOption: Option | null = null\n switch (fieldType) {\n case 'taskType':\n rootOption = {\n id: getRootIdWithPrefix(`taskType`),\n type: 'string',\n label: formatLabelWithScope(`Task Type`),\n icon: getAttributeIcon('task'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'folderType':\n rootOption = {\n id: getRootIdWithPrefix(`folderType`),\n type: 'string',\n label: formatLabelWithScope(`Folder Type`),\n icon: getAttributeIcon('folder'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'productType':\n rootOption = {\n id: getRootIdWithPrefix(`productType`),\n type: 'string',\n label: formatLabelWithScope(`Product Type`),\n icon: getAttributeIcon('product'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'productName':\n rootOption = {\n id: getRootIdWithPrefix(`productNames`),\n type: 'string',\n label: formatLabelWithScope(`Product Name`),\n icon: getAttributeIcon('productName', 'string'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: false,\n operatorChangeable: true,\n }\n break\n case 'status':\n rootOption = {\n id: getRootIdWithPrefix('status'),\n type: 'string',\n label: formatLabelWithScope('Status'),\n icon: getAttributeIcon('status'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n }\n break\n case 'assignees':\n rootOption = {\n id: getRootIdWithPrefix('assignees'),\n type: 'list_of_strings',\n label: formatLabelWithScope('Assignee'),\n icon: getAttributeIcon('assignees'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'author':\n rootOption = {\n id: getRootIdWithPrefix('author'),\n type: 'string',\n label: formatLabelWithScope('Author'),\n icon: getAttributeIcon('author'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'tags':\n rootOption = {\n id: getRootIdWithPrefix('tags'),\n type: 'list_of_strings',\n label: formatLabelWithScope('Tags'),\n icon: getAttributeIcon('tags'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: config?.enableRelativeValues,\n allowNoValue: config?.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n }\n break\n case 'version':\n rootOption = {\n id: getRootIdWithPrefix('version'),\n type: 'string',\n label: formatLabelWithScope('Version'),\n icon: getAttributeIcon('version'),\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: true,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: false,\n operatorChangeable: false,\n }\n break\n case 'hasReviewables':\n rootOption = {\n id: getRootIdWithPrefix('hasReviewables'),\n type: 'boolean',\n label: formatLabelWithScope('Has Reviewables'),\n icon: 'play_circle',\n inverted: false,\n operator: 'OR',\n values: [],\n allowsCustomValues: false,\n allowHasValue: false,\n allowNoValue: false,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: false,\n singleSelect: true,\n }\n break\n default:\n break\n\n // Note: attributes are handled separately\n }\n\n return rootOption\n}\n\nconst getAttributeFieldOptionRoot = (\n attribute: AttributeModel,\n config: FilterConfig & { allowsCustomValues: boolean },\n scopePrefix?: string,\n scopeLabel?: string,\n): Option => ({\n id: getFormattedId(attribute.name, 'attributes', config, scopePrefix),\n type: attribute.data.type,\n label: scopeLabel\n ? formatLabel(attribute.data.title || attribute.name, scopeLabel)\n : attribute.data.title || attribute.name,\n operator: 'OR',\n inverted: false,\n values: [],\n allowsCustomValues: config?.allowsCustomValues,\n allowHasValue: config.enableRelativeValues,\n allowNoValue: config.enableRelativeValues,\n allowExcludes: config?.enableExcludes,\n operatorChangeable: config?.enableOperatorChange,\n icon: getAttributeIcon(attribute.name, attribute.data.type, !!attribute.data.enum?.length),\n singleSelect: ['boolean', 'datetime'].includes(attribute.data.type || ''),\n})\n\nconst getAttributeOptions = (\n values?: AttributeDataValue[],\n enums?: AttributeEnumItem[],\n type?: AttributeData['type'],\n): Option[] => {\n const enumOptions: Option[] = []\n const options: (Option & { count: number })[] = []\n\n // add the enum values first\n if (enums) {\n enums.forEach((enumItem) => {\n enumOptions.push({\n id: enumItem.value.toString(),\n type: type,\n label: enumItem.label,\n values: [],\n icon: enumItem.icon,\n color: enumItem.color,\n })\n })\n }\n\n values?.forEach((value) => {\n // no value? do nothing\n if (!value) return\n\n let text = ''\n\n // convert value to text\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n text = value.toString()\n break\n case 'object':\n if (Array.isArray(value)) {\n text = value.join(', ')\n } else {\n text = JSON.stringify(value)\n }\n break\n default:\n break\n }\n\n // create id for text value\n const id = text\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, '-')\n\n // check if the option already exists in enums\n const existingOption = enumOptions?.find((enumItem) => enumItem.id === id)\n if (existingOption) return\n\n // check if options already has the value, if so, increment the count\n const existingValue = options.find((option) => option.id === id)\n if (existingValue) {\n existingValue.count++\n return\n } else {\n // add option\n options.push({\n id,\n type: type,\n label: text,\n values: [],\n count: 1,\n })\n }\n })\n\n // sort options based on count\n options.sort((a, b) => b.count - a.count)\n\n // enum options first, then the rest\n return [...enumOptions, ...options]\n}\n\nconst sortOptionsBasedOnColumns = (options: Option[], columnOrder: ColumnOrderState) => {\n const columnOrderWithSubTypes = columnOrder.flatMap((col) => {\n if (col === 'subType') {\n return ['taskType', 'folderType']\n }\n return col\n })\n return [...options].sort((a, b) => {\n const aIndex = columnOrderWithSubTypes.indexOf(a.id.replace('.', '_'))\n const bIndex = columnOrderWithSubTypes.indexOf(b.id.replace('.', '_'))\n\n // If both options are in columnOrder, sort them based on their index in columnOrder\n if (aIndex !== -1 && bIndex !== -1) {\n return aIndex - bIndex\n }\n\n // If only one of the options is in columnOrder, sort the one in columnOrder first\n if (aIndex !== -1) {\n return -1\n }\n if (bIndex !== -1) {\n return 1\n }\n\n // If neither option is in columnOrder, keep their original order\n return 0\n })\n}\n\n/**\n * Splits combined filters by their scope and removes the scope prefix from filter IDs.\n * Used to separate multi-scope filters back into individual scope filters.\n *\n * @param combinedFilter - The filter with potentially scope-prefixed IDs\n * @param scopes - Array of scopes to split by\n * @param config - Filter config containing prefixes for field types\n * @param filterIdToScopeMap - Optional mapping of filter IDs (without scope prefix) to their scopes (e.g., { taskType: 'task', folderType: 'folder' })\n * @returns Object with scope-keyed filters (including 'unscoped' for filters that don't match any scope), with prefixes removed from IDs\n *\n * @example\n * // Input: combinedFilter with IDs like \"version_status\", \"folder_status\", \"taskType\"\n * // With filterIdToScopeMap: { taskType: 'task' }\n * // Output: { version: { conditions: [...] }, folder: { conditions: [...] }, task: { conditions: [...] }, unscoped: { conditions: [] } }\n */\nexport const splitFiltersByScope = (\n combinedFilter: Record<string, any> | null,\n scopes: ScopeType[],\n config?: FilterConfig,\n filterIdToScopeMap?: Record<string, ScopeType>,\n): Record<ScopeType | 'unscoped', Record<string, any>> => {\n // Initialize with all scopes having empty conditions, plus unscoped\n const result: Record<ScopeType | 'unscoped', Record<string, any>> = {\n folder: { conditions: [] },\n product: { conditions: [] },\n task: { conditions: [] },\n user: { conditions: [] },\n version: { conditions: [] },\n unscoped: { conditions: [] },\n }\n\n if (!combinedFilter?.conditions || combinedFilter?.conditions.length === 0) {\n return result\n }\n\n // Helper to extract scope prefix from an ID\n const extractScopeAndRemovePrefix = (\n id: string,\n currentConfig?: FilterConfig,\n ): { scope: ScopeType | null; cleanId: string } => {\n // Check if ID starts with any scope prefix\n const scopeMatch = scopes.find((scope) => id.startsWith(`${scope}_`))\n\n if (scopeMatch) {\n // Remove scope prefix\n const cleanId = id.substring(`${scopeMatch}_`.length)\n return { scope: scopeMatch, cleanId }\n }\n\n // If no scope prefix, return null scope (shouldn't happen in multi-scope scenario)\n return { scope: null, cleanId: id }\n }\n\n // Helper to process a filter recursively\n const processConditions = (\n conditions: any[] | undefined,\n targetFilters: Record<ScopeType | 'unscoped', Record<string, any>>,\n ) => {\n if (!conditions || conditions.length === 0) return\n\n conditions.forEach((condition) => {\n // If this is a nested filter\n if ('conditions' in condition && !('key' in condition)) {\n processConditions(condition.conditions, targetFilters)\n } else if ('key' in condition) {\n // This is a QueryCondition\n const { scope, cleanId } = extractScopeAndRemovePrefix(condition.key, config)\n\n if (scope && targetFilters[scope]) {\n // Add the condition with cleaned ID to the appropriate scope\n targetFilters[scope].conditions?.push({\n ...condition,\n key: cleanId,\n })\n } else if (!scope) {\n // No explicit scope prefix found, check filterIdToScopeMap\n const mappedScope = filterIdToScopeMap?.[condition.key]\n\n if (mappedScope && targetFilters[mappedScope]) {\n // Found in the map, add to mapped scope\n targetFilters[mappedScope].conditions?.push(condition)\n } else {\n // Not in map, add to unscoped\n targetFilters['unscoped']?.conditions?.push(condition)\n }\n }\n }\n })\n }\n\n // Process the combined filter\n processConditions(combinedFilter.conditions, result)\n\n return result\n}\n\n/**\n * Splits combined Filter objects by their scope and removes the scope prefix from filter IDs.\n * Used to separate multi-scope Filter arrays back into individual scope Filter arrays.\n * This function works with Filter objects from @ynput/ayon-react-components, not QueryFilter objects.\n *\n * @param filters - Array of Filter objects with potentially scope-prefixed IDs\n * @param scopes - Array of scopes to split by\n * @param filterIdToScopeMap - Optional mapping of filter IDs (without scope prefix) to their scopes (e.g., { taskType: 'task', folderType: 'folder' })\n * @returns Object with scope-keyed Filter arrays (including 'unscoped' for filters that don't match any scope)\n *\n * @example\n * // Input: filters with IDs like \"version_status\", \"folder_status\", \"taskType\"\n * // With filterIdToScopeMap: { taskType: 'task' }\n * // Output: { version: [...], folder: [...], task: [...], product: [...], user: [...], unscoped: [...] }\n */\nexport const splitClientFiltersByScope = (\n filters: (Filter | SliceFilter)[] | null | undefined,\n scopes: ScopeType[],\n filterIdToScopeMap?: Record<string, ScopeType>,\n): Record<ScopeType | 'unscoped', Filter[]> => {\n // Initialize with all scopes having empty arrays, plus unscoped\n const result: Record<ScopeType | 'unscoped', Filter[]> = {\n folder: [],\n product: [],\n task: [],\n user: [],\n version: [],\n unscoped: [],\n }\n\n if (!filters || filters.length === 0) {\n return result\n }\n\n // Helper to extract scope prefix from a filter ID\n const extractScopeFromId = (id: string): ScopeType | null => {\n // Check if ID starts with any scope prefix\n const scopeMatch = scopes.find((scope) => id.startsWith(`${scope}_`))\n return scopeMatch || null\n }\n\n // Helper to remove scope prefix from ID\n const removeScopePrefix = (id: string, scope: ScopeType): string => {\n const prefix = `${scope}_`\n return id.startsWith(prefix) ? id.substring(prefix.length) : id\n }\n\n // Process each filter\n filters.forEach((filter) => {\n if (!filter.id) return\n\n const scope = extractScopeFromId(filter.id)\n\n // If a scope was found, create a new filter without the scope prefix\n if (scope) {\n const cleanedFilter: Filter = {\n ...filter,\n id: removeScopePrefix(filter.id, scope),\n }\n result[scope].push(cleanedFilter)\n } else {\n // No explicit scope prefix found, check filterIdToScopeMap\n const mappedScope = filterIdToScopeMap?.[filter.id]\n\n if (mappedScope) {\n // Found in the map, add to mapped scope\n result[mappedScope].push(filter)\n } else {\n // Not in map, add to unscoped\n result['unscoped'].push(filter)\n }\n }\n })\n\n return result\n}\n"],"names":["useBuildFilterOptions","globalFilterTypes","projectNames","scope","customScopes","data","config","columnOrder","power","options","scopesWithTypes","s","isMultiScope","anyNeedsEntitySubType","type","anyNeedsUsers","fieldInScopes","field","productTypes","useGetEntityGroupsQuery","projectsInfo","useGetProjectsInfoQuery","projectUsers","useGetKanbanProjectUsersQuery","attributes","useGlobalContext","getScopeLabel","currentScope","scopeFilterTypes","scopePrefix","scopeLabel","entitySubTypeOption","getOptionRoot","subTypes","getSubTypes","_a","_b","_c","productNameOption","_d","name","value","statusOption","project","status","assigneesOption","user","_e","a","b","aCount","assignee","authorOption","tagsOption","tagsAnatomy","tag","tagOptionValuesMap","_f","existingTag","tagData","tagOptionValues","_g","versionOption","FEATURED_VERSION_TYPES","versionType","hasReviewablesOption","options_list","_h","attributesByScope","attribute","attributesByValues","isEmpty","realData","enums","isListOf","isDate","enableOperatorChange","enableRelativeValues","option","getAttributeFieldOptionRoot","suggestValuesForTypes","optionValues","getAttributeOptions","dateOptions","o","jsx","Icon","sortOptionsBasedOnColumns","icon","label","getEntityTypeIcon","taskType","folderType","getFormattedId","base","fieldType","prefixes","keys","result","formatLabel","baseLabel","getRootIdWithPrefix","formatLabelWithScope","rootOption","getAttributeIcon","values","enumOptions","enumItem","text","id","existingValue","columnOrderWithSubTypes","col","aIndex","bIndex","splitFiltersByScope","combinedFilter","scopes","filterIdToScopeMap","extractScopeAndRemovePrefix","currentConfig","scopeMatch","cleanId","processConditions","conditions","targetFilters","condition","mappedScope","splitClientFiltersByScope","filters","extractScopeFromId","removeScopePrefix","prefix","filter","cleanedFilter"],"mappings":"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"}