@ynput/ayon-frontend-shared 0.2.18 → 0.2.19

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 (312) hide show
  1. package/dist/DetailsPanel.cjs.js +6 -6
  2. package/dist/DetailsPanel.es.js +7 -7
  3. package/dist/DetailsPanel.es.js.map +1 -1
  4. package/dist/ProjectTreeTable.cjs.js +6 -0
  5. package/dist/ProjectTreeTable.cjs.js.map +1 -1
  6. package/dist/ProjectTreeTable.es.js +6 -0
  7. package/dist/ProjectTreeTable.es.js.map +1 -1
  8. package/dist/api.cjs.js +6 -0
  9. package/dist/api.cjs.js.map +1 -1
  10. package/dist/api.es.js +10 -4
  11. package/dist/index.cjs.js +6 -5
  12. package/dist/index.cjs.js.map +1 -1
  13. package/dist/index.es.js +6 -5
  14. package/dist/index.es.js.map +1 -1
  15. package/dist/shared/src/api/generated/folders.cjs.js.map +1 -1
  16. package/dist/shared/src/api/generated/folders.es.js.map +1 -1
  17. package/dist/shared/src/api/generated/graphql.cjs.js +38 -0
  18. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  19. package/dist/shared/src/api/generated/graphql.es.js +38 -0
  20. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  21. package/dist/shared/src/api/queries/actions/getActions.cjs.js +9 -1
  22. package/dist/shared/src/api/queries/actions/getActions.cjs.js.map +1 -1
  23. package/dist/shared/src/api/queries/actions/getActions.es.js +9 -1
  24. package/dist/shared/src/api/queries/actions/getActions.es.js.map +1 -1
  25. package/dist/shared/src/api/queries/entities/getEntityPanel.cjs.js +2 -1
  26. package/dist/shared/src/api/queries/entities/getEntityPanel.cjs.js.map +1 -1
  27. package/dist/shared/src/api/queries/entities/getEntityPanel.es.js +2 -1
  28. package/dist/shared/src/api/queries/entities/getEntityPanel.es.js.map +1 -1
  29. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js +12 -8
  30. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js.map +1 -1
  31. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js +12 -8
  32. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js.map +1 -1
  33. package/dist/shared/src/api/queries/entityLists/getLists.cjs.js +67 -0
  34. package/dist/shared/src/api/queries/entityLists/getLists.cjs.js.map +1 -1
  35. package/dist/shared/src/api/queries/entityLists/getLists.es.js +68 -1
  36. package/dist/shared/src/api/queries/entityLists/getLists.es.js.map +1 -1
  37. package/dist/shared/src/api/queries/entityLists/updateLists.cjs.js +19 -3
  38. package/dist/shared/src/api/queries/entityLists/updateLists.cjs.js.map +1 -1
  39. package/dist/shared/src/api/queries/entityLists/updateLists.es.js +19 -3
  40. package/dist/shared/src/api/queries/entityLists/updateLists.es.js.map +1 -1
  41. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js +13 -0
  42. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js.map +1 -1
  43. package/dist/shared/src/api/queries/overview/updateOverview.es.js +13 -0
  44. package/dist/shared/src/api/queries/overview/updateOverview.es.js.map +1 -1
  45. package/dist/shared/src/api/queries/users/getUsers.cjs.js +2 -0
  46. package/dist/shared/src/api/queries/users/getUsers.cjs.js.map +1 -1
  47. package/dist/shared/src/api/queries/users/getUsers.es.js +2 -0
  48. package/dist/shared/src/api/queries/users/getUsers.es.js.map +1 -1
  49. package/dist/shared/src/api/queries/versions/updateVersions.cjs.js +3 -1
  50. package/dist/shared/src/api/queries/versions/updateVersions.cjs.js.map +1 -1
  51. package/dist/shared/src/api/queries/versions/updateVersions.es.js +3 -1
  52. package/dist/shared/src/api/queries/versions/updateVersions.es.js.map +1 -1
  53. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js +5 -5
  54. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js.map +1 -1
  55. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js +5 -5
  56. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js.map +1 -1
  57. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js +1 -1
  58. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js.map +1 -1
  59. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.es.js +1 -1
  60. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.es.js.map +1 -1
  61. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +2 -2
  62. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
  63. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +2 -2
  64. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
  65. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js +15 -14
  66. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js.map +1 -1
  67. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js +15 -14
  68. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js.map +1 -1
  69. package/dist/shared/src/components/PlayableIcon/PlayableIcon.cjs.js +43 -0
  70. package/dist/shared/src/components/PlayableIcon/PlayableIcon.cjs.js.map +1 -0
  71. package/dist/shared/src/components/PlayableIcon/PlayableIcon.es.js +43 -0
  72. package/dist/shared/src/components/PlayableIcon/PlayableIcon.es.js.map +1 -0
  73. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.cjs.js +1 -1
  74. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.cjs.js.map +1 -1
  75. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.es.js +1 -1
  76. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.es.js.map +1 -1
  77. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +15 -15
  78. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +15 -15
  79. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +6 -5
  80. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
  81. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +6 -5
  82. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
  83. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +6 -5
  84. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
  85. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +6 -5
  86. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
  87. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +6 -5
  88. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
  89. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +6 -5
  90. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
  91. package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.cjs.js +2 -2
  92. package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.cjs.js.map +1 -1
  93. package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.es.js +2 -2
  94. package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.es.js.map +1 -1
  95. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +6 -5
  96. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
  97. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +6 -5
  98. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
  99. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js +6 -5
  100. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js.map +1 -1
  101. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js +6 -5
  102. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js.map +1 -1
  103. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +6 -5
  104. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
  105. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +6 -5
  106. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
  107. package/dist/shared/src/containers/Actions/Actions.cjs.js +8 -2
  108. package/dist/shared/src/containers/Actions/Actions.cjs.js.map +1 -1
  109. package/dist/shared/src/containers/Actions/Actions.es.js +8 -2
  110. package/dist/shared/src/containers/Actions/Actions.es.js.map +1 -1
  111. package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.cjs.js +10 -3
  112. package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.cjs.js.map +1 -1
  113. package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.es.js +10 -3
  114. package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.es.js.map +1 -1
  115. package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.cjs.js +14 -0
  116. package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.cjs.js.map +1 -1
  117. package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.es.js +14 -0
  118. package/dist/shared/src/containers/Actions/ActionsDropdown/ActionsDropdown.styled.es.js.map +1 -1
  119. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +6 -5
  120. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
  121. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +6 -5
  122. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
  123. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +5 -5
  124. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +5 -5
  125. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +6 -5
  126. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
  127. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +6 -5
  128. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
  129. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +6 -5
  130. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
  131. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +6 -5
  132. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
  133. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +6 -4
  134. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
  135. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +7 -5
  136. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
  137. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js +1 -31
  138. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js.map +1 -1
  139. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js +1 -31
  140. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js.map +1 -1
  141. package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.cjs.js +2 -2
  142. package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.cjs.js.map +1 -1
  143. package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.es.js +2 -2
  144. package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.es.js.map +1 -1
  145. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js +1 -1
  146. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js.map +1 -1
  147. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.es.js +1 -1
  148. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.es.js.map +1 -1
  149. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +48 -4
  150. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  151. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +50 -6
  152. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  153. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +47 -11
  154. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  155. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +47 -11
  156. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  157. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +5 -4
  158. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
  159. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +5 -4
  160. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
  161. package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.cjs.js +5 -3
  162. package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.cjs.js.map +1 -1
  163. package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.es.js +5 -3
  164. package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.es.js.map +1 -1
  165. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingContext.cjs.js +106 -2
  166. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingContext.cjs.js.map +1 -1
  167. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingContext.es.js +106 -2
  168. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingContext.es.js.map +1 -1
  169. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js +14 -2
  170. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js.map +1 -1
  171. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js +14 -2
  172. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js.map +1 -1
  173. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js.map +1 -1
  174. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js.map +1 -1
  175. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js +15 -3
  176. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js.map +1 -1
  177. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js +15 -3
  178. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js.map +1 -1
  179. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js +106 -0
  180. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js.map +1 -1
  181. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js +106 -0
  182. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js.map +1 -1
  183. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js +4 -2
  184. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -1
  185. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js +4 -2
  186. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -1
  187. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js +26 -4
  188. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js.map +1 -1
  189. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js +26 -4
  190. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js.map +1 -1
  191. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js +135 -0
  192. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js.map +1 -0
  193. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js +135 -0
  194. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js.map +1 -0
  195. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.cjs.js +8 -6
  196. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.cjs.js.map +1 -1
  197. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.es.js +8 -6
  198. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.es.js.map +1 -1
  199. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.cjs.js +1 -2
  200. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.cjs.js.map +1 -1
  201. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.es.js +1 -2
  202. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.es.js.map +1 -1
  203. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js +88 -0
  204. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js.map +1 -1
  205. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js +88 -0
  206. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js.map +1 -1
  207. package/dist/shared/src/containers/ProjectTreeTable/hooks/useHistory.cjs.js +1 -1
  208. package/dist/shared/src/containers/ProjectTreeTable/hooks/useHistory.cjs.js.map +1 -1
  209. package/dist/shared/src/containers/ProjectTreeTable/hooks/useHistory.es.js +1 -1
  210. package/dist/shared/src/containers/ProjectTreeTable/hooks/useHistory.es.js.map +1 -1
  211. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js +35 -4
  212. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js.map +1 -1
  213. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js +35 -4
  214. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js.map +1 -1
  215. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +88 -0
  216. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
  217. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +88 -0
  218. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
  219. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js +1 -1
  220. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js.map +1 -1
  221. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js +1 -1
  222. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js.map +1 -1
  223. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js +90 -0
  224. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js.map +1 -1
  225. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js +90 -0
  226. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js.map +1 -1
  227. package/dist/shared/src/containers/ProjectTreeTable/utils/getEntityViewerIds.cjs.js +19 -0
  228. package/dist/shared/src/containers/ProjectTreeTable/utils/getEntityViewerIds.cjs.js.map +1 -0
  229. package/dist/shared/src/containers/ProjectTreeTable/utils/getEntityViewerIds.es.js +19 -0
  230. package/dist/shared/src/containers/ProjectTreeTable/utils/getEntityViewerIds.es.js.map +1 -0
  231. package/dist/shared/src/containers/ProjectTreeTable/utils/getTypeDefaultValue.cjs.js +26 -0
  232. package/dist/shared/src/containers/ProjectTreeTable/utils/getTypeDefaultValue.cjs.js.map +1 -0
  233. package/dist/shared/src/containers/ProjectTreeTable/utils/getTypeDefaultValue.es.js +26 -0
  234. package/dist/shared/src/containers/ProjectTreeTable/utils/getTypeDefaultValue.es.js.map +1 -0
  235. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +9 -8
  236. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
  237. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +10 -9
  238. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
  239. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +8 -2
  240. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
  241. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +8 -2
  242. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
  243. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js +190 -0
  244. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.cjs.js.map +1 -0
  245. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js +190 -0
  246. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumCellValue.es.js.map +1 -0
  247. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js +4 -147
  248. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.cjs.js.map +1 -1
  249. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js +2 -145
  250. package/dist/shared/src/containers/ProjectTreeTable/widgets/EnumWidget.es.js.map +1 -1
  251. package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.cjs.js +12 -2
  252. package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.cjs.js.map +1 -1
  253. package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.es.js +12 -2
  254. package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.es.js.map +1 -1
  255. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +6 -5
  256. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
  257. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +6 -5
  258. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
  259. package/dist/shared/src/context/DetailsPanelContext.cjs.js +5 -1
  260. package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
  261. package/dist/shared/src/context/DetailsPanelContext.es.js +5 -1
  262. package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
  263. package/dist/shared/src/util/confirmDelete.cjs.js +1 -0
  264. package/dist/shared/src/util/confirmDelete.cjs.js.map +1 -1
  265. package/dist/shared/src/util/confirmDelete.es.js +2 -0
  266. package/dist/shared/src/util/confirmDelete.es.js.map +1 -1
  267. package/dist/types/SimpleTable/SimpleTable.d.ts +1 -0
  268. package/dist/types/SimpleTable/SimpleTableRowTemplate.d.ts +1 -1
  269. package/dist/types/SimpleTable/context/SimpleTableContext.d.ts +5 -1
  270. package/dist/types/api/generated/folders.d.ts +1 -0
  271. package/dist/types/api/generated/graphql.d.ts +66 -5
  272. package/dist/types/api/queries/actions/getActions.d.ts +132 -1
  273. package/dist/types/api/queries/activities/getActivities.d.ts +6 -0
  274. package/dist/types/api/queries/activities/updateActivities.d.ts +12 -0
  275. package/dist/types/api/queries/entities/getEntity.d.ts +6 -0
  276. package/dist/types/api/queries/entities/getEntityPanel.d.ts +6 -0
  277. package/dist/types/api/queries/entities/transformDetailsPanelData.d.ts +1 -0
  278. package/dist/types/api/queries/entities/updateEntity.d.ts +6 -0
  279. package/dist/types/api/queries/entityLists/getLists.d.ts +1517 -2
  280. package/dist/types/api/queries/entityLists/types.d.ts +30 -1
  281. package/dist/types/api/queries/entityLists/updateLists.d.ts +166 -3
  282. package/dist/types/api/queries/overview/getOverview.d.ts +6 -0
  283. package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +6 -0
  284. package/dist/types/api/queries/users/getUsers.d.ts +6 -0
  285. package/dist/types/components/PlayableIcon/PlayableIcon.d.ts +4 -0
  286. package/dist/types/containers/Actions/Actions.d.ts +7 -1
  287. package/dist/types/containers/Actions/ActionsDropdown/ActionsDropdown.d.ts +5 -3
  288. package/dist/types/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.d.ts +0 -1
  289. package/dist/types/containers/ProjectTreeTable/ProjectTreeTable.d.ts +6 -2
  290. package/dist/types/containers/ProjectTreeTable/context/ProjectTableContext.d.ts +4 -1
  291. package/dist/types/containers/ProjectTreeTable/context/ProjectTableProvider.d.ts +11 -2
  292. package/dist/types/containers/ProjectTreeTable/hooks/index.d.ts +1 -0
  293. package/dist/types/containers/ProjectTreeTable/hooks/useCellContextMenu.d.ts +1 -1
  294. package/dist/types/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.d.ts +9 -0
  295. package/dist/types/containers/ProjectTreeTable/hooks/useFolderRelationships.d.ts +2 -2
  296. package/dist/types/containers/ProjectTreeTable/hooks/useKeyboardNavigation.d.ts +3 -3
  297. package/dist/types/containers/ProjectTreeTable/hooks/useUpdateTableData.d.ts +1 -1
  298. package/dist/types/containers/ProjectTreeTable/types/table.d.ts +10 -1
  299. package/dist/types/containers/ProjectTreeTable/utils/getEntityViewerIds.d.ts +4 -0
  300. package/dist/types/containers/ProjectTreeTable/utils/getTypeDefaultValue.d.ts +2 -0
  301. package/dist/types/containers/ProjectTreeTable/utils/index.d.ts +2 -0
  302. package/dist/types/containers/ProjectTreeTable/widgets/CellWidget.d.ts +2 -1
  303. package/dist/types/containers/ProjectTreeTable/widgets/EnumCellValue.d.ts +20 -0
  304. package/dist/types/containers/ProjectTreeTable/widgets/EnumWidget.d.ts +1 -11
  305. package/dist/types/containers/ProjectTreeTable/widgets/ThumbnailWidget.d.ts +1 -0
  306. package/dist/types/context/DetailsPanelContext.d.ts +1 -0
  307. package/dist/types/util/confirmDelete.d.ts +2 -1
  308. package/dist/util.cjs.js +2 -0
  309. package/dist/util.cjs.js.map +1 -1
  310. package/dist/util.es.js +2 -0
  311. package/dist/util.es.js.map +1 -1
  312. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"UploadVersionForm.cjs.js","sources":["../../../../../../src/components/VersionUploader/components/UploadVersionForm.tsx"],"sourcesContent":["import { FC, FormEvent, useEffect, useRef } from 'react'\nimport styled from 'styled-components'\nimport { FormLayout, FormRow, InputText, InputNumber, Dropdown } from '@ynput/ayon-react-components'\nimport { productTypes } from '@shared/util'\nimport type { DropdownRef } from '@ynput/ayon-react-components'\nimport { ReviewableUpload } from '@shared/components'\nimport { useVersionUploadContext } from '../context/VersionUploadContext'\n\nconst StyledForm = styled.form`\n display: flex;\n flex-direction: column;\n gap: var(--base-gap-large);\n padding: var(--padding-m);\n width: 100%;\n`\n\nconst StyledFormLayout = styled(FormLayout)`\n width: 100%;\n margin: auto;\n\n & > div {\n align-items: start;\n }\n\n input {\n width: 100%;\n }\n`\n\nconst RecommendationNote = styled.div`\n font-size: var(--font-size-xs);\n color: var(--md-sys-color-outline);\n margin-top: var(--base-gap-small);\n line-height: 1.3;\n`\n\nconst InlineButton = styled.button`\n background: none;\n border: none;\n color: var(--md-sys-color-primary);\n text-decoration: underline;\n cursor: pointer;\n padding: 0;\n font-size: inherit;\n font-family: inherit;\n\n &:hover {\n color: var(--md-sys-color-primary-dark);\n }\n`\n\nconst StyledUpload = styled.div`\n position: relative;\n min-height: 80px;\n`\n\ntype FormData = {\n version: number\n name: string\n productType: string\n}\n\ninterface UploadVersionFormProps {\n formData: FormData\n onChange: (key: keyof FormData, value: string | number) => void\n onSubmit: (formData: FormData) => void\n hidden?: (keyof FormData)[]\n projectName: string\n minVersion?: number\n versionId?: string | null\n productId?: string | null\n}\n\nexport const UploadVersionForm: FC<UploadVersionFormProps> = ({\n formData,\n onChange,\n onSubmit,\n hidden = [],\n projectName,\n minVersion = 1,\n versionId,\n productId,\n}) => {\n const previousProductTypeRef = useRef<string>(formData.productType)\n const dropdownRef = useRef<DropdownRef>(null)\n const formRef = useRef<HTMLFormElement>(null)\n const {\n pendingFiles,\n setPendingFiles,\n onCloseVersionUpload,\n extractAndSetVersionFromFiles,\n dispatch,\n } = useVersionUploadContext()\n\n const productTypeOptions = Object.entries(productTypes).map(([key, value]) => ({\n value: key,\n label: value.name,\n icon: value.icon,\n }))\n\n useEffect(() => {\n // Check if the current name starts with the previous product type name\n const previousProductType = previousProductTypeRef.current\n const previousProductTypeName = productTypes[previousProductType]?.name || ''\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n\n // Only sync if the product type actually changed\n if (formData.productType !== previousProductType && previousProductTypeName) {\n // Check if the current name starts with the previous product type name\n if (formData.name.startsWith(previousProductTypeName)) {\n // Extract the suffix after the previous product type name\n const suffix = formData.name.slice(previousProductTypeName.length)\n // Create the new name with the current product type + suffix\n const newName = currentProductTypeName + suffix\n onChange('name', newName)\n }\n }\n\n // Update the ref to the current product type\n previousProductTypeRef.current = formData.productType\n }, [formData.productType, formData.name, onChange])\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n // @ts-expect-error - submitter is not defined in the type\n const submitter = e.nativeEvent.submitter as HTMLButtonElement | null\n // if the submitter is a button, check it's parent does not have the dropdown class\n if (submitter && submitter.closest('.dropdown')) {\n // if the submitter is a button inside a dropdown, do not submit the form\n return\n }\n\n onSubmit(formData)\n }\n\n const handleVersionChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(e.target.value, 10)\n if (!isNaN(value)) {\n onChange('version', value)\n }\n }\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange('name', e.target.value)\n }\n\n const handleProductTypeChange = (value: string[]) => {\n if (value.length > 0) {\n onChange('productType', value[0])\n // focus the name input after changing product type\n }\n }\n\n const handleApplyPrefix = () => {\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n const currentName = formData.name || ''\n\n // Capitalize the first letter of the existing name for camelCase\n const capitalizedName = currentName.charAt(0).toUpperCase() + currentName.slice(1)\n const newName = currentProductTypeName + capitalizedName\n onChange('name', newName)\n }\n\n const shouldShowRecommendation = () => {\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n return formData.name && !formData.name.startsWith(currentProductTypeName)\n }\n\n // Disable form fields if version has been created\n const isFormSubmitted = Boolean(versionId)\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLFormElement>) => {\n // Submit form on Cmd/Ctrl + Enter\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n onSubmit(formData)\n return\n }\n }\n\n return (\n <StyledForm\n id=\"upload-version-form\"\n ref={formRef}\n onSubmit={handleSubmit}\n noValidate\n onKeyDown={handleKeyDown}\n >\n <StyledFormLayout>\n {!hidden.includes('productType') && (\n <FormRow label=\"Product Type\">\n <Dropdown\n ref={dropdownRef}\n options={productTypeOptions}\n value={[formData.productType]}\n onChange={handleProductTypeChange}\n widthExpand\n multiSelect={false}\n aria-label=\"Product Type\"\n search\n disabled={isFormSubmitted}\n />\n </FormRow>\n )}\n\n {!hidden.includes('name') && (\n <FormRow label=\"Product Name\">\n <div>\n <InputText\n value={formData.name}\n onChange={handleNameChange}\n placeholder=\"Enter product name\"\n minLength={1}\n autoFocus\n aria-label=\"Product Name\"\n aria-describedby={shouldShowRecommendation() ? 'name-recommendation' : undefined}\n disabled={isFormSubmitted}\n />\n {shouldShowRecommendation() && (\n <RecommendationNote id=\"name-recommendation\">\n We recommend prefixing with \"{productTypes[formData.productType]?.name}\".{' '}\n <InlineButton type=\"button\" onClick={handleApplyPrefix}>\n Apply prefix\n </InlineButton>\n </RecommendationNote>\n )}\n </div>\n </FormRow>\n )}\n\n {!hidden.includes('version') && (\n <FormRow label=\"Version\">\n <InputNumber\n value={formData.version}\n onChange={handleVersionChange}\n min={minVersion}\n step={1}\n aria-label=\"Version Number\"\n autoFocus={hidden.includes('name')}\n disabled={isFormSubmitted}\n />\n </FormRow>\n )}\n </StyledFormLayout>\n\n <FormRow label=\"Reviewable files\" />\n <StyledUpload>\n <ReviewableUpload\n projectName={projectName}\n versionId={versionId}\n productId={productId}\n dispatch={dispatch}\n pendingFiles={pendingFiles}\n setPendingFiles={setPendingFiles}\n onUpload={onCloseVersionUpload}\n onFilesAdded={extractAndSetVersionFromFiles}\n pt={{\n upload: {\n style: { minHeight: 80 },\n },\n dropzone: {\n style: { inset: 0 },\n },\n }}\n />\n </StyledUpload>\n </StyledForm>\n )\n}\n"],"names":["FormLayout","useRef","useVersionUploadContext","useEffect","_a","jsxs","jsx","FormRow","Dropdown","InputText","InputNumber","ReviewableUpload"],"mappings":"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"}
1
+ {"version":3,"file":"UploadVersionForm.cjs.js","sources":["../../../../../../src/components/VersionUploader/components/UploadVersionForm.tsx"],"sourcesContent":["import { FC, FormEvent, useEffect, useRef } from 'react'\nimport styled from 'styled-components'\nimport { FormLayout, FormRow, InputText, InputNumber, Dropdown } from '@ynput/ayon-react-components'\nimport { productTypes } from '@shared/util'\nimport type { DropdownRef } from '@ynput/ayon-react-components'\nimport { ReviewableUpload } from '@shared/components'\nimport { useVersionUploadContext } from '../context/VersionUploadContext'\n\nconst StyledForm = styled.form`\n display: flex;\n flex-direction: column;\n gap: var(--base-gap-large);\n padding: var(--padding-m);\n width: 100%;\n`\n\nconst StyledFormLayout = styled(FormLayout)`\n width: 100%;\n margin: auto;\n\n & > div {\n align-items: start;\n }\n\n input {\n width: 100%;\n }\n`\n\nconst RecommendationNote = styled.div`\n font-size: var(--font-size-xs);\n color: var(--md-sys-color-outline);\n margin-top: var(--base-gap-small);\n line-height: 1.3;\n`\n\nconst InlineButton = styled.button`\n background: none;\n border: none;\n color: var(--md-sys-color-primary);\n text-decoration: underline;\n cursor: pointer;\n padding: 0;\n font-size: inherit;\n font-family: inherit;\n\n &:hover {\n color: var(--md-sys-color-primary-dark);\n }\n`\n\nconst StyledUpload = styled.div`\n position: relative;\n min-height: 80px;\n`\n\ntype FormData = {\n version: number\n name: string\n productType: string\n}\n\ninterface UploadVersionFormProps {\n formData: FormData\n onChange: (key: keyof FormData, value: string | number) => void\n onSubmit: (formData: FormData) => void\n hidden?: (keyof FormData)[]\n projectName: string\n minVersion?: number\n versionId?: string | null\n productId?: string | null\n}\n\nexport const UploadVersionForm: FC<UploadVersionFormProps> = ({\n formData,\n onChange,\n onSubmit,\n hidden = [],\n projectName,\n minVersion = 1,\n versionId,\n productId,\n}) => {\n const previousProductTypeRef = useRef<string>(formData.productType)\n const dropdownRef = useRef<DropdownRef>(null)\n const formRef = useRef<HTMLFormElement>(null)\n const {\n pendingFiles,\n setPendingFiles,\n onCloseVersionUpload,\n extractAndSetVersionFromFiles,\n dispatch,\n } = useVersionUploadContext()\n\n const productTypeOptions = Object.entries(productTypes).map(([key, value]) => ({\n value: key,\n label: value.name,\n icon: value.icon,\n }))\n\n useEffect(() => {\n // Check if the current name starts with the previous product type name\n const previousProductType = previousProductTypeRef.current\n const previousProductTypeName = productTypes[previousProductType]?.name || ''\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n\n // Only sync if the product type actually changed\n if (formData.productType !== previousProductType && previousProductTypeName) {\n // Check if the current name starts with the previous product type name\n if (formData.name.startsWith(previousProductTypeName)) {\n // Extract the suffix after the previous product type name\n const suffix = formData.name.slice(previousProductTypeName.length)\n // Create the new name with the current product type + suffix\n const newName = currentProductTypeName + suffix\n onChange('name', newName)\n }\n }\n\n // Update the ref to the current product type\n previousProductTypeRef.current = formData.productType\n }, [formData.productType, formData.name, onChange])\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n // @ts-expect-error - submitter is not defined in the type\n const submitter = e.nativeEvent.submitter as HTMLButtonElement | null\n // if the submitter is a button, check it's parent does not have the dropdown class\n if (submitter && submitter.closest('.dropdown')) {\n // if the submitter is a button inside a dropdown, do not submit the form\n return\n }\n\n onSubmit(formData)\n }\n\n const handleVersionChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(e.target.value, 10)\n if (!isNaN(value)) {\n onChange('version', value)\n }\n }\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange('name', e.target.value)\n }\n\n const handleProductTypeChange = (value: string[]) => {\n if (value.length > 0) {\n onChange('productType', value[0])\n // focus the name input after changing product type\n }\n }\n\n const handleApplyPrefix = () => {\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n const currentName = formData.name || ''\n\n // Capitalize the first letter of the existing name for camelCase\n const capitalizedName = currentName.charAt(0).toUpperCase() + currentName.slice(1)\n const newName = currentProductTypeName + capitalizedName\n onChange('name', newName)\n }\n\n const shouldShowRecommendation = () => {\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n return formData.name && !formData.name.startsWith(currentProductTypeName)\n }\n\n // Disable form fields if version has been created\n const isFormSubmitted = Boolean(versionId)\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLFormElement>) => {\n // Submit form on Cmd/Ctrl + Enter\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n onSubmit(formData)\n return\n }\n }\n\n return (\n <StyledForm\n id=\"upload-version-form\"\n ref={formRef}\n onSubmit={handleSubmit}\n noValidate\n onKeyDown={handleKeyDown}\n >\n <StyledFormLayout>\n {!hidden.includes('productType') && (\n <FormRow label=\"Product Type\">\n <Dropdown\n ref={dropdownRef}\n options={productTypeOptions}\n value={[formData.productType]}\n onChange={handleProductTypeChange}\n widthExpand\n multiSelect={false}\n aria-label=\"Product Type\"\n search\n disabled={isFormSubmitted}\n />\n </FormRow>\n )}\n\n {!hidden.includes('name') && (\n <FormRow label=\"Product Name\">\n <div>\n <InputText\n value={formData.name}\n onChange={handleNameChange}\n placeholder=\"Enter product name\"\n minLength={1}\n autoFocus\n aria-label=\"Product Name\"\n aria-describedby={shouldShowRecommendation() ? 'name-recommendation' : undefined}\n disabled={isFormSubmitted}\n />\n {shouldShowRecommendation() && (\n <RecommendationNote id=\"name-recommendation\">\n We recommend prefixing with \"{productTypes[formData.productType]?.name}\".{' '}\n <InlineButton type=\"button\" onClick={handleApplyPrefix}>\n Apply prefix\n </InlineButton>\n </RecommendationNote>\n )}\n </div>\n </FormRow>\n )}\n\n {!hidden.includes('version') && (\n <FormRow label=\"Version\">\n <InputNumber\n value={formData.version}\n onChange={handleVersionChange}\n min={minVersion}\n step={1}\n aria-label=\"Version Number\"\n autoFocus={hidden.includes('name')}\n disabled={isFormSubmitted}\n />\n </FormRow>\n )}\n </StyledFormLayout>\n\n <FormRow label=\"Reviewable files\" />\n <StyledUpload>\n <ReviewableUpload\n projectName={projectName}\n versionId={versionId}\n productId={productId}\n dispatch={dispatch}\n pendingFiles={pendingFiles}\n setPendingFiles={setPendingFiles}\n onUpload={onCloseVersionUpload}\n onFilesAdded={extractAndSetVersionFromFiles}\n pt={{\n upload: {\n style: { minHeight: 80 },\n },\n dropzone: {\n style: { inset: 0 },\n },\n }}\n />\n </StyledUpload>\n </StyledForm>\n )\n}\n"],"names":["FormLayout","useRef","useVersionUploadContext","useEffect","_a","jsxs","jsx","FormRow","Dropdown","InputText","InputNumber","ReviewableUpload"],"mappings":"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"}
@@ -138,6 +138,11 @@ import "../../../containers/ProjectTreeTable/context/ColumnSettingsContext.es.js
138
138
  import "../../../containers/ProjectTreeTable/context/ProjectTableContext.es.js";
139
139
  import "../../../containers/ProjectTreeTable/context/ProjectTableQueriesContext.es.js";
140
140
  import "../../../containers/ProjectTreeTable/context/SelectedRowsContext.es.js";
141
+ import "../../../../../_virtual/runtime.es.js";
142
+ import "../../../../../_virtual/semver.es.js";
143
+ import "react-redux";
144
+ import "custom-protocol-check";
145
+ import "../../../containers/ProjectTreeTable/components/GroupSettingsFallback.es.js";
141
146
  import "../../../containers/ProjectTreeTable/context/ProjectDataContext.es.js";
142
147
  import "../../../containers/ProjectTreeTable/widgets/CollapsedWidget.es.js";
143
148
  import "../../../containers/ProjectTreeTable/widgets/DateWidget.es.js";
@@ -152,14 +157,10 @@ import "../../../containers/ProjectTreeTable/ProjectTreeTable.styled.es.js";
152
157
  import "../../../containers/ProjectTreeTable/components/SelectionCell.es.js";
153
158
  import "../../../containers/ProjectTreeTable/components/RowSelectionHeader.es.js";
154
159
  import "../../../containers/ProjectTreeTable/widgets/LoadMoreWidget.es.js";
155
- import "../../../../../_virtual/runtime.es.js";
156
- import "../../../../../_virtual/semver.es.js";
157
- import "react-redux";
158
- import "custom-protocol-check";
159
- import "../../../containers/ProjectTreeTable/components/GroupSettingsFallback.es.js";
160
160
  import "../../../containers/DetailsPanel/DetailsPanel.styled.es.js";
161
161
  import "../../../containers/DetailsPanel/FeedFilters/FeedFilters.styled.es.js";
162
162
  import "../../../containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js";
163
+ import "../../PlayableIcon/PlayableIcon.es.js";
163
164
  import "../../../containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js";
164
165
  import "../../../containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.es.js";
165
166
  import "../../../containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.styled.es.js";
@@ -1 +1 @@
1
- {"version":3,"file":"UploadVersionForm.es.js","sources":["../../../../../../src/components/VersionUploader/components/UploadVersionForm.tsx"],"sourcesContent":["import { FC, FormEvent, useEffect, useRef } from 'react'\nimport styled from 'styled-components'\nimport { FormLayout, FormRow, InputText, InputNumber, Dropdown } from '@ynput/ayon-react-components'\nimport { productTypes } from '@shared/util'\nimport type { DropdownRef } from '@ynput/ayon-react-components'\nimport { ReviewableUpload } from '@shared/components'\nimport { useVersionUploadContext } from '../context/VersionUploadContext'\n\nconst StyledForm = styled.form`\n display: flex;\n flex-direction: column;\n gap: var(--base-gap-large);\n padding: var(--padding-m);\n width: 100%;\n`\n\nconst StyledFormLayout = styled(FormLayout)`\n width: 100%;\n margin: auto;\n\n & > div {\n align-items: start;\n }\n\n input {\n width: 100%;\n }\n`\n\nconst RecommendationNote = styled.div`\n font-size: var(--font-size-xs);\n color: var(--md-sys-color-outline);\n margin-top: var(--base-gap-small);\n line-height: 1.3;\n`\n\nconst InlineButton = styled.button`\n background: none;\n border: none;\n color: var(--md-sys-color-primary);\n text-decoration: underline;\n cursor: pointer;\n padding: 0;\n font-size: inherit;\n font-family: inherit;\n\n &:hover {\n color: var(--md-sys-color-primary-dark);\n }\n`\n\nconst StyledUpload = styled.div`\n position: relative;\n min-height: 80px;\n`\n\ntype FormData = {\n version: number\n name: string\n productType: string\n}\n\ninterface UploadVersionFormProps {\n formData: FormData\n onChange: (key: keyof FormData, value: string | number) => void\n onSubmit: (formData: FormData) => void\n hidden?: (keyof FormData)[]\n projectName: string\n minVersion?: number\n versionId?: string | null\n productId?: string | null\n}\n\nexport const UploadVersionForm: FC<UploadVersionFormProps> = ({\n formData,\n onChange,\n onSubmit,\n hidden = [],\n projectName,\n minVersion = 1,\n versionId,\n productId,\n}) => {\n const previousProductTypeRef = useRef<string>(formData.productType)\n const dropdownRef = useRef<DropdownRef>(null)\n const formRef = useRef<HTMLFormElement>(null)\n const {\n pendingFiles,\n setPendingFiles,\n onCloseVersionUpload,\n extractAndSetVersionFromFiles,\n dispatch,\n } = useVersionUploadContext()\n\n const productTypeOptions = Object.entries(productTypes).map(([key, value]) => ({\n value: key,\n label: value.name,\n icon: value.icon,\n }))\n\n useEffect(() => {\n // Check if the current name starts with the previous product type name\n const previousProductType = previousProductTypeRef.current\n const previousProductTypeName = productTypes[previousProductType]?.name || ''\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n\n // Only sync if the product type actually changed\n if (formData.productType !== previousProductType && previousProductTypeName) {\n // Check if the current name starts with the previous product type name\n if (formData.name.startsWith(previousProductTypeName)) {\n // Extract the suffix after the previous product type name\n const suffix = formData.name.slice(previousProductTypeName.length)\n // Create the new name with the current product type + suffix\n const newName = currentProductTypeName + suffix\n onChange('name', newName)\n }\n }\n\n // Update the ref to the current product type\n previousProductTypeRef.current = formData.productType\n }, [formData.productType, formData.name, onChange])\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n // @ts-expect-error - submitter is not defined in the type\n const submitter = e.nativeEvent.submitter as HTMLButtonElement | null\n // if the submitter is a button, check it's parent does not have the dropdown class\n if (submitter && submitter.closest('.dropdown')) {\n // if the submitter is a button inside a dropdown, do not submit the form\n return\n }\n\n onSubmit(formData)\n }\n\n const handleVersionChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(e.target.value, 10)\n if (!isNaN(value)) {\n onChange('version', value)\n }\n }\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange('name', e.target.value)\n }\n\n const handleProductTypeChange = (value: string[]) => {\n if (value.length > 0) {\n onChange('productType', value[0])\n // focus the name input after changing product type\n }\n }\n\n const handleApplyPrefix = () => {\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n const currentName = formData.name || ''\n\n // Capitalize the first letter of the existing name for camelCase\n const capitalizedName = currentName.charAt(0).toUpperCase() + currentName.slice(1)\n const newName = currentProductTypeName + capitalizedName\n onChange('name', newName)\n }\n\n const shouldShowRecommendation = () => {\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n return formData.name && !formData.name.startsWith(currentProductTypeName)\n }\n\n // Disable form fields if version has been created\n const isFormSubmitted = Boolean(versionId)\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLFormElement>) => {\n // Submit form on Cmd/Ctrl + Enter\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n onSubmit(formData)\n return\n }\n }\n\n return (\n <StyledForm\n id=\"upload-version-form\"\n ref={formRef}\n onSubmit={handleSubmit}\n noValidate\n onKeyDown={handleKeyDown}\n >\n <StyledFormLayout>\n {!hidden.includes('productType') && (\n <FormRow label=\"Product Type\">\n <Dropdown\n ref={dropdownRef}\n options={productTypeOptions}\n value={[formData.productType]}\n onChange={handleProductTypeChange}\n widthExpand\n multiSelect={false}\n aria-label=\"Product Type\"\n search\n disabled={isFormSubmitted}\n />\n </FormRow>\n )}\n\n {!hidden.includes('name') && (\n <FormRow label=\"Product Name\">\n <div>\n <InputText\n value={formData.name}\n onChange={handleNameChange}\n placeholder=\"Enter product name\"\n minLength={1}\n autoFocus\n aria-label=\"Product Name\"\n aria-describedby={shouldShowRecommendation() ? 'name-recommendation' : undefined}\n disabled={isFormSubmitted}\n />\n {shouldShowRecommendation() && (\n <RecommendationNote id=\"name-recommendation\">\n We recommend prefixing with \"{productTypes[formData.productType]?.name}\".{' '}\n <InlineButton type=\"button\" onClick={handleApplyPrefix}>\n Apply prefix\n </InlineButton>\n </RecommendationNote>\n )}\n </div>\n </FormRow>\n )}\n\n {!hidden.includes('version') && (\n <FormRow label=\"Version\">\n <InputNumber\n value={formData.version}\n onChange={handleVersionChange}\n min={minVersion}\n step={1}\n aria-label=\"Version Number\"\n autoFocus={hidden.includes('name')}\n disabled={isFormSubmitted}\n />\n </FormRow>\n )}\n </StyledFormLayout>\n\n <FormRow label=\"Reviewable files\" />\n <StyledUpload>\n <ReviewableUpload\n projectName={projectName}\n versionId={versionId}\n productId={productId}\n dispatch={dispatch}\n pendingFiles={pendingFiles}\n setPendingFiles={setPendingFiles}\n onUpload={onCloseVersionUpload}\n onFilesAdded={extractAndSetVersionFromFiles}\n pt={{\n upload: {\n style: { minHeight: 80 },\n },\n dropzone: {\n style: { inset: 0 },\n },\n }}\n />\n </StyledUpload>\n </StyledForm>\n )\n}\n"],"names":["_a","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"UploadVersionForm.es.js","sources":["../../../../../../src/components/VersionUploader/components/UploadVersionForm.tsx"],"sourcesContent":["import { FC, FormEvent, useEffect, useRef } from 'react'\nimport styled from 'styled-components'\nimport { FormLayout, FormRow, InputText, InputNumber, Dropdown } from '@ynput/ayon-react-components'\nimport { productTypes } from '@shared/util'\nimport type { DropdownRef } from '@ynput/ayon-react-components'\nimport { ReviewableUpload } from '@shared/components'\nimport { useVersionUploadContext } from '../context/VersionUploadContext'\n\nconst StyledForm = styled.form`\n display: flex;\n flex-direction: column;\n gap: var(--base-gap-large);\n padding: var(--padding-m);\n width: 100%;\n`\n\nconst StyledFormLayout = styled(FormLayout)`\n width: 100%;\n margin: auto;\n\n & > div {\n align-items: start;\n }\n\n input {\n width: 100%;\n }\n`\n\nconst RecommendationNote = styled.div`\n font-size: var(--font-size-xs);\n color: var(--md-sys-color-outline);\n margin-top: var(--base-gap-small);\n line-height: 1.3;\n`\n\nconst InlineButton = styled.button`\n background: none;\n border: none;\n color: var(--md-sys-color-primary);\n text-decoration: underline;\n cursor: pointer;\n padding: 0;\n font-size: inherit;\n font-family: inherit;\n\n &:hover {\n color: var(--md-sys-color-primary-dark);\n }\n`\n\nconst StyledUpload = styled.div`\n position: relative;\n min-height: 80px;\n`\n\ntype FormData = {\n version: number\n name: string\n productType: string\n}\n\ninterface UploadVersionFormProps {\n formData: FormData\n onChange: (key: keyof FormData, value: string | number) => void\n onSubmit: (formData: FormData) => void\n hidden?: (keyof FormData)[]\n projectName: string\n minVersion?: number\n versionId?: string | null\n productId?: string | null\n}\n\nexport const UploadVersionForm: FC<UploadVersionFormProps> = ({\n formData,\n onChange,\n onSubmit,\n hidden = [],\n projectName,\n minVersion = 1,\n versionId,\n productId,\n}) => {\n const previousProductTypeRef = useRef<string>(formData.productType)\n const dropdownRef = useRef<DropdownRef>(null)\n const formRef = useRef<HTMLFormElement>(null)\n const {\n pendingFiles,\n setPendingFiles,\n onCloseVersionUpload,\n extractAndSetVersionFromFiles,\n dispatch,\n } = useVersionUploadContext()\n\n const productTypeOptions = Object.entries(productTypes).map(([key, value]) => ({\n value: key,\n label: value.name,\n icon: value.icon,\n }))\n\n useEffect(() => {\n // Check if the current name starts with the previous product type name\n const previousProductType = previousProductTypeRef.current\n const previousProductTypeName = productTypes[previousProductType]?.name || ''\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n\n // Only sync if the product type actually changed\n if (formData.productType !== previousProductType && previousProductTypeName) {\n // Check if the current name starts with the previous product type name\n if (formData.name.startsWith(previousProductTypeName)) {\n // Extract the suffix after the previous product type name\n const suffix = formData.name.slice(previousProductTypeName.length)\n // Create the new name with the current product type + suffix\n const newName = currentProductTypeName + suffix\n onChange('name', newName)\n }\n }\n\n // Update the ref to the current product type\n previousProductTypeRef.current = formData.productType\n }, [formData.productType, formData.name, onChange])\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n // @ts-expect-error - submitter is not defined in the type\n const submitter = e.nativeEvent.submitter as HTMLButtonElement | null\n // if the submitter is a button, check it's parent does not have the dropdown class\n if (submitter && submitter.closest('.dropdown')) {\n // if the submitter is a button inside a dropdown, do not submit the form\n return\n }\n\n onSubmit(formData)\n }\n\n const handleVersionChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = parseInt(e.target.value, 10)\n if (!isNaN(value)) {\n onChange('version', value)\n }\n }\n\n const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange('name', e.target.value)\n }\n\n const handleProductTypeChange = (value: string[]) => {\n if (value.length > 0) {\n onChange('productType', value[0])\n // focus the name input after changing product type\n }\n }\n\n const handleApplyPrefix = () => {\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n const currentName = formData.name || ''\n\n // Capitalize the first letter of the existing name for camelCase\n const capitalizedName = currentName.charAt(0).toUpperCase() + currentName.slice(1)\n const newName = currentProductTypeName + capitalizedName\n onChange('name', newName)\n }\n\n const shouldShowRecommendation = () => {\n const currentProductTypeName = productTypes[formData.productType]?.name || ''\n return formData.name && !formData.name.startsWith(currentProductTypeName)\n }\n\n // Disable form fields if version has been created\n const isFormSubmitted = Boolean(versionId)\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLFormElement>) => {\n // Submit form on Cmd/Ctrl + Enter\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n onSubmit(formData)\n return\n }\n }\n\n return (\n <StyledForm\n id=\"upload-version-form\"\n ref={formRef}\n onSubmit={handleSubmit}\n noValidate\n onKeyDown={handleKeyDown}\n >\n <StyledFormLayout>\n {!hidden.includes('productType') && (\n <FormRow label=\"Product Type\">\n <Dropdown\n ref={dropdownRef}\n options={productTypeOptions}\n value={[formData.productType]}\n onChange={handleProductTypeChange}\n widthExpand\n multiSelect={false}\n aria-label=\"Product Type\"\n search\n disabled={isFormSubmitted}\n />\n </FormRow>\n )}\n\n {!hidden.includes('name') && (\n <FormRow label=\"Product Name\">\n <div>\n <InputText\n value={formData.name}\n onChange={handleNameChange}\n placeholder=\"Enter product name\"\n minLength={1}\n autoFocus\n aria-label=\"Product Name\"\n aria-describedby={shouldShowRecommendation() ? 'name-recommendation' : undefined}\n disabled={isFormSubmitted}\n />\n {shouldShowRecommendation() && (\n <RecommendationNote id=\"name-recommendation\">\n We recommend prefixing with \"{productTypes[formData.productType]?.name}\".{' '}\n <InlineButton type=\"button\" onClick={handleApplyPrefix}>\n Apply prefix\n </InlineButton>\n </RecommendationNote>\n )}\n </div>\n </FormRow>\n )}\n\n {!hidden.includes('version') && (\n <FormRow label=\"Version\">\n <InputNumber\n value={formData.version}\n onChange={handleVersionChange}\n min={minVersion}\n step={1}\n aria-label=\"Version Number\"\n autoFocus={hidden.includes('name')}\n disabled={isFormSubmitted}\n />\n </FormRow>\n )}\n </StyledFormLayout>\n\n <FormRow label=\"Reviewable files\" />\n <StyledUpload>\n <ReviewableUpload\n projectName={projectName}\n versionId={versionId}\n productId={productId}\n dispatch={dispatch}\n pendingFiles={pendingFiles}\n setPendingFiles={setPendingFiles}\n onUpload={onCloseVersionUpload}\n onFilesAdded={extractAndSetVersionFromFiles}\n pt={{\n upload: {\n style: { minHeight: 80 },\n },\n dropzone: {\n style: { inset: 0 },\n },\n }}\n />\n </StyledUpload>\n </StyledForm>\n )\n}\n"],"names":["_a","jsxs","jsx"],"mappings":"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"}
@@ -138,6 +138,11 @@ require("../ProjectTreeTable/context/ColumnSettingsContext.cjs.js");
138
138
  require("../ProjectTreeTable/context/ProjectTableContext.cjs.js");
139
139
  require("../ProjectTreeTable/context/ProjectTableQueriesContext.cjs.js");
140
140
  require("../ProjectTreeTable/context/SelectedRowsContext.cjs.js");
141
+ require("../../../../_virtual/runtime.cjs.js");
142
+ require("../../../../_virtual/semver.cjs.js");
143
+ require("react-redux");
144
+ require("custom-protocol-check");
145
+ require("../ProjectTreeTable/components/GroupSettingsFallback.cjs.js");
141
146
  require("../ProjectTreeTable/context/ProjectDataContext.cjs.js");
142
147
  require("../ProjectTreeTable/widgets/CollapsedWidget.cjs.js");
143
148
  require("../ProjectTreeTable/widgets/DateWidget.cjs.js");
@@ -152,14 +157,10 @@ require("../ProjectTreeTable/ProjectTreeTable.styled.cjs.js");
152
157
  require("../ProjectTreeTable/components/SelectionCell.cjs.js");
153
158
  require("../ProjectTreeTable/components/RowSelectionHeader.cjs.js");
154
159
  require("../ProjectTreeTable/widgets/LoadMoreWidget.cjs.js");
155
- require("../../../../_virtual/runtime.cjs.js");
156
- require("../../../../_virtual/semver.cjs.js");
157
- require("react-redux");
158
- require("custom-protocol-check");
159
- require("../ProjectTreeTable/components/GroupSettingsFallback.cjs.js");
160
160
  require("../DetailsPanel/DetailsPanel.styled.cjs.js");
161
161
  require("../DetailsPanel/FeedFilters/FeedFilters.styled.cjs.js");
162
162
  require("../DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");
163
+ require("../../components/PlayableIcon/PlayableIcon.cjs.js");
163
164
  require("../DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js");
164
165
  require("../DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.cjs.js");
165
166
  require("../DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.styled.cjs.js");
@@ -1 +1 @@
1
- {"version":3,"file":"ActionConfigDialog.cjs.js","sources":["../../../../../src/containers/Actions/ActionConfigDialog.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { toast } from 'react-toastify'\nimport { SimpleFormDialog } from '@shared/components'\nimport type { SimpleFormValueDict } from '@shared/components'\n\nimport { useGetActionConfigQuery, useSetActionConfigMutation } from '@shared/api'\nimport type { ActionContext, BaseActionManifest } from '@shared/api'\n\ntype ConfigData = Record<string, any>\n\ninterface ActionConfigDialogProps {\n action: BaseActionManifest\n context: ActionContext\n onClose: () => void\n}\n\ninterface ActionConfigRequestQueryParams {\n addonName: string\n addonVersion: string\n variant?: string\n identifier: string\n}\n\nexport const ActionConfigDialog = ({ action, onClose, context }: ActionConfigDialogProps) => {\n const requestParams: ActionConfigRequestQueryParams | null =\n useMemo<ActionConfigRequestQueryParams | null>(() => {\n if (!action) return null\n if (!(action.addonName && action.addonVersion)) return null // this should never happen\n return {\n addonName: action.addonName,\n addonVersion: action.addonVersion,\n variant: action.variant,\n identifier: action.identifier,\n }\n }, [action])\n\n const [configureAction] = useSetActionConfigMutation()\n\n // make typescript happily unknowing about the type\n // because even if we pass skip, arguments are still required in the right type. that's cursed\n const qp: any = { actionConfig: context, ...(requestParams || {}) }\n const { data: initValues } = useGetActionConfigQuery(qp, { skip: !requestParams })\n\n // it would be sooo cool if i could do this BEFORE the query and ommit that\n // qp thing, but i can't. because it would change the hook order. ffs\n if (!(initValues && action?.configFields && action && requestParams)) {\n return null\n }\n\n const handleSubmit = async (data: ConfigData) => {\n try {\n await configureAction({\n actionConfig: { ...context, value: data },\n ...requestParams,\n }).unwrap()\n onClose()\n } catch (error) {\n console.warn('Error configuring action', error)\n toast.error('Unable to set the action configuration')\n }\n }\n\n return (\n <SimpleFormDialog\n isOpen\n title={`Configure action ${action.label}`}\n fields={action.configFields}\n values={initValues as SimpleFormValueDict}\n onClose={onClose}\n onSubmit={handleSubmit}\n submitLabel=\"Save action config\"\n cancelLabel=\"Cancel\"\n submitIcon=\"check\"\n cancelIcon=\"close\"\n />\n )\n}\n"],"names":["useMemo","useSetActionConfigMutation","useGetActionConfigQuery","toast","jsx","SimpleFormDialog"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBO,MAAM,qBAAqB,CAAC,EAAE,QAAQ,SAAS,cAAuC;AACrF,QAAA,gBACJA,MAAAA,QAA+C,MAAM;AAC/C,QAAA,CAAC,OAAe,QAAA;AACpB,QAAI,EAAE,OAAO,aAAa,OAAO,cAAsB,QAAA;AAChD,WAAA;AAAA,MACL,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,IACrB;AAAA,EAAA,GACC,CAAC,MAAM,CAAC;AAEP,QAAA,CAAC,eAAe,IAAIC,sCAA2B;AAIrD,QAAM,KAAU,EAAE,cAAc,SAAS,GAAI,iBAAiB,CAAA,EAAI;AAC5D,QAAA,EAAE,MAAM,eAAeC,WAAAA,wBAAwB,IAAI,EAAE,MAAM,CAAC,eAAe;AAIjF,MAAI,EAAE,eAAc,iCAAQ,iBAAgB,UAAU,gBAAgB;AAC7D,WAAA;AAAA,EAAA;AAGH,QAAA,eAAe,OAAO,SAAqB;AAC3C,QAAA;AACF,YAAM,gBAAgB;AAAA,QACpB,cAAc,EAAE,GAAG,SAAS,OAAO,KAAK;AAAA,QACxC,GAAG;AAAA,MACJ,CAAA,EAAE,OAAO;AACF,cAAA;AAAA,aACD,OAAO;AACN,cAAA,KAAK,4BAA4B,KAAK;AAC9CC,oBAAA,MAAM,MAAM,wCAAwC;AAAA,IAAA;AAAA,EAExD;AAGE,SAAAC,2BAAA,kBAAA;AAAA,IAACC,iBAAA;AAAA,IAAA;AAAA,MACC,QAAM;AAAA,MACN,OAAO,oBAAoB,OAAO,KAAK;AAAA,MACvC,QAAQ,OAAO;AAAA,MACf,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,YAAW;AAAA,MACX,YAAW;AAAA,IAAA;AAAA,EACb;AAEJ;;"}
1
+ {"version":3,"file":"ActionConfigDialog.cjs.js","sources":["../../../../../src/containers/Actions/ActionConfigDialog.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { toast } from 'react-toastify'\nimport { SimpleFormDialog } from '@shared/components'\nimport type { SimpleFormValueDict } from '@shared/components'\n\nimport { useGetActionConfigQuery, useSetActionConfigMutation } from '@shared/api'\nimport type { ActionContext, BaseActionManifest } from '@shared/api'\n\ntype ConfigData = Record<string, any>\n\ninterface ActionConfigDialogProps {\n action: BaseActionManifest\n context: ActionContext\n onClose: () => void\n}\n\ninterface ActionConfigRequestQueryParams {\n addonName: string\n addonVersion: string\n variant?: string\n identifier: string\n}\n\nexport const ActionConfigDialog = ({ action, onClose, context }: ActionConfigDialogProps) => {\n const requestParams: ActionConfigRequestQueryParams | null =\n useMemo<ActionConfigRequestQueryParams | null>(() => {\n if (!action) return null\n if (!(action.addonName && action.addonVersion)) return null // this should never happen\n return {\n addonName: action.addonName,\n addonVersion: action.addonVersion,\n variant: action.variant,\n identifier: action.identifier,\n }\n }, [action])\n\n const [configureAction] = useSetActionConfigMutation()\n\n // make typescript happily unknowing about the type\n // because even if we pass skip, arguments are still required in the right type. that's cursed\n const qp: any = { actionConfig: context, ...(requestParams || {}) }\n const { data: initValues } = useGetActionConfigQuery(qp, { skip: !requestParams })\n\n // it would be sooo cool if i could do this BEFORE the query and ommit that\n // qp thing, but i can't. because it would change the hook order. ffs\n if (!(initValues && action?.configFields && action && requestParams)) {\n return null\n }\n\n const handleSubmit = async (data: ConfigData) => {\n try {\n await configureAction({\n actionConfig: { ...context, value: data },\n ...requestParams,\n }).unwrap()\n onClose()\n } catch (error) {\n console.warn('Error configuring action', error)\n toast.error('Unable to set the action configuration')\n }\n }\n\n return (\n <SimpleFormDialog\n isOpen\n title={`Configure action ${action.label}`}\n fields={action.configFields}\n values={initValues as SimpleFormValueDict}\n onClose={onClose}\n onSubmit={handleSubmit}\n submitLabel=\"Save action config\"\n cancelLabel=\"Cancel\"\n submitIcon=\"check\"\n cancelIcon=\"close\"\n />\n )\n}\n"],"names":["useMemo","useSetActionConfigMutation","useGetActionConfigQuery","toast","jsx","SimpleFormDialog"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBO,MAAM,qBAAqB,CAAC,EAAE,QAAQ,SAAS,cAAuC;AACrF,QAAA,gBACJA,MAAAA,QAA+C,MAAM;AAC/C,QAAA,CAAC,OAAe,QAAA;AACpB,QAAI,EAAE,OAAO,aAAa,OAAO,cAAsB,QAAA;AAChD,WAAA;AAAA,MACL,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,IACrB;AAAA,EAAA,GACC,CAAC,MAAM,CAAC;AAEP,QAAA,CAAC,eAAe,IAAIC,sCAA2B;AAIrD,QAAM,KAAU,EAAE,cAAc,SAAS,GAAI,iBAAiB,CAAA,EAAI;AAC5D,QAAA,EAAE,MAAM,eAAeC,WAAAA,wBAAwB,IAAI,EAAE,MAAM,CAAC,eAAe;AAIjF,MAAI,EAAE,eAAc,iCAAQ,iBAAgB,UAAU,gBAAgB;AAC7D,WAAA;AAAA,EAAA;AAGH,QAAA,eAAe,OAAO,SAAqB;AAC3C,QAAA;AACF,YAAM,gBAAgB;AAAA,QACpB,cAAc,EAAE,GAAG,SAAS,OAAO,KAAK;AAAA,QACxC,GAAG;AAAA,MACJ,CAAA,EAAE,OAAO;AACF,cAAA;AAAA,aACD,OAAO;AACN,cAAA,KAAK,4BAA4B,KAAK;AAC9CC,oBAAA,MAAM,MAAM,wCAAwC;AAAA,IAAA;AAAA,EAExD;AAGE,SAAAC,2BAAA,kBAAA;AAAA,IAACC,iBAAA;AAAA,IAAA;AAAA,MACC,QAAM;AAAA,MACN,OAAO,oBAAoB,OAAO,KAAK;AAAA,MACvC,QAAQ,OAAO;AAAA,MACf,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,YAAW;AAAA,MACX,YAAW;AAAA,IAAA;AAAA,EACb;AAEJ;;"}
@@ -136,6 +136,11 @@ import "../ProjectTreeTable/context/ColumnSettingsContext.es.js";
136
136
  import "../ProjectTreeTable/context/ProjectTableContext.es.js";
137
137
  import "../ProjectTreeTable/context/ProjectTableQueriesContext.es.js";
138
138
  import "../ProjectTreeTable/context/SelectedRowsContext.es.js";
139
+ import "../../../../_virtual/runtime.es.js";
140
+ import "../../../../_virtual/semver.es.js";
141
+ import "react-redux";
142
+ import "custom-protocol-check";
143
+ import "../ProjectTreeTable/components/GroupSettingsFallback.es.js";
139
144
  import "../ProjectTreeTable/context/ProjectDataContext.es.js";
140
145
  import "../ProjectTreeTable/widgets/CollapsedWidget.es.js";
141
146
  import "../ProjectTreeTable/widgets/DateWidget.es.js";
@@ -150,14 +155,10 @@ import "../ProjectTreeTable/ProjectTreeTable.styled.es.js";
150
155
  import "../ProjectTreeTable/components/SelectionCell.es.js";
151
156
  import "../ProjectTreeTable/components/RowSelectionHeader.es.js";
152
157
  import "../ProjectTreeTable/widgets/LoadMoreWidget.es.js";
153
- import "../../../../_virtual/runtime.es.js";
154
- import "../../../../_virtual/semver.es.js";
155
- import "react-redux";
156
- import "custom-protocol-check";
157
- import "../ProjectTreeTable/components/GroupSettingsFallback.es.js";
158
158
  import "../DetailsPanel/DetailsPanel.styled.es.js";
159
159
  import "../DetailsPanel/FeedFilters/FeedFilters.styled.es.js";
160
160
  import "../DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js";
161
+ import "../../components/PlayableIcon/PlayableIcon.es.js";
161
162
  import "../DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js";
162
163
  import "../DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.styled.es.js";
163
164
  import "../DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.styled.es.js";
@@ -1 +1 @@
1
- {"version":3,"file":"ActionConfigDialog.es.js","sources":["../../../../../src/containers/Actions/ActionConfigDialog.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { toast } from 'react-toastify'\nimport { SimpleFormDialog } from '@shared/components'\nimport type { SimpleFormValueDict } from '@shared/components'\n\nimport { useGetActionConfigQuery, useSetActionConfigMutation } from '@shared/api'\nimport type { ActionContext, BaseActionManifest } from '@shared/api'\n\ntype ConfigData = Record<string, any>\n\ninterface ActionConfigDialogProps {\n action: BaseActionManifest\n context: ActionContext\n onClose: () => void\n}\n\ninterface ActionConfigRequestQueryParams {\n addonName: string\n addonVersion: string\n variant?: string\n identifier: string\n}\n\nexport const ActionConfigDialog = ({ action, onClose, context }: ActionConfigDialogProps) => {\n const requestParams: ActionConfigRequestQueryParams | null =\n useMemo<ActionConfigRequestQueryParams | null>(() => {\n if (!action) return null\n if (!(action.addonName && action.addonVersion)) return null // this should never happen\n return {\n addonName: action.addonName,\n addonVersion: action.addonVersion,\n variant: action.variant,\n identifier: action.identifier,\n }\n }, [action])\n\n const [configureAction] = useSetActionConfigMutation()\n\n // make typescript happily unknowing about the type\n // because even if we pass skip, arguments are still required in the right type. that's cursed\n const qp: any = { actionConfig: context, ...(requestParams || {}) }\n const { data: initValues } = useGetActionConfigQuery(qp, { skip: !requestParams })\n\n // it would be sooo cool if i could do this BEFORE the query and ommit that\n // qp thing, but i can't. because it would change the hook order. ffs\n if (!(initValues && action?.configFields && action && requestParams)) {\n return null\n }\n\n const handleSubmit = async (data: ConfigData) => {\n try {\n await configureAction({\n actionConfig: { ...context, value: data },\n ...requestParams,\n }).unwrap()\n onClose()\n } catch (error) {\n console.warn('Error configuring action', error)\n toast.error('Unable to set the action configuration')\n }\n }\n\n return (\n <SimpleFormDialog\n isOpen\n title={`Configure action ${action.label}`}\n fields={action.configFields}\n values={initValues as SimpleFormValueDict}\n onClose={onClose}\n onSubmit={handleSubmit}\n submitLabel=\"Save action config\"\n cancelLabel=\"Cancel\"\n submitIcon=\"check\"\n cancelIcon=\"close\"\n />\n )\n}\n"],"names":["jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBO,MAAM,qBAAqB,CAAC,EAAE,QAAQ,SAAS,cAAuC;AACrF,QAAA,gBACJ,QAA+C,MAAM;AAC/C,QAAA,CAAC,OAAe,QAAA;AACpB,QAAI,EAAE,OAAO,aAAa,OAAO,cAAsB,QAAA;AAChD,WAAA;AAAA,MACL,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,IACrB;AAAA,EAAA,GACC,CAAC,MAAM,CAAC;AAEP,QAAA,CAAC,eAAe,IAAI,2BAA2B;AAIrD,QAAM,KAAU,EAAE,cAAc,SAAS,GAAI,iBAAiB,CAAA,EAAI;AAC5D,QAAA,EAAE,MAAM,eAAe,wBAAwB,IAAI,EAAE,MAAM,CAAC,eAAe;AAIjF,MAAI,EAAE,eAAc,iCAAQ,iBAAgB,UAAU,gBAAgB;AAC7D,WAAA;AAAA,EAAA;AAGH,QAAA,eAAe,OAAO,SAAqB;AAC3C,QAAA;AACF,YAAM,gBAAgB;AAAA,QACpB,cAAc,EAAE,GAAG,SAAS,OAAO,KAAK;AAAA,QACxC,GAAG;AAAA,MACJ,CAAA,EAAE,OAAO;AACF,cAAA;AAAA,aACD,OAAO;AACN,cAAA,KAAK,4BAA4B,KAAK;AAC9C,YAAM,MAAM,wCAAwC;AAAA,IAAA;AAAA,EAExD;AAGE,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAM;AAAA,MACN,OAAO,oBAAoB,OAAO,KAAK;AAAA,MACvC,QAAQ,OAAO;AAAA,MACf,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,YAAW;AAAA,MACX,YAAW;AAAA,IAAA;AAAA,EACb;AAEJ;"}
1
+ {"version":3,"file":"ActionConfigDialog.es.js","sources":["../../../../../src/containers/Actions/ActionConfigDialog.tsx"],"sourcesContent":["import { useMemo } from 'react'\nimport { toast } from 'react-toastify'\nimport { SimpleFormDialog } from '@shared/components'\nimport type { SimpleFormValueDict } from '@shared/components'\n\nimport { useGetActionConfigQuery, useSetActionConfigMutation } from '@shared/api'\nimport type { ActionContext, BaseActionManifest } from '@shared/api'\n\ntype ConfigData = Record<string, any>\n\ninterface ActionConfigDialogProps {\n action: BaseActionManifest\n context: ActionContext\n onClose: () => void\n}\n\ninterface ActionConfigRequestQueryParams {\n addonName: string\n addonVersion: string\n variant?: string\n identifier: string\n}\n\nexport const ActionConfigDialog = ({ action, onClose, context }: ActionConfigDialogProps) => {\n const requestParams: ActionConfigRequestQueryParams | null =\n useMemo<ActionConfigRequestQueryParams | null>(() => {\n if (!action) return null\n if (!(action.addonName && action.addonVersion)) return null // this should never happen\n return {\n addonName: action.addonName,\n addonVersion: action.addonVersion,\n variant: action.variant,\n identifier: action.identifier,\n }\n }, [action])\n\n const [configureAction] = useSetActionConfigMutation()\n\n // make typescript happily unknowing about the type\n // because even if we pass skip, arguments are still required in the right type. that's cursed\n const qp: any = { actionConfig: context, ...(requestParams || {}) }\n const { data: initValues } = useGetActionConfigQuery(qp, { skip: !requestParams })\n\n // it would be sooo cool if i could do this BEFORE the query and ommit that\n // qp thing, but i can't. because it would change the hook order. ffs\n if (!(initValues && action?.configFields && action && requestParams)) {\n return null\n }\n\n const handleSubmit = async (data: ConfigData) => {\n try {\n await configureAction({\n actionConfig: { ...context, value: data },\n ...requestParams,\n }).unwrap()\n onClose()\n } catch (error) {\n console.warn('Error configuring action', error)\n toast.error('Unable to set the action configuration')\n }\n }\n\n return (\n <SimpleFormDialog\n isOpen\n title={`Configure action ${action.label}`}\n fields={action.configFields}\n values={initValues as SimpleFormValueDict}\n onClose={onClose}\n onSubmit={handleSubmit}\n submitLabel=\"Save action config\"\n cancelLabel=\"Cancel\"\n submitIcon=\"check\"\n cancelIcon=\"close\"\n />\n )\n}\n"],"names":["jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBO,MAAM,qBAAqB,CAAC,EAAE,QAAQ,SAAS,cAAuC;AACrF,QAAA,gBACJ,QAA+C,MAAM;AAC/C,QAAA,CAAC,OAAe,QAAA;AACpB,QAAI,EAAE,OAAO,aAAa,OAAO,cAAsB,QAAA;AAChD,WAAA;AAAA,MACL,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,IACrB;AAAA,EAAA,GACC,CAAC,MAAM,CAAC;AAEP,QAAA,CAAC,eAAe,IAAI,2BAA2B;AAIrD,QAAM,KAAU,EAAE,cAAc,SAAS,GAAI,iBAAiB,CAAA,EAAI;AAC5D,QAAA,EAAE,MAAM,eAAe,wBAAwB,IAAI,EAAE,MAAM,CAAC,eAAe;AAIjF,MAAI,EAAE,eAAc,iCAAQ,iBAAgB,UAAU,gBAAgB;AAC7D,WAAA;AAAA,EAAA;AAGH,QAAA,eAAe,OAAO,SAAqB;AAC3C,QAAA;AACF,YAAM,gBAAgB;AAAA,QACpB,cAAc,EAAE,GAAG,SAAS,OAAO,KAAK;AAAA,QACxC,GAAG;AAAA,MACJ,CAAA,EAAE,OAAO;AACF,cAAA;AAAA,aACD,OAAO;AACN,cAAA,KAAK,4BAA4B,KAAK;AAC9C,YAAM,MAAM,wCAAwC;AAAA,IAAA;AAAA,EAExD;AAGE,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAM;AAAA,MACN,OAAO,oBAAoB,OAAO,KAAK;AAAA,MACvC,QAAQ,OAAO;AAAA,MACf,QAAQ;AAAA,MACR;AAAA,MACA,UAAU;AAAA,MACV,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,YAAW;AAAA,MACX,YAAW;AAAA,IAAA;AAAA,EACb;AAEJ;"}
@@ -107,8 +107,11 @@ const Actions = ({
107
107
  projectActionsProjectName,
108
108
  searchParams,
109
109
  featuredCount = 2,
110
+ isDeveloperMode,
110
111
  onNavigate,
111
- onSetSearchParams
112
+ onSetSearchParams,
113
+ align,
114
+ pt
112
115
  }) => {
113
116
  const { handleActionPayload } = useActionTriggers.useActionTriggers({ onNavigate, onSetSearchParams, searchParams });
114
117
  const [actionBeingConfigured, setActionBeingConfigured] = React.useState(null);
@@ -308,7 +311,10 @@ const Actions = ({
308
311
  options: dropdownOptions,
309
312
  isLoading: isLoading && featuredCount > 0,
310
313
  onAction: handleExecuteAction,
311
- onConfig: handleConfigureAction
314
+ onConfig: handleConfigureAction,
315
+ isDeveloperMode,
316
+ align,
317
+ ...pt == null ? void 0 : pt.dropdown
312
318
  }
313
319
  ),
314
320
  /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"Actions.cjs.js","sources":["../../../../../src/containers/Actions/Actions.tsx"],"sourcesContent":["import * as Styled from './Actions.styled'\nimport { MouseEvent, useState } from 'react'\nimport clsx from 'clsx'\nimport { toast } from 'react-toastify'\nimport { useMemo, useEffect } from 'react'\nimport { ActionContext, useExecuteActionMutation, useGetActionsFromContextQuery } from '@shared/api'\nimport { ActionsDropdown } from './ActionsDropdown'\nimport ActionIcon from './ActionIcon'\nimport { ActionTriggersProps, useActionTriggers } from '@shared/hooks'\nimport { ActionConfigDialog } from './ActionConfigDialog'\nimport { InteractiveActionDialog, InteractiveForm } from './InteractiveActionDialog'\n\nconst placeholder = {\n identifier: 'placeholder',\n label: 'Featured action slot',\n isPlaceholder: true,\n icon: { type: 'material-symbols', name: 'sync' },\n groupLabel: '',\n}\n\ninterface ActionsProps extends ActionTriggersProps {\n entities: { id: string; projectName: string; entitySubType?: string }[]\n entityType: ActionContext['entityType']\n entitySubTypes?: string[]\n isLoadingEntity: boolean\n projectActionsProjectName?: string\n featuredCount?: number\n}\n\nexport const Actions = ({\n entities,\n entityType,\n entitySubTypes,\n isLoadingEntity,\n projectActionsProjectName,\n searchParams,\n featuredCount = 2,\n onNavigate,\n onSetSearchParams,\n}: ActionsProps) => {\n // special triggers the actions can make to perform stuff on the client\n const { handleActionPayload } = useActionTriggers({ onNavigate, onSetSearchParams, searchParams })\n const [actionBeingConfigured, setActionBeingConfigured] = useState<any>(null)\n const [interactiveForm, setInteractiveForm] = useState<any>(null)\n\n const context: ActionContext | null = useMemo(() => {\n if (projectActionsProjectName){\n return {\n entityType: 'project',\n projectName: projectActionsProjectName,\n }\n }\n if (!entities.length) return null\n if (!entities[0].projectName) return null\n\n // get a list of unique entity subtypes from loaded data\n const entitySubtypesLoaded = entities\n .filter((entity) => entity.entitySubType)\n .map((entity) => entity.entitySubType as string)\n .filter((value, index, self) => self.indexOf(value) === index && value)\n\n // try and use the passed in entitySubTypes, if not use the loaded ones\n const entitySubTypesToUse = entitySubTypes?.length ? entitySubTypes : entitySubtypesLoaded\n\n // all types except version/representation should have subtypes\n if (\n !entitySubTypesToUse?.length &&\n entityType !== 'version' &&\n entityType !== 'representation'\n ) {\n console.warn('No entity subtypes found')\n return null\n }\n\n return {\n projectName: entities[0].projectName,\n entityType: entityType,\n entityIds: entities.map((entity) => entity.id),\n entitySubtypes: entitySubTypesToUse,\n }\n }, [entities, entityType])\n\n useEffect(() => {\n setInteractiveForm(null)\n }, [context])\n\n const { data, isFetching: isFetchingActions } = useGetActionsFromContextQuery(\n { mode: 'simple', actionContext: context as ActionContext },\n { skip: !context },\n )\n\n const actions = data?.actions || []\n\n const categoryOrder = ['application', 'admin', 'workflow']\n // group actions by category\n // sort by hardcoded category, this will changing the future\n const groupedActions = useMemo(() => {\n // Step 1: Group actions by category\n const grouped = actions.reduce((acc: { [key: string]: any[] }, action) => {\n const category = action.category || 'uncategorized'\n if (!acc[category]) {\n acc[category] = []\n }\n acc[category].push(action)\n return acc\n }, {})\n\n // Step 5: Return the ordered groups\n return grouped\n }, [actions])\n\n // get categories that don't have a specific order (not in categoryOrder)\n // then sort them alphabetically\n const unorderedCategories = useMemo(\n () => [\n ...new Set(\n Object.keys(groupedActions)\n .filter((category) => !categoryOrder.includes(category))\n .sort((a, b) => a.localeCompare(b)),\n ),\n ],\n [groupedActions],\n )\n\n const categories = [...categoryOrder, ...unorderedCategories]\n\n // create the options for the dropdown, each category is separated by a divider and a title\n // for the divider we will use a custom dropdown item template\n const dropdownOptions = useMemo(() => {\n const options = []\n\n categories.forEach((category) => {\n if (!groupedActions[category] || !groupedActions[category].length) return\n\n options.push({\n label: category,\n header: true,\n value: category,\n disabled: true,\n })\n\n const groupOptions = groupedActions[category].map((action) => ({\n value: action.identifier,\n label: action.groupLabel ? action.groupLabel + ' ' + action.label : action.label,\n icon: action.icon,\n hasConfig: !!action.configFields,\n }))\n\n options.push(...groupOptions)\n })\n\n // if no actions, add placeholder\n if (!options.length) {\n options.push({\n label: 'No actions available',\n value: 'no-actions',\n disabled: true,\n header: true,\n })\n }\n\n return options\n }, [groupedActions, unorderedCategories, categoryOrder])\n\n const featuredActions = useMemo(() => {\n // Filter and sort to get initial featured actions\n let tempFeaturedActions = actions\n .filter((action) => action.featured)\n .sort((a, b) => (a.order || 0) - (b.order || 0))\n .slice(0, featuredCount)\n\n // Check if we need to add more actions to reach featuredCount\n if (tempFeaturedActions.length < featuredCount) {\n categories.forEach((category) => {\n if (tempFeaturedActions.length >= featuredCount) return\n const actions = groupedActions[category]\n if (!actions || !actions.length) return\n\n for (let i = tempFeaturedActions.length; i < featuredCount; i++) {\n const action = actions[i]\n if (!action) break\n if (!action.icon) continue\n tempFeaturedActions.push(action)\n }\n })\n }\n\n return tempFeaturedActions\n }, [actions, groupedActions, placeholder])\n\n const [executeAction, { isLoading: isLoadingExecution, originalArgs }] =\n useExecuteActionMutation()\n const executingAction = isLoadingExecution && originalArgs?.identifier\n\n const handleExecuteAction = async (\n identifier: string,\n e?: MouseEvent<HTMLElement> | null,\n formData?: InteractiveForm,\n ) => {\n e?.preventDefault()\n const action = actions.find((option) => option.identifier === identifier)\n\n if (!action) {\n toast.error('Action not found')\n console.warn('Action not found', identifier)\n return\n }\n\n const params = {\n addonName: action.addonName as string,\n addonVersion: action.addonVersion as string,\n variant: action.variant,\n identifier: action.identifier,\n }\n\n const actionContext = { ...context }\n if (formData) {\n actionContext.formData = formData\n }\n\n let response = null\n\n try {\n response = await executeAction({ actionContext, ...params }).unwrap()\n } catch (error: any) {\n console.error('Error executing action', error)\n toast.error(error?.data?.detail || 'Error executing action')\n return\n }\n\n try {\n // Toast the message if it is available\n if (response?.message) {\n if (response?.success) {\n toast.success(response.message, { autoClose: 2000 })\n } else {\n toast.error(response.message, { autoClose: 2000 })\n }\n }\n\n // Even if response?.success is false, we still want to handle the payload\n // as it may contain useful information - complex error messages in form,\n // redirect to another page etc. If the action just needs to abort,\n // it raises exception instead of returning a response with success: false\n\n // Use the new hook to handle payload\n if (response?.payload) {\n if (response.type === 'form') {\n // action requests additional information from the user.\n // we show a dialog with the form and when the user submits it we call the action again\n\n // It probably does not make sense to move to the useActionTriggers hook\n // as it need contexts and the dialog\n const intf = {\n identifier,\n // @ts-expect-error\n title: response.payload['title'],\n // @ts-expect-error\n fields: response.payload['fields'],\n // @ts-expect-error\n submitLabel: response.payload['submit_label'],\n // @ts-expect-error\n cancelLabel: response.payload['cancel_label'],\n // @ts-expect-error\n submitIcon: response.payload['submit_icon'],\n // @ts-expect-error\n cancelIcon: response.payload['cancel_icon'],\n }\n setInteractiveForm(intf)\n } else {\n handleActionPayload(response.type as string, response.payload)\n }\n }\n } catch (error) {\n // got response, but failed to process it\n console.warn('Error during action response processing', error)\n toast.error('Error occured during action processing')\n }\n }\n\n const handleConfigureAction = (identifier: string) => {\n const action = actions.find((data) => data.identifier === identifier)\n if (!action) return\n setActionBeingConfigured(action)\n }\n\n const handleSubmitInteractiveForm = async (identifier: string, formData: InteractiveForm) => {\n handleExecuteAction(identifier, null, formData)\n }\n\n const loadingActions = useMemo(\n () => Array(featuredCount).fill(placeholder),\n [featuredCount, placeholder],\n )\n\n const isLoading = isFetchingActions || isLoadingEntity\n const featuredActionsToDisplay = isLoading ? loadingActions : featuredActions\n\n return (\n <Styled.Actions className=\"actions\">\n {featuredActionsToDisplay.map((action, i) => (\n <Styled.FeaturedAction\n key={action.identifier + '-' + i}\n className={clsx('action', {\n loading: isLoading,\n isPlaceholder: action.isPlaceholder,\n })}\n data-tooltip={action.groupLabel ? action.groupLabel + ' ' + action.label : action.label}\n disabled={action.isPlaceholder}\n onClick={(e) => handleExecuteAction(action.identifier, e)}\n >\n {/* @ts-ignore */}\n <ActionIcon icon={action.icon} isExecuting={executingAction === action.identifier} />\n </Styled.FeaturedAction>\n ))}\n <ActionsDropdown\n options={dropdownOptions}\n isLoading={isLoading && featuredCount > 0}\n onAction={handleExecuteAction}\n onConfig={handleConfigureAction}\n />\n <ActionConfigDialog\n action={actionBeingConfigured}\n // @ts-expect-error\n context={context}\n onClose={() => setActionBeingConfigured(null)}\n />\n <InteractiveActionDialog\n interactiveForm={interactiveForm}\n onClose={() => setInteractiveForm(null)}\n // @ts-expect-error\n onSubmit={handleSubmitInteractiveForm}\n />\n </Styled.Actions>\n )\n}\n"],"names":["useActionTriggers","useState","useMemo","useEffect","useGetActionsFromContextQuery","actions","useExecuteActionMutation","toast","data","jsxs","Styled.Actions","jsx","Styled.FeaturedAction","ActionsDropdown","ActionConfigDialog","InteractiveActionDialog"],"mappings":"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"}
1
+ {"version":3,"file":"Actions.cjs.js","sources":["../../../../../src/containers/Actions/Actions.tsx"],"sourcesContent":["import * as Styled from './Actions.styled'\nimport { MouseEvent, useState } from 'react'\nimport clsx from 'clsx'\nimport { toast } from 'react-toastify'\nimport { useMemo, useEffect } from 'react'\nimport { ActionContext, useExecuteActionMutation, useGetActionsFromContextQuery } from '@shared/api'\nimport { ActionsDropdown, ActionsDropdownProps } from './ActionsDropdown'\nimport ActionIcon from './ActionIcon'\nimport { ActionTriggersProps, useActionTriggers } from '@shared/hooks'\nimport { ActionConfigDialog } from './ActionConfigDialog'\nimport { InteractiveActionDialog, InteractiveForm } from './InteractiveActionDialog'\n\nconst placeholder = {\n identifier: 'placeholder',\n label: 'Featured action slot',\n isPlaceholder: true,\n icon: { type: 'material-symbols', name: 'sync' },\n groupLabel: '',\n}\n\ninterface ActionsProps extends ActionTriggersProps {\n entities: { id: string; projectName: string; entitySubType?: string }[]\n entityType: ActionContext['entityType']\n entitySubTypes?: string[]\n isLoadingEntity: boolean\n projectActionsProjectName?: string\n featuredCount?: number\n isDeveloperMode: boolean\n align?: ActionsDropdownProps['align']\n pt?: {\n dropdown?: Partial<ActionsDropdownProps>\n }\n}\n\nexport const Actions = ({\n entities,\n entityType,\n entitySubTypes,\n isLoadingEntity,\n projectActionsProjectName,\n searchParams,\n featuredCount = 2,\n isDeveloperMode,\n onNavigate,\n onSetSearchParams,\n align,\n pt,\n}: ActionsProps) => {\n // special triggers the actions can make to perform stuff on the client\n const { handleActionPayload } = useActionTriggers({ onNavigate, onSetSearchParams, searchParams })\n const [actionBeingConfigured, setActionBeingConfigured] = useState<any>(null)\n const [interactiveForm, setInteractiveForm] = useState<any>(null)\n\n const context: ActionContext | null = useMemo(() => {\n if (projectActionsProjectName) {\n return {\n entityType: 'project',\n projectName: projectActionsProjectName,\n }\n }\n if (!entities.length) return null\n if (!entities[0].projectName) return null\n\n // get a list of unique entity subtypes from loaded data\n const entitySubtypesLoaded = entities\n .filter((entity) => entity.entitySubType)\n .map((entity) => entity.entitySubType as string)\n .filter((value, index, self) => self.indexOf(value) === index && value)\n\n // try and use the passed in entitySubTypes, if not use the loaded ones\n const entitySubTypesToUse = entitySubTypes?.length ? entitySubTypes : entitySubtypesLoaded\n\n // all types except version/representation should have subtypes\n if (\n !entitySubTypesToUse?.length &&\n entityType !== 'version' &&\n entityType !== 'representation'\n ) {\n console.warn('No entity subtypes found')\n return null\n }\n\n return {\n projectName: entities[0].projectName,\n entityType: entityType,\n entityIds: entities.map((entity) => entity.id),\n entitySubtypes: entitySubTypesToUse,\n }\n }, [entities, entityType])\n\n useEffect(() => {\n setInteractiveForm(null)\n }, [context])\n\n const { data, isFetching: isFetchingActions } = useGetActionsFromContextQuery(\n { mode: 'simple', actionContext: context as ActionContext },\n { skip: !context },\n )\n\n const actions = data?.actions || []\n\n const categoryOrder = ['application', 'admin', 'workflow']\n // group actions by category\n // sort by hardcoded category, this will changing the future\n const groupedActions = useMemo(() => {\n // Step 1: Group actions by category\n const grouped = actions.reduce((acc: { [key: string]: any[] }, action) => {\n const category = action.category || 'uncategorized'\n if (!acc[category]) {\n acc[category] = []\n }\n acc[category].push(action)\n return acc\n }, {})\n\n // Step 5: Return the ordered groups\n return grouped\n }, [actions])\n\n // get categories that don't have a specific order (not in categoryOrder)\n // then sort them alphabetically\n const unorderedCategories = useMemo(\n () => [\n ...new Set(\n Object.keys(groupedActions)\n .filter((category) => !categoryOrder.includes(category))\n .sort((a, b) => a.localeCompare(b)),\n ),\n ],\n [groupedActions],\n )\n\n const categories = [...categoryOrder, ...unorderedCategories]\n\n // create the options for the dropdown, each category is separated by a divider and a title\n // for the divider we will use a custom dropdown item template\n const dropdownOptions = useMemo(() => {\n const options = []\n\n categories.forEach((category) => {\n if (!groupedActions[category] || !groupedActions[category].length) return\n\n options.push({\n label: category,\n header: true,\n value: category,\n disabled: true,\n })\n\n const groupOptions = groupedActions[category].map((action) => ({\n value: action.identifier,\n label: action.groupLabel ? action.groupLabel + ' ' + action.label : action.label,\n icon: action.icon,\n hasConfig: !!action.configFields,\n }))\n\n options.push(...groupOptions)\n })\n\n // if no actions, add placeholder\n if (!options.length) {\n options.push({\n label: 'No actions available',\n value: 'no-actions',\n disabled: true,\n header: true,\n })\n }\n\n return options\n }, [groupedActions, unorderedCategories, categoryOrder])\n\n const featuredActions = useMemo(() => {\n // Filter and sort to get initial featured actions\n let tempFeaturedActions = actions\n .filter((action) => action.featured)\n .sort((a, b) => (a.order || 0) - (b.order || 0))\n .slice(0, featuredCount)\n\n // Check if we need to add more actions to reach featuredCount\n if (tempFeaturedActions.length < featuredCount) {\n categories.forEach((category) => {\n if (tempFeaturedActions.length >= featuredCount) return\n const actions = groupedActions[category]\n if (!actions || !actions.length) return\n\n for (let i = tempFeaturedActions.length; i < featuredCount; i++) {\n const action = actions[i]\n if (!action) break\n if (!action.icon) continue\n tempFeaturedActions.push(action)\n }\n })\n }\n\n return tempFeaturedActions\n }, [actions, groupedActions, placeholder])\n\n const [executeAction, { isLoading: isLoadingExecution, originalArgs }] =\n useExecuteActionMutation()\n const executingAction = isLoadingExecution && originalArgs?.identifier\n\n const handleExecuteAction = async (\n identifier: string,\n e?: MouseEvent<HTMLElement> | null,\n formData?: InteractiveForm,\n ) => {\n e?.preventDefault()\n const action = actions.find((option) => option.identifier === identifier)\n\n if (!action) {\n toast.error('Action not found')\n console.warn('Action not found', identifier)\n return\n }\n\n const params = {\n addonName: action.addonName as string,\n addonVersion: action.addonVersion as string,\n variant: action.variant,\n identifier: action.identifier,\n }\n\n const actionContext = { ...context }\n if (formData) {\n actionContext.formData = formData\n }\n\n let response = null\n\n try {\n response = await executeAction({ actionContext, ...params }).unwrap()\n } catch (error: any) {\n console.error('Error executing action', error)\n toast.error(error?.data?.detail || 'Error executing action')\n return\n }\n\n try {\n // Toast the message if it is available\n if (response?.message) {\n if (response?.success) {\n toast.success(response.message, { autoClose: 2000 })\n } else {\n toast.error(response.message, { autoClose: 2000 })\n }\n }\n\n // Even if response?.success is false, we still want to handle the payload\n // as it may contain useful information - complex error messages in form,\n // redirect to another page etc. If the action just needs to abort,\n // it raises exception instead of returning a response with success: false\n\n // Use the new hook to handle payload\n if (response?.payload) {\n if (response.type === 'form') {\n // action requests additional information from the user.\n // we show a dialog with the form and when the user submits it we call the action again\n\n // It probably does not make sense to move to the useActionTriggers hook\n // as it need contexts and the dialog\n const intf = {\n identifier,\n // @ts-expect-error\n title: response.payload['title'],\n // @ts-expect-error\n fields: response.payload['fields'],\n // @ts-expect-error\n submitLabel: response.payload['submit_label'],\n // @ts-expect-error\n cancelLabel: response.payload['cancel_label'],\n // @ts-expect-error\n submitIcon: response.payload['submit_icon'],\n // @ts-expect-error\n cancelIcon: response.payload['cancel_icon'],\n }\n setInteractiveForm(intf)\n } else {\n handleActionPayload(response.type as string, response.payload)\n }\n }\n } catch (error) {\n // got response, but failed to process it\n console.warn('Error during action response processing', error)\n toast.error('Error occured during action processing')\n }\n }\n\n const handleConfigureAction = (identifier: string) => {\n const action = actions.find((data) => data.identifier === identifier)\n if (!action) return\n setActionBeingConfigured(action)\n }\n\n const handleSubmitInteractiveForm = async (identifier: string, formData: InteractiveForm) => {\n handleExecuteAction(identifier, null, formData)\n }\n\n const loadingActions = useMemo(\n () => Array(featuredCount).fill(placeholder),\n [featuredCount, placeholder],\n )\n\n const isLoading = isFetchingActions || isLoadingEntity\n const featuredActionsToDisplay = isLoading ? loadingActions : featuredActions\n\n return (\n <Styled.Actions className=\"actions\">\n {featuredActionsToDisplay.map((action, i) => (\n <Styled.FeaturedAction\n key={action.identifier + '-' + i}\n className={clsx('action', {\n loading: isLoading,\n isPlaceholder: action.isPlaceholder,\n })}\n data-tooltip={action.groupLabel ? action.groupLabel + ' ' + action.label : action.label}\n disabled={action.isPlaceholder}\n onClick={(e) => handleExecuteAction(action.identifier, e)}\n >\n {/* @ts-ignore */}\n <ActionIcon icon={action.icon} isExecuting={executingAction === action.identifier} />\n </Styled.FeaturedAction>\n ))}\n <ActionsDropdown\n options={dropdownOptions}\n isLoading={isLoading && featuredCount > 0}\n onAction={handleExecuteAction}\n onConfig={handleConfigureAction}\n isDeveloperMode={isDeveloperMode}\n align={align}\n {...pt?.dropdown}\n />\n <ActionConfigDialog\n action={actionBeingConfigured}\n // @ts-expect-error\n context={context}\n onClose={() => setActionBeingConfigured(null)}\n />\n <InteractiveActionDialog\n interactiveForm={interactiveForm}\n onClose={() => setInteractiveForm(null)}\n // @ts-expect-error\n onSubmit={handleSubmitInteractiveForm}\n />\n </Styled.Actions>\n )\n}\n"],"names":["useActionTriggers","useState","useMemo","useEffect","useGetActionsFromContextQuery","actions","useExecuteActionMutation","toast","data","jsxs","Styled.Actions","jsx","Styled.FeaturedAction","ActionsDropdown","ActionConfigDialog","InteractiveActionDialog"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,MAAM,cAAc;AAAA,EAClB,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,eAAe;AAAA,EACf,MAAM,EAAE,MAAM,oBAAoB,MAAM,OAAO;AAAA,EAC/C,YAAY;AACd;AAgBO,MAAM,UAAU,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAoB;AAEZ,QAAA,EAAE,wBAAwBA,kBAAA,kBAAkB,EAAE,YAAY,mBAAmB,cAAc;AACjG,QAAM,CAAC,uBAAuB,wBAAwB,IAAIC,MAAAA,SAAc,IAAI;AAC5E,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,MAAAA,SAAc,IAAI;AAE1D,QAAA,UAAgCC,MAAAA,QAAQ,MAAM;AAClD,QAAI,2BAA2B;AACtB,aAAA;AAAA,QACL,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IAAA;AAEE,QAAA,CAAC,SAAS,OAAe,QAAA;AAC7B,QAAI,CAAC,SAAS,CAAC,EAAE,YAAoB,QAAA;AAG/B,UAAA,uBAAuB,SAC1B,OAAO,CAAC,WAAW,OAAO,aAAa,EACvC,IAAI,CAAC,WAAW,OAAO,aAAuB,EAC9C,OAAO,CAAC,OAAO,OAAO,SAAS,KAAK,QAAQ,KAAK,MAAM,SAAS,KAAK;AAGlE,UAAA,uBAAsB,iDAAgB,UAAS,iBAAiB;AAGtE,QACE,EAAC,2DAAqB,WACtB,eAAe,aACf,eAAe,kBACf;AACA,cAAQ,KAAK,0BAA0B;AAChC,aAAA;AAAA,IAAA;AAGF,WAAA;AAAA,MACL,aAAa,SAAS,CAAC,EAAE;AAAA,MACzB;AAAA,MACA,WAAW,SAAS,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,MAC7C,gBAAgB;AAAA,IAClB;AAAA,EAAA,GACC,CAAC,UAAU,UAAU,CAAC;AAEzBC,QAAAA,UAAU,MAAM;AACd,uBAAmB,IAAI;AAAA,EAAA,GACtB,CAAC,OAAO,CAAC;AAEZ,QAAM,EAAE,MAAM,YAAY,kBAAsB,IAAAC,WAAA;AAAA,IAC9C,EAAE,MAAM,UAAU,eAAe,QAAyB;AAAA,IAC1D,EAAE,MAAM,CAAC,QAAQ;AAAA,EACnB;AAEM,QAAA,WAAU,6BAAM,YAAW,CAAC;AAElC,QAAM,gBAAgB,CAAC,eAAe,SAAS,UAAU;AAGnD,QAAA,iBAAiBF,MAAAA,QAAQ,MAAM;AAEnC,UAAM,UAAU,QAAQ,OAAO,CAAC,KAA+B,WAAW;AAClE,YAAA,WAAW,OAAO,YAAY;AAChC,UAAA,CAAC,IAAI,QAAQ,GAAG;AACd,YAAA,QAAQ,IAAI,CAAC;AAAA,MAAA;AAEf,UAAA,QAAQ,EAAE,KAAK,MAAM;AAClB,aAAA;AAAA,IACT,GAAG,EAAE;AAGE,WAAA;AAAA,EAAA,GACN,CAAC,OAAO,CAAC;AAIZ,QAAM,sBAAsBA,MAAA;AAAA,IAC1B,MAAM;AAAA,MACJ,GAAG,IAAI;AAAA,QACL,OAAO,KAAK,cAAc,EACvB,OAAO,CAAC,aAAa,CAAC,cAAc,SAAS,QAAQ,CAAC,EACtD,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,MAAA;AAAA,IAExC;AAAA,IACA,CAAC,cAAc;AAAA,EACjB;AAEA,QAAM,aAAa,CAAC,GAAG,eAAe,GAAG,mBAAmB;AAItD,QAAA,kBAAkBA,MAAAA,QAAQ,MAAM;AACpC,UAAM,UAAU,CAAC;AAEN,eAAA,QAAQ,CAAC,aAAa;AAC3B,UAAA,CAAC,eAAe,QAAQ,KAAK,CAAC,eAAe,QAAQ,EAAE,OAAQ;AAEnE,cAAQ,KAAK;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU;AAAA,MAAA,CACX;AAED,YAAM,eAAe,eAAe,QAAQ,EAAE,IAAI,CAAC,YAAY;AAAA,QAC7D,OAAO,OAAO;AAAA,QACd,OAAO,OAAO,aAAa,OAAO,aAAa,MAAM,OAAO,QAAQ,OAAO;AAAA,QAC3E,MAAM,OAAO;AAAA,QACb,WAAW,CAAC,CAAC,OAAO;AAAA,MAAA,EACpB;AAEM,cAAA,KAAK,GAAG,YAAY;AAAA,IAAA,CAC7B;AAGG,QAAA,CAAC,QAAQ,QAAQ;AACnB,cAAQ,KAAK;AAAA,QACX,OAAO;AAAA,QACP,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,MAAA,CACT;AAAA,IAAA;AAGI,WAAA;AAAA,EACN,GAAA,CAAC,gBAAgB,qBAAqB,aAAa,CAAC;AAEjD,QAAA,kBAAkBA,MAAAA,QAAQ,MAAM;AAEhC,QAAA,sBAAsB,QACvB,OAAO,CAAC,WAAW,OAAO,QAAQ,EAClC,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE,EAC9C,MAAM,GAAG,aAAa;AAGrB,QAAA,oBAAoB,SAAS,eAAe;AACnC,iBAAA,QAAQ,CAAC,aAAa;AAC3B,YAAA,oBAAoB,UAAU,cAAe;AAC3CG,cAAAA,WAAU,eAAe,QAAQ;AACvC,YAAI,CAACA,YAAW,CAACA,SAAQ,OAAQ;AAEjC,iBAAS,IAAI,oBAAoB,QAAQ,IAAI,eAAe,KAAK;AACzD,gBAAA,SAASA,SAAQ,CAAC;AACxB,cAAI,CAAC,OAAQ;AACT,cAAA,CAAC,OAAO,KAAM;AAClB,8BAAoB,KAAK,MAAM;AAAA,QAAA;AAAA,MACjC,CACD;AAAA,IAAA;AAGI,WAAA;AAAA,EACN,GAAA,CAAC,SAAS,gBAAgB,WAAW,CAAC;AAEnC,QAAA,CAAC,eAAe,EAAE,WAAW,oBAAoB,aAAa,CAAC,IACnEC,oCAAyB;AACrB,QAAA,kBAAkB,uBAAsB,6CAAc;AAE5D,QAAM,sBAAsB,OAC1B,YACA,GACA,aACG;;AACH,2BAAG;AACH,UAAM,SAAS,QAAQ,KAAK,CAAC,WAAW,OAAO,eAAe,UAAU;AAExE,QAAI,CAAC,QAAQ;AACXC,oBAAA,MAAM,MAAM,kBAAkB;AACtB,cAAA,KAAK,oBAAoB,UAAU;AAC3C;AAAA,IAAA;AAGF,UAAM,SAAS;AAAA,MACb,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,IACrB;AAEM,UAAA,gBAAgB,EAAE,GAAG,QAAQ;AACnC,QAAI,UAAU;AACZ,oBAAc,WAAW;AAAA,IAAA;AAG3B,QAAI,WAAW;AAEX,QAAA;AACS,iBAAA,MAAM,cAAc,EAAE,eAAe,GAAG,OAAO,CAAC,EAAE,OAAO;AAAA,aAC7D,OAAY;AACX,cAAA,MAAM,0BAA0B,KAAK;AAC7CA,oBAAAA,MAAM,QAAM,oCAAO,SAAP,mBAAa,WAAU,wBAAwB;AAC3D;AAAA,IAAA;AAGE,QAAA;AAEF,UAAI,qCAAU,SAAS;AACrB,YAAI,qCAAU,SAAS;AACrBA,wBAAA,MAAM,QAAQ,SAAS,SAAS,EAAE,WAAW,KAAM;AAAA,QAAA,OAC9C;AACLA,wBAAA,MAAM,MAAM,SAAS,SAAS,EAAE,WAAW,KAAM;AAAA,QAAA;AAAA,MACnD;AASF,UAAI,qCAAU,SAAS;AACjB,YAAA,SAAS,SAAS,QAAQ;AAM5B,gBAAM,OAAO;AAAA,YACX;AAAA;AAAA,YAEA,OAAO,SAAS,QAAQ,OAAO;AAAA;AAAA,YAE/B,QAAQ,SAAS,QAAQ,QAAQ;AAAA;AAAA,YAEjC,aAAa,SAAS,QAAQ,cAAc;AAAA;AAAA,YAE5C,aAAa,SAAS,QAAQ,cAAc;AAAA;AAAA,YAE5C,YAAY,SAAS,QAAQ,aAAa;AAAA;AAAA,YAE1C,YAAY,SAAS,QAAQ,aAAa;AAAA,UAC5C;AACA,6BAAmB,IAAI;AAAA,QAAA,OAClB;AACe,8BAAA,SAAS,MAAgB,SAAS,OAAO;AAAA,QAAA;AAAA,MAC/D;AAAA,aAEK,OAAO;AAEN,cAAA,KAAK,2CAA2C,KAAK;AAC7DA,oBAAA,MAAM,MAAM,wCAAwC;AAAA,IAAA;AAAA,EAExD;AAEM,QAAA,wBAAwB,CAAC,eAAuB;AACpD,UAAM,SAAS,QAAQ,KAAK,CAACC,UAASA,MAAK,eAAe,UAAU;AACpE,QAAI,CAAC,OAAQ;AACb,6BAAyB,MAAM;AAAA,EACjC;AAEM,QAAA,8BAA8B,OAAO,YAAoB,aAA8B;AACvE,wBAAA,YAAY,MAAM,QAAQ;AAAA,EAChD;AAEA,QAAM,iBAAiBN,MAAA;AAAA,IACrB,MAAM,MAAM,aAAa,EAAE,KAAK,WAAW;AAAA,IAC3C,CAAC,eAAe,WAAW;AAAA,EAC7B;AAEA,QAAM,YAAY,qBAAqB;AACjC,QAAA,2BAA2B,YAAY,iBAAiB;AAE9D,SACGO,2BAAA,kBAAA,KAAAC,eAAA,SAAA,EAAe,WAAU,WACvB,UAAA;AAAA,IAAyB,yBAAA,IAAI,CAAC,QAAQ,MACrCC,2BAAA,kBAAA;AAAA,MAACC,eAAO;AAAA,MAAP;AAAA,QAEC,WAAW,KAAK,UAAU;AAAA,UACxB,SAAS;AAAA,UACT,eAAe,OAAO;AAAA,QAAA,CACvB;AAAA,QACD,gBAAc,OAAO,aAAa,OAAO,aAAa,MAAM,OAAO,QAAQ,OAAO;AAAA,QAClF,UAAU,OAAO;AAAA,QACjB,SAAS,CAAC,MAAM,oBAAoB,OAAO,YAAY,CAAC;AAAA,QAGxD,UAAAD,2BAAA,kBAAA,IAAC,cAAW,MAAM,OAAO,MAAM,aAAa,oBAAoB,OAAO,WAAY,CAAA;AAAA,MAAA;AAAA,MAV9E,OAAO,aAAa,MAAM;AAAA,IAAA,CAYlC;AAAA,IACDA,2BAAA,kBAAA;AAAA,MAACE,gBAAA;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAW,aAAa,gBAAgB;AAAA,QACxC,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACC,GAAG,yBAAI;AAAA,MAAA;AAAA,IACV;AAAA,IACAF,2BAAA,kBAAA;AAAA,MAACG,mBAAA;AAAA,MAAA;AAAA,QACC,QAAQ;AAAA,QAER;AAAA,QACA,SAAS,MAAM,yBAAyB,IAAI;AAAA,MAAA;AAAA,IAC9C;AAAA,IACAH,2BAAA,kBAAA;AAAA,MAACI,wBAAA;AAAA,MAAA;AAAA,QACC;AAAA,QACA,SAAS,MAAM,mBAAmB,IAAI;AAAA,QAEtC,UAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EACZ,GACF;AAEJ;;"}
@@ -105,8 +105,11 @@ const Actions = ({
105
105
  projectActionsProjectName,
106
106
  searchParams,
107
107
  featuredCount = 2,
108
+ isDeveloperMode,
108
109
  onNavigate,
109
- onSetSearchParams
110
+ onSetSearchParams,
111
+ align,
112
+ pt
110
113
  }) => {
111
114
  const { handleActionPayload } = useActionTriggers({ onNavigate, onSetSearchParams, searchParams });
112
115
  const [actionBeingConfigured, setActionBeingConfigured] = useState(null);
@@ -306,7 +309,10 @@ const Actions = ({
306
309
  options: dropdownOptions,
307
310
  isLoading: isLoading && featuredCount > 0,
308
311
  onAction: handleExecuteAction,
309
- onConfig: handleConfigureAction
312
+ onConfig: handleConfigureAction,
313
+ isDeveloperMode,
314
+ align,
315
+ ...pt == null ? void 0 : pt.dropdown
310
316
  }
311
317
  ),
312
318
  /* @__PURE__ */ jsxRuntimeExports.jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"Actions.es.js","sources":["../../../../../src/containers/Actions/Actions.tsx"],"sourcesContent":["import * as Styled from './Actions.styled'\nimport { MouseEvent, useState } from 'react'\nimport clsx from 'clsx'\nimport { toast } from 'react-toastify'\nimport { useMemo, useEffect } from 'react'\nimport { ActionContext, useExecuteActionMutation, useGetActionsFromContextQuery } from '@shared/api'\nimport { ActionsDropdown } from './ActionsDropdown'\nimport ActionIcon from './ActionIcon'\nimport { ActionTriggersProps, useActionTriggers } from '@shared/hooks'\nimport { ActionConfigDialog } from './ActionConfigDialog'\nimport { InteractiveActionDialog, InteractiveForm } from './InteractiveActionDialog'\n\nconst placeholder = {\n identifier: 'placeholder',\n label: 'Featured action slot',\n isPlaceholder: true,\n icon: { type: 'material-symbols', name: 'sync' },\n groupLabel: '',\n}\n\ninterface ActionsProps extends ActionTriggersProps {\n entities: { id: string; projectName: string; entitySubType?: string }[]\n entityType: ActionContext['entityType']\n entitySubTypes?: string[]\n isLoadingEntity: boolean\n projectActionsProjectName?: string\n featuredCount?: number\n}\n\nexport const Actions = ({\n entities,\n entityType,\n entitySubTypes,\n isLoadingEntity,\n projectActionsProjectName,\n searchParams,\n featuredCount = 2,\n onNavigate,\n onSetSearchParams,\n}: ActionsProps) => {\n // special triggers the actions can make to perform stuff on the client\n const { handleActionPayload } = useActionTriggers({ onNavigate, onSetSearchParams, searchParams })\n const [actionBeingConfigured, setActionBeingConfigured] = useState<any>(null)\n const [interactiveForm, setInteractiveForm] = useState<any>(null)\n\n const context: ActionContext | null = useMemo(() => {\n if (projectActionsProjectName){\n return {\n entityType: 'project',\n projectName: projectActionsProjectName,\n }\n }\n if (!entities.length) return null\n if (!entities[0].projectName) return null\n\n // get a list of unique entity subtypes from loaded data\n const entitySubtypesLoaded = entities\n .filter((entity) => entity.entitySubType)\n .map((entity) => entity.entitySubType as string)\n .filter((value, index, self) => self.indexOf(value) === index && value)\n\n // try and use the passed in entitySubTypes, if not use the loaded ones\n const entitySubTypesToUse = entitySubTypes?.length ? entitySubTypes : entitySubtypesLoaded\n\n // all types except version/representation should have subtypes\n if (\n !entitySubTypesToUse?.length &&\n entityType !== 'version' &&\n entityType !== 'representation'\n ) {\n console.warn('No entity subtypes found')\n return null\n }\n\n return {\n projectName: entities[0].projectName,\n entityType: entityType,\n entityIds: entities.map((entity) => entity.id),\n entitySubtypes: entitySubTypesToUse,\n }\n }, [entities, entityType])\n\n useEffect(() => {\n setInteractiveForm(null)\n }, [context])\n\n const { data, isFetching: isFetchingActions } = useGetActionsFromContextQuery(\n { mode: 'simple', actionContext: context as ActionContext },\n { skip: !context },\n )\n\n const actions = data?.actions || []\n\n const categoryOrder = ['application', 'admin', 'workflow']\n // group actions by category\n // sort by hardcoded category, this will changing the future\n const groupedActions = useMemo(() => {\n // Step 1: Group actions by category\n const grouped = actions.reduce((acc: { [key: string]: any[] }, action) => {\n const category = action.category || 'uncategorized'\n if (!acc[category]) {\n acc[category] = []\n }\n acc[category].push(action)\n return acc\n }, {})\n\n // Step 5: Return the ordered groups\n return grouped\n }, [actions])\n\n // get categories that don't have a specific order (not in categoryOrder)\n // then sort them alphabetically\n const unorderedCategories = useMemo(\n () => [\n ...new Set(\n Object.keys(groupedActions)\n .filter((category) => !categoryOrder.includes(category))\n .sort((a, b) => a.localeCompare(b)),\n ),\n ],\n [groupedActions],\n )\n\n const categories = [...categoryOrder, ...unorderedCategories]\n\n // create the options for the dropdown, each category is separated by a divider and a title\n // for the divider we will use a custom dropdown item template\n const dropdownOptions = useMemo(() => {\n const options = []\n\n categories.forEach((category) => {\n if (!groupedActions[category] || !groupedActions[category].length) return\n\n options.push({\n label: category,\n header: true,\n value: category,\n disabled: true,\n })\n\n const groupOptions = groupedActions[category].map((action) => ({\n value: action.identifier,\n label: action.groupLabel ? action.groupLabel + ' ' + action.label : action.label,\n icon: action.icon,\n hasConfig: !!action.configFields,\n }))\n\n options.push(...groupOptions)\n })\n\n // if no actions, add placeholder\n if (!options.length) {\n options.push({\n label: 'No actions available',\n value: 'no-actions',\n disabled: true,\n header: true,\n })\n }\n\n return options\n }, [groupedActions, unorderedCategories, categoryOrder])\n\n const featuredActions = useMemo(() => {\n // Filter and sort to get initial featured actions\n let tempFeaturedActions = actions\n .filter((action) => action.featured)\n .sort((a, b) => (a.order || 0) - (b.order || 0))\n .slice(0, featuredCount)\n\n // Check if we need to add more actions to reach featuredCount\n if (tempFeaturedActions.length < featuredCount) {\n categories.forEach((category) => {\n if (tempFeaturedActions.length >= featuredCount) return\n const actions = groupedActions[category]\n if (!actions || !actions.length) return\n\n for (let i = tempFeaturedActions.length; i < featuredCount; i++) {\n const action = actions[i]\n if (!action) break\n if (!action.icon) continue\n tempFeaturedActions.push(action)\n }\n })\n }\n\n return tempFeaturedActions\n }, [actions, groupedActions, placeholder])\n\n const [executeAction, { isLoading: isLoadingExecution, originalArgs }] =\n useExecuteActionMutation()\n const executingAction = isLoadingExecution && originalArgs?.identifier\n\n const handleExecuteAction = async (\n identifier: string,\n e?: MouseEvent<HTMLElement> | null,\n formData?: InteractiveForm,\n ) => {\n e?.preventDefault()\n const action = actions.find((option) => option.identifier === identifier)\n\n if (!action) {\n toast.error('Action not found')\n console.warn('Action not found', identifier)\n return\n }\n\n const params = {\n addonName: action.addonName as string,\n addonVersion: action.addonVersion as string,\n variant: action.variant,\n identifier: action.identifier,\n }\n\n const actionContext = { ...context }\n if (formData) {\n actionContext.formData = formData\n }\n\n let response = null\n\n try {\n response = await executeAction({ actionContext, ...params }).unwrap()\n } catch (error: any) {\n console.error('Error executing action', error)\n toast.error(error?.data?.detail || 'Error executing action')\n return\n }\n\n try {\n // Toast the message if it is available\n if (response?.message) {\n if (response?.success) {\n toast.success(response.message, { autoClose: 2000 })\n } else {\n toast.error(response.message, { autoClose: 2000 })\n }\n }\n\n // Even if response?.success is false, we still want to handle the payload\n // as it may contain useful information - complex error messages in form,\n // redirect to another page etc. If the action just needs to abort,\n // it raises exception instead of returning a response with success: false\n\n // Use the new hook to handle payload\n if (response?.payload) {\n if (response.type === 'form') {\n // action requests additional information from the user.\n // we show a dialog with the form and when the user submits it we call the action again\n\n // It probably does not make sense to move to the useActionTriggers hook\n // as it need contexts and the dialog\n const intf = {\n identifier,\n // @ts-expect-error\n title: response.payload['title'],\n // @ts-expect-error\n fields: response.payload['fields'],\n // @ts-expect-error\n submitLabel: response.payload['submit_label'],\n // @ts-expect-error\n cancelLabel: response.payload['cancel_label'],\n // @ts-expect-error\n submitIcon: response.payload['submit_icon'],\n // @ts-expect-error\n cancelIcon: response.payload['cancel_icon'],\n }\n setInteractiveForm(intf)\n } else {\n handleActionPayload(response.type as string, response.payload)\n }\n }\n } catch (error) {\n // got response, but failed to process it\n console.warn('Error during action response processing', error)\n toast.error('Error occured during action processing')\n }\n }\n\n const handleConfigureAction = (identifier: string) => {\n const action = actions.find((data) => data.identifier === identifier)\n if (!action) return\n setActionBeingConfigured(action)\n }\n\n const handleSubmitInteractiveForm = async (identifier: string, formData: InteractiveForm) => {\n handleExecuteAction(identifier, null, formData)\n }\n\n const loadingActions = useMemo(\n () => Array(featuredCount).fill(placeholder),\n [featuredCount, placeholder],\n )\n\n const isLoading = isFetchingActions || isLoadingEntity\n const featuredActionsToDisplay = isLoading ? loadingActions : featuredActions\n\n return (\n <Styled.Actions className=\"actions\">\n {featuredActionsToDisplay.map((action, i) => (\n <Styled.FeaturedAction\n key={action.identifier + '-' + i}\n className={clsx('action', {\n loading: isLoading,\n isPlaceholder: action.isPlaceholder,\n })}\n data-tooltip={action.groupLabel ? action.groupLabel + ' ' + action.label : action.label}\n disabled={action.isPlaceholder}\n onClick={(e) => handleExecuteAction(action.identifier, e)}\n >\n {/* @ts-ignore */}\n <ActionIcon icon={action.icon} isExecuting={executingAction === action.identifier} />\n </Styled.FeaturedAction>\n ))}\n <ActionsDropdown\n options={dropdownOptions}\n isLoading={isLoading && featuredCount > 0}\n onAction={handleExecuteAction}\n onConfig={handleConfigureAction}\n />\n <ActionConfigDialog\n action={actionBeingConfigured}\n // @ts-expect-error\n context={context}\n onClose={() => setActionBeingConfigured(null)}\n />\n <InteractiveActionDialog\n interactiveForm={interactiveForm}\n onClose={() => setInteractiveForm(null)}\n // @ts-expect-error\n onSubmit={handleSubmitInteractiveForm}\n />\n </Styled.Actions>\n )\n}\n"],"names":["actions","data","jsxs","Styled.Actions","jsx","Styled.FeaturedAction"],"mappings":"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"}
1
+ {"version":3,"file":"Actions.es.js","sources":["../../../../../src/containers/Actions/Actions.tsx"],"sourcesContent":["import * as Styled from './Actions.styled'\nimport { MouseEvent, useState } from 'react'\nimport clsx from 'clsx'\nimport { toast } from 'react-toastify'\nimport { useMemo, useEffect } from 'react'\nimport { ActionContext, useExecuteActionMutation, useGetActionsFromContextQuery } from '@shared/api'\nimport { ActionsDropdown, ActionsDropdownProps } from './ActionsDropdown'\nimport ActionIcon from './ActionIcon'\nimport { ActionTriggersProps, useActionTriggers } from '@shared/hooks'\nimport { ActionConfigDialog } from './ActionConfigDialog'\nimport { InteractiveActionDialog, InteractiveForm } from './InteractiveActionDialog'\n\nconst placeholder = {\n identifier: 'placeholder',\n label: 'Featured action slot',\n isPlaceholder: true,\n icon: { type: 'material-symbols', name: 'sync' },\n groupLabel: '',\n}\n\ninterface ActionsProps extends ActionTriggersProps {\n entities: { id: string; projectName: string; entitySubType?: string }[]\n entityType: ActionContext['entityType']\n entitySubTypes?: string[]\n isLoadingEntity: boolean\n projectActionsProjectName?: string\n featuredCount?: number\n isDeveloperMode: boolean\n align?: ActionsDropdownProps['align']\n pt?: {\n dropdown?: Partial<ActionsDropdownProps>\n }\n}\n\nexport const Actions = ({\n entities,\n entityType,\n entitySubTypes,\n isLoadingEntity,\n projectActionsProjectName,\n searchParams,\n featuredCount = 2,\n isDeveloperMode,\n onNavigate,\n onSetSearchParams,\n align,\n pt,\n}: ActionsProps) => {\n // special triggers the actions can make to perform stuff on the client\n const { handleActionPayload } = useActionTriggers({ onNavigate, onSetSearchParams, searchParams })\n const [actionBeingConfigured, setActionBeingConfigured] = useState<any>(null)\n const [interactiveForm, setInteractiveForm] = useState<any>(null)\n\n const context: ActionContext | null = useMemo(() => {\n if (projectActionsProjectName) {\n return {\n entityType: 'project',\n projectName: projectActionsProjectName,\n }\n }\n if (!entities.length) return null\n if (!entities[0].projectName) return null\n\n // get a list of unique entity subtypes from loaded data\n const entitySubtypesLoaded = entities\n .filter((entity) => entity.entitySubType)\n .map((entity) => entity.entitySubType as string)\n .filter((value, index, self) => self.indexOf(value) === index && value)\n\n // try and use the passed in entitySubTypes, if not use the loaded ones\n const entitySubTypesToUse = entitySubTypes?.length ? entitySubTypes : entitySubtypesLoaded\n\n // all types except version/representation should have subtypes\n if (\n !entitySubTypesToUse?.length &&\n entityType !== 'version' &&\n entityType !== 'representation'\n ) {\n console.warn('No entity subtypes found')\n return null\n }\n\n return {\n projectName: entities[0].projectName,\n entityType: entityType,\n entityIds: entities.map((entity) => entity.id),\n entitySubtypes: entitySubTypesToUse,\n }\n }, [entities, entityType])\n\n useEffect(() => {\n setInteractiveForm(null)\n }, [context])\n\n const { data, isFetching: isFetchingActions } = useGetActionsFromContextQuery(\n { mode: 'simple', actionContext: context as ActionContext },\n { skip: !context },\n )\n\n const actions = data?.actions || []\n\n const categoryOrder = ['application', 'admin', 'workflow']\n // group actions by category\n // sort by hardcoded category, this will changing the future\n const groupedActions = useMemo(() => {\n // Step 1: Group actions by category\n const grouped = actions.reduce((acc: { [key: string]: any[] }, action) => {\n const category = action.category || 'uncategorized'\n if (!acc[category]) {\n acc[category] = []\n }\n acc[category].push(action)\n return acc\n }, {})\n\n // Step 5: Return the ordered groups\n return grouped\n }, [actions])\n\n // get categories that don't have a specific order (not in categoryOrder)\n // then sort them alphabetically\n const unorderedCategories = useMemo(\n () => [\n ...new Set(\n Object.keys(groupedActions)\n .filter((category) => !categoryOrder.includes(category))\n .sort((a, b) => a.localeCompare(b)),\n ),\n ],\n [groupedActions],\n )\n\n const categories = [...categoryOrder, ...unorderedCategories]\n\n // create the options for the dropdown, each category is separated by a divider and a title\n // for the divider we will use a custom dropdown item template\n const dropdownOptions = useMemo(() => {\n const options = []\n\n categories.forEach((category) => {\n if (!groupedActions[category] || !groupedActions[category].length) return\n\n options.push({\n label: category,\n header: true,\n value: category,\n disabled: true,\n })\n\n const groupOptions = groupedActions[category].map((action) => ({\n value: action.identifier,\n label: action.groupLabel ? action.groupLabel + ' ' + action.label : action.label,\n icon: action.icon,\n hasConfig: !!action.configFields,\n }))\n\n options.push(...groupOptions)\n })\n\n // if no actions, add placeholder\n if (!options.length) {\n options.push({\n label: 'No actions available',\n value: 'no-actions',\n disabled: true,\n header: true,\n })\n }\n\n return options\n }, [groupedActions, unorderedCategories, categoryOrder])\n\n const featuredActions = useMemo(() => {\n // Filter and sort to get initial featured actions\n let tempFeaturedActions = actions\n .filter((action) => action.featured)\n .sort((a, b) => (a.order || 0) - (b.order || 0))\n .slice(0, featuredCount)\n\n // Check if we need to add more actions to reach featuredCount\n if (tempFeaturedActions.length < featuredCount) {\n categories.forEach((category) => {\n if (tempFeaturedActions.length >= featuredCount) return\n const actions = groupedActions[category]\n if (!actions || !actions.length) return\n\n for (let i = tempFeaturedActions.length; i < featuredCount; i++) {\n const action = actions[i]\n if (!action) break\n if (!action.icon) continue\n tempFeaturedActions.push(action)\n }\n })\n }\n\n return tempFeaturedActions\n }, [actions, groupedActions, placeholder])\n\n const [executeAction, { isLoading: isLoadingExecution, originalArgs }] =\n useExecuteActionMutation()\n const executingAction = isLoadingExecution && originalArgs?.identifier\n\n const handleExecuteAction = async (\n identifier: string,\n e?: MouseEvent<HTMLElement> | null,\n formData?: InteractiveForm,\n ) => {\n e?.preventDefault()\n const action = actions.find((option) => option.identifier === identifier)\n\n if (!action) {\n toast.error('Action not found')\n console.warn('Action not found', identifier)\n return\n }\n\n const params = {\n addonName: action.addonName as string,\n addonVersion: action.addonVersion as string,\n variant: action.variant,\n identifier: action.identifier,\n }\n\n const actionContext = { ...context }\n if (formData) {\n actionContext.formData = formData\n }\n\n let response = null\n\n try {\n response = await executeAction({ actionContext, ...params }).unwrap()\n } catch (error: any) {\n console.error('Error executing action', error)\n toast.error(error?.data?.detail || 'Error executing action')\n return\n }\n\n try {\n // Toast the message if it is available\n if (response?.message) {\n if (response?.success) {\n toast.success(response.message, { autoClose: 2000 })\n } else {\n toast.error(response.message, { autoClose: 2000 })\n }\n }\n\n // Even if response?.success is false, we still want to handle the payload\n // as it may contain useful information - complex error messages in form,\n // redirect to another page etc. If the action just needs to abort,\n // it raises exception instead of returning a response with success: false\n\n // Use the new hook to handle payload\n if (response?.payload) {\n if (response.type === 'form') {\n // action requests additional information from the user.\n // we show a dialog with the form and when the user submits it we call the action again\n\n // It probably does not make sense to move to the useActionTriggers hook\n // as it need contexts and the dialog\n const intf = {\n identifier,\n // @ts-expect-error\n title: response.payload['title'],\n // @ts-expect-error\n fields: response.payload['fields'],\n // @ts-expect-error\n submitLabel: response.payload['submit_label'],\n // @ts-expect-error\n cancelLabel: response.payload['cancel_label'],\n // @ts-expect-error\n submitIcon: response.payload['submit_icon'],\n // @ts-expect-error\n cancelIcon: response.payload['cancel_icon'],\n }\n setInteractiveForm(intf)\n } else {\n handleActionPayload(response.type as string, response.payload)\n }\n }\n } catch (error) {\n // got response, but failed to process it\n console.warn('Error during action response processing', error)\n toast.error('Error occured during action processing')\n }\n }\n\n const handleConfigureAction = (identifier: string) => {\n const action = actions.find((data) => data.identifier === identifier)\n if (!action) return\n setActionBeingConfigured(action)\n }\n\n const handleSubmitInteractiveForm = async (identifier: string, formData: InteractiveForm) => {\n handleExecuteAction(identifier, null, formData)\n }\n\n const loadingActions = useMemo(\n () => Array(featuredCount).fill(placeholder),\n [featuredCount, placeholder],\n )\n\n const isLoading = isFetchingActions || isLoadingEntity\n const featuredActionsToDisplay = isLoading ? loadingActions : featuredActions\n\n return (\n <Styled.Actions className=\"actions\">\n {featuredActionsToDisplay.map((action, i) => (\n <Styled.FeaturedAction\n key={action.identifier + '-' + i}\n className={clsx('action', {\n loading: isLoading,\n isPlaceholder: action.isPlaceholder,\n })}\n data-tooltip={action.groupLabel ? action.groupLabel + ' ' + action.label : action.label}\n disabled={action.isPlaceholder}\n onClick={(e) => handleExecuteAction(action.identifier, e)}\n >\n {/* @ts-ignore */}\n <ActionIcon icon={action.icon} isExecuting={executingAction === action.identifier} />\n </Styled.FeaturedAction>\n ))}\n <ActionsDropdown\n options={dropdownOptions}\n isLoading={isLoading && featuredCount > 0}\n onAction={handleExecuteAction}\n onConfig={handleConfigureAction}\n isDeveloperMode={isDeveloperMode}\n align={align}\n {...pt?.dropdown}\n />\n <ActionConfigDialog\n action={actionBeingConfigured}\n // @ts-expect-error\n context={context}\n onClose={() => setActionBeingConfigured(null)}\n />\n <InteractiveActionDialog\n interactiveForm={interactiveForm}\n onClose={() => setInteractiveForm(null)}\n // @ts-expect-error\n onSubmit={handleSubmitInteractiveForm}\n />\n </Styled.Actions>\n )\n}\n"],"names":["actions","data","jsxs","Styled.Actions","jsx","Styled.FeaturedAction"],"mappings":"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"}
@@ -59,8 +59,10 @@ const ActionsDropdownItem = ({
59
59
  const ActionsDropdown = ({
60
60
  options,
61
61
  isLoading,
62
+ isDeveloperMode,
62
63
  onAction,
63
- onConfig
64
+ onConfig,
65
+ ...props
64
66
  }) => {
65
67
  const dropdownRef = React.useRef(null);
66
68
  const handleConfigClick = (e) => {
@@ -73,7 +75,7 @@ const ActionsDropdown = ({
73
75
  {
74
76
  ref: dropdownRef,
75
77
  disabled: isLoading,
76
- className: clsx("more", { loading: isLoading }),
78
+ className: clsx("more", { loading: isLoading, dev: isDeveloperMode }),
77
79
  options,
78
80
  maxOptionsShown: 100,
79
81
  value: [],
@@ -81,7 +83,12 @@ const ActionsDropdown = ({
81
83
  itemTemplate: (option) => /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(ActionsDropdownItem, { ...option, onConfig: handleConfigClick }),
82
84
  valueTemplate: () => /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(ayonReactComponents.DefaultValueTemplate, { placeholder: "", value: [], dropIcon: "category" }),
83
85
  onChange: (v) => onAction(v[0]),
84
- buttonProps: { ["data-tooltip"]: "Actions", ["data-tooltip-delay"]: 0 }
86
+ buttonProps: {
87
+ // @ts-expect-error
88
+ ["data-tooltip"]: isDeveloperMode ? "Actions (dev bundle)" : "Actions",
89
+ ["data-tooltip-delay"]: 0
90
+ },
91
+ ...props
85
92
  }
86
93
  );
87
94
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsDropdown.cjs.js","sources":["../../../../../../src/containers/Actions/ActionsDropdown/ActionsDropdown.tsx"],"sourcesContent":["import { DefaultValueTemplate, Button, Spacer, DropdownRef } from '@ynput/ayon-react-components'\nimport { DropdownHeader, DropdownItem, StyledDropdown } from './ActionsDropdown.styled'\nimport clsx from 'clsx'\nimport { useRef } from 'react'\nimport { upperFirst } from 'lodash'\nimport ActionIcon from '../ActionIcon'\nimport styled from 'styled-components'\nimport { IconModel } from '@shared/api'\n\nconst ActionItemContainer = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n gap: 4px;\n\n // use visibility instead of display, so dropdown adjusts its width\n button {\n display: flex;\n visibility: hidden;\n }\n\n &:hover,\n &:focus-within {\n button {\n visibility: visible;\n }\n }\n`\n\ntype ActionsDropdownItemProps = {\n value: string\n label: string\n icon?: IconModel\n header?: boolean\n hasConfig?: boolean\n onConfig?: (value: string) => void\n}\n\nexport const ActionsDropdownItem = ({\n value,\n label,\n icon,\n header,\n hasConfig,\n onConfig,\n}: ActionsDropdownItemProps) => {\n if (header) return <DropdownHeader>{upperFirst(label)}</DropdownHeader>\n\n const handleConfig = (e: any) => {\n onConfig?.(value)\n e.stopPropagation()\n e.preventDefault()\n }\n\n return (\n <DropdownItem>\n <ActionItemContainer>\n <ActionIcon icon={icon} />\n <span>{label}</span>\n <Spacer />\n {hasConfig && (\n <Button\n onClick={handleConfig}\n icon=\"settings_applications\"\n tabIndex={-1}\n style={{ background: 'none', padding: 0 }}\n />\n )}\n </ActionItemContainer>\n </DropdownItem>\n )\n}\n\nexport type ActionsDropdownProps = {\n options: ActionsDropdownItemProps[]\n isLoading?: boolean\n onAction: (value: string) => void\n onConfig: (e: any) => void\n}\n\nexport const ActionsDropdown = ({\n options,\n isLoading,\n onAction,\n onConfig,\n}: ActionsDropdownProps) => {\n const dropdownRef = useRef<DropdownRef>(null)\n\n const handleConfigClick = (e: any) => {\n dropdownRef.current?.close()\n onConfig(e)\n }\n\n return (\n <StyledDropdown\n ref={dropdownRef}\n disabled={isLoading}\n className={clsx('more', { loading: isLoading })}\n options={options}\n maxOptionsShown={100}\n value={[]}\n placeholder=\"\"\n itemTemplate={(option) => <ActionsDropdownItem {...option} onConfig={handleConfigClick} />}\n valueTemplate={() => <DefaultValueTemplate placeholder=\"\" value={[]} dropIcon={'category'} />}\n onChange={(v) => onAction(v[0])}\n // @ts-expect-error\n buttonProps={{ ['data-tooltip']: 'Actions', ['data-tooltip-delay']: 0 }}\n />\n )\n}\n"],"names":["jsx","DropdownHeader","upperFirst","DropdownItem","jsxs","Spacer","Button","useRef","StyledDropdown","DefaultValueTemplate"],"mappings":";;;;;;;;;;AASA,MAAM,sBAAsB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6B5B,MAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAgC;AAC9B,MAAI,OAAe,QAAAA,2BAAAA,kBAAAA,IAACC,uBAAgB,gBAAA,EAAA,UAAAC,OAAA,WAAW,KAAK,GAAE;AAEhD,QAAA,eAAe,CAAC,MAAW;AAC/B,yCAAW;AACX,MAAE,gBAAgB;AAClB,MAAE,eAAe;AAAA,EACnB;AAGE,SAAAF,2BAAAA,kBAAAA,IAACG,uBAAAA,cACC,EAAA,UAAAC,2BAAAA,kBAAAA,KAAC,qBACC,EAAA,UAAA;AAAA,IAAAJ,iDAAC,cAAW,MAAY;AAAA,IACxBA,2BAAAA,kBAAAA,IAAC,UAAM,UAAM,MAAA,CAAA;AAAA,qDACZK,oBAAO,QAAA,EAAA;AAAA,IACP,aACCL,2BAAA,kBAAA;AAAA,MAACM,oBAAA;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO,EAAE,YAAY,QAAQ,SAAS,EAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAC1C,EAAA,CAEJ,EACF,CAAA;AAEJ;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA4B;AACpB,QAAA,cAAcC,aAAoB,IAAI;AAEtC,QAAA,oBAAoB,CAAC,MAAW;;AACpC,sBAAY,YAAZ,mBAAqB;AACrB,aAAS,CAAC;AAAA,EACZ;AAGE,SAAAP,2BAAA,kBAAA;AAAA,IAACQ,uBAAA;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,WAAW,KAAK,QAAQ,EAAE,SAAS,WAAW;AAAA,MAC9C;AAAA,MACA,iBAAiB;AAAA,MACjB,OAAO,CAAC;AAAA,MACR,aAAY;AAAA,MACZ,cAAc,CAAC,WAAWR,iDAAC,uBAAqB,GAAG,QAAQ,UAAU,mBAAmB;AAAA,MACxF,eAAe,MAAMA,2BAAAA,kBAAAA,IAACS,oBAAqB,sBAAA,EAAA,aAAY,IAAG,OAAO,CAAI,GAAA,UAAU,YAAY;AAAA,MAC3F,UAAU,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC;AAAA,MAE9B,aAAa,EAAE,CAAC,cAAc,GAAG,WAAW,CAAC,oBAAoB,GAAG,EAAE;AAAA,IAAA;AAAA,EACxE;AAEJ;;;"}
1
+ {"version":3,"file":"ActionsDropdown.cjs.js","sources":["../../../../../../src/containers/Actions/ActionsDropdown/ActionsDropdown.tsx"],"sourcesContent":["import { DefaultValueTemplate, Button, Spacer, DropdownRef, DropdownProps } from '@ynput/ayon-react-components'\nimport { DropdownHeader, DropdownItem, StyledDropdown } from './ActionsDropdown.styled'\nimport clsx from 'clsx'\nimport { useRef } from 'react'\nimport { upperFirst } from 'lodash'\nimport ActionIcon from '../ActionIcon'\nimport styled from 'styled-components'\nimport { IconModel } from '@shared/api'\n\nconst ActionItemContainer = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n gap: 4px;\n\n // use visibility instead of display, so dropdown adjusts its width\n button {\n display: flex;\n visibility: hidden;\n }\n\n &:hover,\n &:focus-within {\n button {\n visibility: visible;\n }\n }\n`\n\ntype ActionsDropdownItemProps = {\n value: string\n label: string\n icon?: IconModel\n header?: boolean\n hasConfig?: boolean\n onConfig?: (value: string) => void\n}\n\nexport const ActionsDropdownItem = ({\n value,\n label,\n icon,\n header,\n hasConfig,\n onConfig,\n}: ActionsDropdownItemProps) => {\n if (header) return <DropdownHeader>{upperFirst(label)}</DropdownHeader>\n\n const handleConfig = (e: any) => {\n onConfig?.(value)\n e.stopPropagation()\n e.preventDefault()\n }\n\n return (\n <DropdownItem>\n <ActionItemContainer>\n <ActionIcon icon={icon} />\n <span>{label}</span>\n <Spacer />\n {hasConfig && (\n <Button\n onClick={handleConfig}\n icon=\"settings_applications\"\n tabIndex={-1}\n style={{ background: 'none', padding: 0 }}\n />\n )}\n </ActionItemContainer>\n </DropdownItem>\n )\n}\n\nexport interface ActionsDropdownProps extends Omit<DropdownProps, 'value'> {\n options: ActionsDropdownItemProps[]\n isLoading?: boolean\n isDeveloperMode: boolean\n onAction: (value: string) => void\n onConfig: (e: any) => void\n}\n\nexport const ActionsDropdown = ({\n options,\n isLoading,\n isDeveloperMode,\n onAction,\n onConfig,\n ...props\n}: ActionsDropdownProps) => {\n const dropdownRef = useRef<DropdownRef>(null)\n\n const handleConfigClick = (e: any) => {\n dropdownRef.current?.close()\n onConfig(e)\n }\n\n return (\n <StyledDropdown\n ref={dropdownRef}\n disabled={isLoading}\n className={clsx('more', { loading: isLoading, dev: isDeveloperMode })}\n options={options}\n maxOptionsShown={100}\n value={[]}\n placeholder=\"\"\n itemTemplate={(option) => <ActionsDropdownItem {...option} onConfig={handleConfigClick} />}\n valueTemplate={() => <DefaultValueTemplate placeholder=\"\" value={[]} dropIcon={'category'} />}\n onChange={(v) => onAction(v[0])}\n buttonProps={{\n // @ts-expect-error\n ['data-tooltip']: isDeveloperMode ? 'Actions (dev bundle)' : 'Actions',\n ['data-tooltip-delay']: 0,\n }}\n {...props}\n />\n )\n}\n"],"names":["jsx","DropdownHeader","upperFirst","DropdownItem","jsxs","Spacer","Button","useRef","StyledDropdown","DefaultValueTemplate"],"mappings":";;;;;;;;;;AASA,MAAM,sBAAsB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6B5B,MAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAgC;AAC9B,MAAI,OAAe,QAAAA,2BAAAA,kBAAAA,IAACC,uBAAgB,gBAAA,EAAA,UAAAC,OAAA,WAAW,KAAK,GAAE;AAEhD,QAAA,eAAe,CAAC,MAAW;AAC/B,yCAAW;AACX,MAAE,gBAAgB;AAClB,MAAE,eAAe;AAAA,EACnB;AAGE,SAAAF,2BAAAA,kBAAAA,IAACG,uBAAAA,cACC,EAAA,UAAAC,2BAAAA,kBAAAA,KAAC,qBACC,EAAA,UAAA;AAAA,IAAAJ,iDAAC,cAAW,MAAY;AAAA,IACxBA,2BAAAA,kBAAAA,IAAC,UAAM,UAAM,MAAA,CAAA;AAAA,qDACZK,oBAAO,QAAA,EAAA;AAAA,IACP,aACCL,2BAAA,kBAAA;AAAA,MAACM,oBAAA;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT,MAAK;AAAA,QACL,UAAU;AAAA,QACV,OAAO,EAAE,YAAY,QAAQ,SAAS,EAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAC1C,EAAA,CAEJ,EACF,CAAA;AAEJ;AAUO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA4B;AACpB,QAAA,cAAcC,aAAoB,IAAI;AAEtC,QAAA,oBAAoB,CAAC,MAAW;;AACpC,sBAAY,YAAZ,mBAAqB;AACrB,aAAS,CAAC;AAAA,EACZ;AAGE,SAAAP,2BAAA,kBAAA;AAAA,IAACQ,uBAAA;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,WAAW,KAAK,QAAQ,EAAE,SAAS,WAAW,KAAK,iBAAiB;AAAA,MACpE;AAAA,MACA,iBAAiB;AAAA,MACjB,OAAO,CAAC;AAAA,MACR,aAAY;AAAA,MACZ,cAAc,CAAC,WAAWR,iDAAC,uBAAqB,GAAG,QAAQ,UAAU,mBAAmB;AAAA,MACxF,eAAe,MAAMA,2BAAAA,kBAAAA,IAACS,oBAAqB,sBAAA,EAAA,aAAY,IAAG,OAAO,CAAI,GAAA,UAAU,YAAY;AAAA,MAC3F,UAAU,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC;AAAA,MAC9B,aAAa;AAAA;AAAA,QAEX,CAAC,cAAc,GAAG,kBAAkB,yBAAyB;AAAA,QAC7D,CAAC,oBAAoB,GAAG;AAAA,MAC1B;AAAA,MACC,GAAG;AAAA,IAAA;AAAA,EACN;AAEJ;;;"}
@@ -57,8 +57,10 @@ const ActionsDropdownItem = ({
57
57
  const ActionsDropdown = ({
58
58
  options,
59
59
  isLoading,
60
+ isDeveloperMode,
60
61
  onAction,
61
- onConfig
62
+ onConfig,
63
+ ...props
62
64
  }) => {
63
65
  const dropdownRef = useRef(null);
64
66
  const handleConfigClick = (e) => {
@@ -71,7 +73,7 @@ const ActionsDropdown = ({
71
73
  {
72
74
  ref: dropdownRef,
73
75
  disabled: isLoading,
74
- className: clsx("more", { loading: isLoading }),
76
+ className: clsx("more", { loading: isLoading, dev: isDeveloperMode }),
75
77
  options,
76
78
  maxOptionsShown: 100,
77
79
  value: [],
@@ -79,7 +81,12 @@ const ActionsDropdown = ({
79
81
  itemTemplate: (option) => /* @__PURE__ */ jsxRuntimeExports.jsx(ActionsDropdownItem, { ...option, onConfig: handleConfigClick }),
80
82
  valueTemplate: () => /* @__PURE__ */ jsxRuntimeExports.jsx(DefaultValueTemplate, { placeholder: "", value: [], dropIcon: "category" }),
81
83
  onChange: (v) => onAction(v[0]),
82
- buttonProps: { ["data-tooltip"]: "Actions", ["data-tooltip-delay"]: 0 }
84
+ buttonProps: {
85
+ // @ts-expect-error
86
+ ["data-tooltip"]: isDeveloperMode ? "Actions (dev bundle)" : "Actions",
87
+ ["data-tooltip-delay"]: 0
88
+ },
89
+ ...props
83
90
  }
84
91
  );
85
92
  };