@ynput/ayon-frontend-shared 0.2.17 → 0.2.18

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 (385) hide show
  1. package/dist/DetailsPanel.cjs.js +6 -3
  2. package/dist/DetailsPanel.cjs.js.map +1 -1
  3. package/dist/DetailsPanel.es.js +6 -3
  4. package/dist/DetailsPanel.es.js.map +1 -1
  5. package/dist/_virtual/index.cjs10.js +4 -4
  6. package/dist/_virtual/index.cjs5.js +3 -5
  7. package/dist/_virtual/index.cjs5.js.map +1 -1
  8. package/dist/_virtual/index.cjs6.js +5 -3
  9. package/dist/_virtual/index.cjs6.js.map +1 -1
  10. package/dist/_virtual/index.cjs8.js +4 -4
  11. package/dist/_virtual/index.cjs9.js +4 -4
  12. package/dist/_virtual/index.es10.js +4 -4
  13. package/dist/_virtual/index.es5.js +2 -5
  14. package/dist/_virtual/index.es5.js.map +1 -1
  15. package/dist/_virtual/index.es6.js +5 -2
  16. package/dist/_virtual/index.es6.js.map +1 -1
  17. package/dist/_virtual/index.es8.js +4 -4
  18. package/dist/_virtual/index.es9.js +4 -4
  19. package/dist/api.cjs.js +7 -0
  20. package/dist/api.cjs.js.map +1 -1
  21. package/dist/api.es.js +7 -0
  22. package/dist/api.es.js.map +1 -1
  23. package/dist/components.cjs.js +9 -4
  24. package/dist/components.cjs.js.map +1 -1
  25. package/dist/components.es.js +10 -5
  26. package/dist/components.es.js.map +1 -1
  27. package/dist/index.cjs.js +6 -3
  28. package/dist/index.cjs.js.map +1 -1
  29. package/dist/index.es.js +6 -3
  30. package/dist/index.es.js.map +1 -1
  31. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +2 -2
  32. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  33. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  34. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  35. package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js +1 -1
  36. package/dist/node_modules/rehype-prism-plus/dist/index.es.es.js +1 -1
  37. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  38. package/dist/node_modules/remove-accents/index.es.js +1 -1
  39. package/dist/node_modules/vfile/lib/index.cjs.js +1 -1
  40. package/dist/node_modules/vfile/lib/index.es.js +1 -1
  41. package/dist/shared/src/api/generated/graphql.cjs.js +26 -23
  42. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  43. package/dist/shared/src/api/generated/graphql.es.js +26 -23
  44. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  45. package/dist/shared/src/api/queries/entities/getEntityPanel.cjs.js +4 -1
  46. package/dist/shared/src/api/queries/entities/getEntityPanel.cjs.js.map +1 -1
  47. package/dist/shared/src/api/queries/entities/getEntityPanel.es.js +4 -1
  48. package/dist/shared/src/api/queries/entities/getEntityPanel.es.js.map +1 -1
  49. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js +13 -1
  50. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js.map +1 -1
  51. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js +13 -1
  52. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js.map +1 -1
  53. package/dist/shared/src/api/queries/entities/updateEntity.cjs.js +2 -0
  54. package/dist/shared/src/api/queries/entities/updateEntity.cjs.js.map +1 -1
  55. package/dist/shared/src/api/queries/entities/updateEntity.es.js +2 -0
  56. package/dist/shared/src/api/queries/entities/updateEntity.es.js.map +1 -1
  57. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js +2 -0
  58. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js.map +1 -1
  59. package/dist/shared/src/api/queries/overview/updateOverview.es.js +2 -0
  60. package/dist/shared/src/api/queries/overview/updateOverview.es.js.map +1 -1
  61. package/dist/shared/src/api/queries/products/createProduct.cjs.js +54 -0
  62. package/dist/shared/src/api/queries/products/createProduct.cjs.js.map +1 -0
  63. package/dist/shared/src/api/queries/products/createProduct.es.js +54 -0
  64. package/dist/shared/src/api/queries/products/createProduct.es.js.map +1 -0
  65. package/dist/shared/src/api/queries/users/getUsers.cjs.js +2 -0
  66. package/dist/shared/src/api/queries/users/getUsers.cjs.js.map +1 -1
  67. package/dist/shared/src/api/queries/users/getUsers.es.js +2 -0
  68. package/dist/shared/src/api/queries/users/getUsers.es.js.map +1 -1
  69. package/dist/shared/src/api/queries/versions/updateVersions.cjs.js +80 -0
  70. package/dist/shared/src/api/queries/versions/updateVersions.cjs.js.map +1 -0
  71. package/dist/shared/src/api/queries/versions/updateVersions.es.js +80 -0
  72. package/dist/shared/src/api/queries/versions/updateVersions.es.js.map +1 -0
  73. package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js +2 -0
  74. package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js.map +1 -1
  75. package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js +2 -0
  76. package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js.map +1 -1
  77. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js +2 -0
  78. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js.map +1 -1
  79. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js +2 -0
  80. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js.map +1 -1
  81. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js +1 -1
  82. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.cjs.js.map +1 -1
  83. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.es.js +1 -1
  84. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributesEditor.es.js.map +1 -1
  85. package/dist/shared/src/components/EntityPanelUploader/Dropzone.cjs.js +13 -0
  86. package/dist/shared/src/components/EntityPanelUploader/Dropzone.cjs.js.map +1 -0
  87. package/dist/shared/src/components/EntityPanelUploader/Dropzone.es.js +14 -0
  88. package/dist/shared/src/components/EntityPanelUploader/Dropzone.es.js.map +1 -0
  89. package/dist/shared/src/components/{EntityThumbnailUploader/EntityThumbnailUploader.cjs.js → EntityPanelUploader/EntityPanelUploader.cjs.js} +378 -119
  90. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js.map +1 -0
  91. package/dist/shared/src/components/{EntityThumbnailUploader/EntityThumbnailUploader.es.js → EntityPanelUploader/EntityPanelUploader.es.js} +378 -119
  92. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js.map +1 -0
  93. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.styled.cjs.js +95 -0
  94. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.styled.cjs.js.map +1 -0
  95. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.styled.es.js +95 -0
  96. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.styled.es.js.map +1 -0
  97. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploaderDialog.cjs.js +76 -0
  98. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploaderDialog.cjs.js.map +1 -0
  99. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploaderDialog.es.js +77 -0
  100. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploaderDialog.es.js.map +1 -0
  101. package/dist/shared/src/components/Powerpack/PowerpackButton.cjs.js +1 -1
  102. package/dist/shared/src/components/Powerpack/PowerpackButton.cjs.js.map +1 -1
  103. package/dist/shared/src/components/Powerpack/PowerpackButton.es.js +1 -1
  104. package/dist/shared/src/components/Powerpack/PowerpackButton.es.js.map +1 -1
  105. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +2 -0
  106. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
  107. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +2 -0
  108. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
  109. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.cjs.js +2 -0
  110. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.cjs.js.map +1 -1
  111. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.es.js +2 -0
  112. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.es.js.map +1 -1
  113. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +6 -3
  114. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
  115. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +6 -3
  116. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
  117. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +29 -102
  118. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
  119. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +29 -102
  120. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
  121. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +6 -3
  122. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
  123. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +6 -3
  124. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
  125. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.cjs.js +212 -0
  126. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.cjs.js.map +1 -0
  127. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.es.js +212 -0
  128. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.es.js.map +1 -0
  129. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +2 -0
  130. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -1
  131. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +2 -0
  132. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js.map +1 -1
  133. package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.cjs.js +2 -2
  134. package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.cjs.js.map +1 -1
  135. package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.es.js +2 -2
  136. package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.es.js.map +1 -1
  137. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +6 -3
  138. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
  139. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +6 -3
  140. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
  141. package/dist/shared/src/components/VersionUploader/components/UploadVersionDialog.cjs.js +85 -0
  142. package/dist/shared/src/components/VersionUploader/components/UploadVersionDialog.cjs.js.map +1 -0
  143. package/dist/shared/src/components/VersionUploader/components/UploadVersionDialog.es.js +85 -0
  144. package/dist/shared/src/components/VersionUploader/components/UploadVersionDialog.es.js.map +1 -0
  145. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js +401 -0
  146. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js.map +1 -0
  147. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js +401 -0
  148. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js.map +1 -0
  149. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.cjs.js +308 -0
  150. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.cjs.js.map +1 -0
  151. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.es.js +308 -0
  152. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.es.js.map +1 -0
  153. package/dist/shared/src/components/Watchers/Watchers.cjs.js +2 -0
  154. package/dist/shared/src/components/Watchers/Watchers.cjs.js.map +1 -1
  155. package/dist/shared/src/components/Watchers/Watchers.es.js +2 -0
  156. package/dist/shared/src/components/Watchers/Watchers.es.js.map +1 -1
  157. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +6 -3
  158. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
  159. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +6 -3
  160. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
  161. package/dist/shared/src/containers/Actions/Actions.cjs.js +2 -0
  162. package/dist/shared/src/containers/Actions/Actions.cjs.js.map +1 -1
  163. package/dist/shared/src/containers/Actions/Actions.es.js +2 -0
  164. package/dist/shared/src/containers/Actions/Actions.es.js.map +1 -1
  165. package/dist/shared/src/containers/Actions/Actions.styled.cjs.js +1 -1
  166. package/dist/shared/src/containers/Actions/Actions.styled.cjs.js.map +1 -1
  167. package/dist/shared/src/containers/Actions/Actions.styled.es.js +1 -1
  168. package/dist/shared/src/containers/Actions/Actions.styled.es.js.map +1 -1
  169. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +6 -3
  170. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
  171. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +6 -3
  172. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
  173. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +9 -4
  174. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  175. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +9 -4
  176. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  177. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +6 -3
  178. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
  179. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +6 -3
  180. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
  181. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +6 -3
  182. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
  183. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +6 -3
  184. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
  185. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +10 -5
  186. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
  187. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +10 -5
  188. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
  189. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js +1 -1
  190. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js.map +1 -1
  191. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js +1 -1
  192. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js.map +1 -1
  193. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js +2 -0
  194. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js.map +1 -1
  195. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js +2 -0
  196. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js.map +1 -1
  197. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.cjs.js +2 -0
  198. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.cjs.js.map +1 -1
  199. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.es.js +2 -0
  200. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.es.js.map +1 -1
  201. package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.cjs.js +2 -2
  202. package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.cjs.js.map +1 -1
  203. package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.es.js +2 -2
  204. package/dist/shared/src/containers/Feed/components/ActivityReference/ActivityReference.styled.es.js.map +1 -1
  205. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js +1 -1
  206. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js.map +1 -1
  207. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.es.js +1 -1
  208. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.es.js.map +1 -1
  209. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js +2 -0
  210. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js.map +1 -1
  211. package/dist/shared/src/containers/Feed/context/FeedContext.es.js +2 -0
  212. package/dist/shared/src/containers/Feed/context/FeedContext.es.js.map +1 -1
  213. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.cjs.js +2 -0
  214. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.cjs.js.map +1 -1
  215. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.es.js +2 -0
  216. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.es.js.map +1 -1
  217. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +4 -2
  218. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  219. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +4 -2
  220. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  221. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +6 -3
  222. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
  223. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +6 -3
  224. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
  225. package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.cjs.js +3 -3
  226. package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.cjs.js.map +1 -1
  227. package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.es.js +3 -3
  228. package/dist/shared/src/containers/ProjectTreeTable/components/HeaderActionButton.es.js.map +1 -1
  229. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.cjs.js +2 -0
  230. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.cjs.js.map +1 -1
  231. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.es.js +2 -0
  232. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.es.js.map +1 -1
  233. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js.map +1 -1
  234. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js.map +1 -1
  235. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js +7 -1
  236. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js.map +1 -1
  237. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js +7 -1
  238. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js.map +1 -1
  239. package/dist/shared/src/containers/ProjectTreeTable/hooks/useAttributesList.cjs.js +2 -0
  240. package/dist/shared/src/containers/ProjectTreeTable/hooks/useAttributesList.cjs.js.map +1 -1
  241. package/dist/shared/src/containers/ProjectTreeTable/hooks/useAttributesList.es.js +2 -0
  242. package/dist/shared/src/containers/ProjectTreeTable/hooks/useAttributesList.es.js.map +1 -1
  243. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js +2 -0
  244. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js.map +1 -1
  245. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js +2 -0
  246. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js.map +1 -1
  247. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +2 -0
  248. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
  249. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +2 -0
  250. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
  251. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.cjs.js +1 -0
  252. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.cjs.js.map +1 -1
  253. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.es.js +1 -0
  254. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFolderRelationships.es.js.map +1 -1
  255. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetTaskGroups.cjs.js +2 -0
  256. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetTaskGroups.cjs.js.map +1 -1
  257. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetTaskGroups.es.js +2 -0
  258. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetTaskGroups.es.js.map +1 -1
  259. package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.cjs.js +2 -0
  260. package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.cjs.js.map +1 -1
  261. package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.es.js +2 -0
  262. package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.es.js.map +1 -1
  263. package/dist/shared/src/containers/ProjectTreeTable/utils/getTableFieldOptions.cjs.js +3 -2
  264. package/dist/shared/src/containers/ProjectTreeTable/utils/getTableFieldOptions.cjs.js.map +1 -1
  265. package/dist/shared/src/containers/ProjectTreeTable/utils/getTableFieldOptions.es.js +3 -2
  266. package/dist/shared/src/containers/ProjectTreeTable/utils/getTableFieldOptions.es.js.map +1 -1
  267. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js +1 -1
  268. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.cjs.js.map +1 -1
  269. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js +1 -1
  270. package/dist/shared/src/containers/ProjectTreeTable/widgets/EntityNameWidget.es.js.map +1 -1
  271. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.cjs.js +1 -1
  272. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.cjs.js.map +1 -1
  273. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.es.js +1 -1
  274. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.es.js.map +1 -1
  275. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +6 -3
  276. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
  277. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +6 -3
  278. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
  279. package/dist/shared/src/context/AddonProjectContext.cjs.js +2 -0
  280. package/dist/shared/src/context/AddonProjectContext.cjs.js.map +1 -1
  281. package/dist/shared/src/context/AddonProjectContext.es.js +2 -0
  282. package/dist/shared/src/context/AddonProjectContext.es.js.map +1 -1
  283. package/dist/shared/src/context/DetailsPanelContext.cjs.js +2 -0
  284. package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
  285. package/dist/shared/src/context/DetailsPanelContext.es.js +2 -0
  286. package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
  287. package/dist/shared/src/context/PowerpackContext.cjs.js +2 -0
  288. package/dist/shared/src/context/PowerpackContext.cjs.js.map +1 -1
  289. package/dist/shared/src/context/PowerpackContext.es.js +2 -0
  290. package/dist/shared/src/context/PowerpackContext.es.js.map +1 -1
  291. package/dist/shared/src/context/RemoteModulesContext.cjs.js +2 -0
  292. package/dist/shared/src/context/RemoteModulesContext.cjs.js.map +1 -1
  293. package/dist/shared/src/context/RemoteModulesContext.es.js +2 -0
  294. package/dist/shared/src/context/RemoteModulesContext.es.js.map +1 -1
  295. package/dist/shared/src/context/ThumbnailUploaderContext.cjs.js +15 -4
  296. package/dist/shared/src/context/ThumbnailUploaderContext.cjs.js.map +1 -1
  297. package/dist/shared/src/context/ThumbnailUploaderContext.es.js +15 -4
  298. package/dist/shared/src/context/ThumbnailUploaderContext.es.js.map +1 -1
  299. package/dist/shared/src/context/pip/PiPWrapper.cjs.js +1 -1
  300. package/dist/shared/src/context/pip/PiPWrapper.cjs.js.map +1 -1
  301. package/dist/shared/src/context/pip/PiPWrapper.es.js +1 -1
  302. package/dist/shared/src/context/pip/PiPWrapper.es.js.map +1 -1
  303. package/dist/shared/src/hooks/useActionTriggers.cjs.js +2 -0
  304. package/dist/shared/src/hooks/useActionTriggers.cjs.js.map +1 -1
  305. package/dist/shared/src/hooks/useActionTriggers.es.js +2 -0
  306. package/dist/shared/src/hooks/useActionTriggers.es.js.map +1 -1
  307. package/dist/shared/src/hooks/useEntityUpdate.cjs.js +2 -0
  308. package/dist/shared/src/hooks/useEntityUpdate.cjs.js.map +1 -1
  309. package/dist/shared/src/hooks/useEntityUpdate.es.js +2 -0
  310. package/dist/shared/src/hooks/useEntityUpdate.es.js.map +1 -1
  311. package/dist/shared/src/hooks/useScopedStatuses.cjs.js +2 -0
  312. package/dist/shared/src/hooks/useScopedStatuses.cjs.js.map +1 -1
  313. package/dist/shared/src/hooks/useScopedStatuses.es.js +2 -0
  314. package/dist/shared/src/hooks/useScopedStatuses.es.js.map +1 -1
  315. package/dist/shared/src/hooks/useUserProjectConfig.cjs.js +2 -0
  316. package/dist/shared/src/hooks/useUserProjectConfig.cjs.js.map +1 -1
  317. package/dist/shared/src/hooks/useUserProjectConfig.es.js +2 -0
  318. package/dist/shared/src/hooks/useUserProjectConfig.es.js.map +1 -1
  319. package/dist/shared/src/util/productTypes.cjs.js +1 -0
  320. package/dist/shared/src/util/productTypes.cjs.js.map +1 -1
  321. package/dist/shared/src/util/productTypes.es.js +1 -0
  322. package/dist/shared/src/util/productTypes.es.js.map +1 -1
  323. package/dist/shared/src/utils/extractVersionFromFilename.cjs.js +32 -0
  324. package/dist/shared/src/utils/extractVersionFromFilename.cjs.js.map +1 -0
  325. package/dist/shared/src/utils/extractVersionFromFilename.es.js +32 -0
  326. package/dist/shared/src/utils/extractVersionFromFilename.es.js.map +1 -0
  327. package/dist/shared/src/utils/versionUploadHelpers.cjs.js +121 -0
  328. package/dist/shared/src/utils/versionUploadHelpers.cjs.js.map +1 -0
  329. package/dist/shared/src/utils/versionUploadHelpers.es.js +121 -0
  330. package/dist/shared/src/utils/versionUploadHelpers.es.js.map +1 -0
  331. package/dist/types/api/generated/graphql.d.ts +47 -36
  332. package/dist/types/api/queries/activities/getActivities.d.ts +4 -4
  333. package/dist/types/api/queries/activities/updateActivities.d.ts +8 -8
  334. package/dist/types/api/queries/entities/getEntity.d.ts +4 -4
  335. package/dist/types/api/queries/entities/getEntityPanel.d.ts +4 -4
  336. package/dist/types/api/queries/entities/updateEntity.d.ts +4 -4
  337. package/dist/types/api/queries/entityLists/getLists.d.ts +4 -4
  338. package/dist/types/api/queries/index.d.ts +2 -0
  339. package/dist/types/api/queries/overview/getOverview.d.ts +4 -4
  340. package/dist/types/api/queries/products/createProduct.d.ts +161 -0
  341. package/dist/types/api/queries/products/index.d.ts +1 -0
  342. package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +4 -4
  343. package/dist/types/api/queries/users/getUsers.d.ts +4 -4
  344. package/dist/types/api/queries/versions/index.d.ts +1 -0
  345. package/dist/types/api/queries/versions/updateVersions.d.ts +685 -0
  346. package/dist/types/components/EntityPanelUploader/Dropzone.d.ts +11 -0
  347. package/dist/types/components/{EntityThumbnailUploader/EntityThumbnailUploader.d.ts → EntityPanelUploader/EntityPanelUploader.d.ts} +3 -3
  348. package/dist/types/components/EntityPanelUploader/EntityPanelUploader.styled.d.ts +8 -0
  349. package/dist/types/components/EntityPanelUploader/EntityPanelUploaderDialog.d.ts +10 -0
  350. package/dist/types/components/EntityPanelUploader/index.d.ts +1 -0
  351. package/dist/types/components/ReviewablesList/index.d.ts +1 -0
  352. package/dist/types/components/ReviewablesList/useReviewablesUpload.d.ts +19 -0
  353. package/dist/types/components/VersionUploader/components/UploadVersionDialog.d.ts +5 -0
  354. package/dist/types/components/VersionUploader/components/UploadVersionForm.d.ts +18 -0
  355. package/dist/types/components/VersionUploader/context/VersionUploadContext.d.ts +54 -0
  356. package/dist/types/components/VersionUploader/index.d.ts +2 -0
  357. package/dist/types/components/index.d.ts +2 -2
  358. package/dist/types/containers/DetailsPanel/DetailsPanel.d.ts +2 -1
  359. package/dist/types/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.d.ts +3 -1
  360. package/dist/types/containers/ProjectTreeTable/context/ProjectTableContext.d.ts +1 -0
  361. package/dist/types/containers/ProjectTreeTable/context/ProjectTableProvider.d.ts +2 -1
  362. package/dist/types/containers/ProjectTreeTable/hooks/useCellContextMenu.d.ts +2 -1
  363. package/dist/types/containers/ProjectTreeTable/utils/getTableFieldOptions.d.ts +2 -1
  364. package/dist/types/context/ThumbnailUploaderContext.d.ts +3 -2
  365. package/dist/types/utils/versionUploadHelpers.d.ts +63 -0
  366. package/package.json +1 -1
  367. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js.map +0 -1
  368. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js.map +0 -1
  369. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.styled.cjs.js +0 -12
  370. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.styled.cjs.js.map +0 -1
  371. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.styled.es.js +0 -12
  372. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.styled.es.js.map +0 -1
  373. package/dist/shared/src/components/ThumbnailUploader/ThumbnailUploader.cjs.js +0 -112
  374. package/dist/shared/src/components/ThumbnailUploader/ThumbnailUploader.cjs.js.map +0 -1
  375. package/dist/shared/src/components/ThumbnailUploader/ThumbnailUploader.es.js +0 -112
  376. package/dist/shared/src/components/ThumbnailUploader/ThumbnailUploader.es.js.map +0 -1
  377. package/dist/shared/src/components/ThumbnailUploader/ThumbnailUploader.styled.cjs.js +0 -104
  378. package/dist/shared/src/components/ThumbnailUploader/ThumbnailUploader.styled.cjs.js.map +0 -1
  379. package/dist/shared/src/components/ThumbnailUploader/ThumbnailUploader.styled.es.js +0 -104
  380. package/dist/shared/src/components/ThumbnailUploader/ThumbnailUploader.styled.es.js.map +0 -1
  381. package/dist/types/components/EntityThumbnailUploader/EntityThumbnailUploader.styled.d.ts +0 -1
  382. package/dist/types/components/EntityThumbnailUploader/index.d.ts +0 -1
  383. package/dist/types/components/ThumbnailUploader/ThumbnailUploader.d.ts +0 -17
  384. package/dist/types/components/ThumbnailUploader/ThumbnailUploader.styled.d.ts +0 -4
  385. package/dist/types/components/ThumbnailUploader/index.d.ts +0 -1
@@ -30,7 +30,7 @@ const StyledClose = styled(ayonReactComponents.Button)`
30
30
  font-size: 15px;
31
31
  font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 200, 'opsz' 20;
32
32
  }
33
- background-color: unset;
33
+ background-color: unset !important;
34
34
  opacity: 0;
35
35
  border-radius: 100%;
36
36
  transition: opacity 400ms, background-color 400ms;
@@ -1 +1 @@
1
- {"version":3,"file":"PiPWrapper.cjs.js","sources":["../../../../../src/context/pip/PiPWrapper.tsx"],"sourcesContent":["import React, { FC } from 'react'\nimport { usePiPWindow } from './PiPProvider'\nimport PiPWindow from './PiPWindow'\nimport { Dialog } from 'primereact/dialog'\nimport { Button } from '@ynput/ayon-react-components'\nimport styled from 'styled-components'\n\nexport interface PiPWrapperProps {\n children: React.ReactNode\n}\n\nconst StyledDialog = styled(Dialog)`\n width: 25vw;\n height: 70vh;\n border: solid 1px var(--md-sys-color-outline-variant);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: 0 0 1px 1px #000, 0 11px 15px -7px #0003, 0 24px 38px 3px #00000024,\n 0 9px 46px 8px #0000001f;\n &:hover {\n .close {\n opacity: 1;\n }\n }\n`\n\nconst StyledClose = styled(Button)`\n width: 26px;\n height: 26px;\n margin-left: auto;\n\n .icon {\n font-size: 15px;\n font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 200, 'opsz' 20;\n }\n background-color: unset;\n opacity: 0;\n border-radius: 100%;\n transition: opacity 400ms, background-color 400ms;\n &:hover {\n background-color: #3d3e40;\n }\n`\n\nexport const PiPWrapper: FC<PiPWrapperProps> = ({ children }) => {\n const { pipWindow, pipId, isSupported, closePipWindow } = usePiPWindow()\n\n // attach pipId to id of children\n const pipChildren =\n pipId && React.isValidElement<{ id?: string }>(children)\n ? React.cloneElement(children, { id: pipId })\n : children\n\n // open using fallback dialog\n if (!isSupported && pipId) {\n return (\n <StyledDialog\n header={<StyledClose icon=\"close\" className=\"close\" onClick={closePipWindow} />}\n headerStyle={{\n padding: 4,\n backgroundColor: '#202124',\n border: 'none',\n height: 33,\n }}\n contentStyle={{ overflow: 'hidden', height: 'revert-layer', padding: 8, border: 'none' }}\n maskStyle={{ pointerEvents: 'none', userSelect: 'none', backgroundColor: 'unset' }}\n visible={true}\n closeOnEscape={false}\n pt={{\n closeButton: {\n style: { display: 'none' },\n },\n footer: {\n style: { padding: 0, border: 'none' },\n },\n }}\n onHide={closePipWindow}\n position=\"right\"\n >\n {pipChildren}\n </StyledDialog>\n )\n }\n\n return (\n pipWindow && (\n <PiPWindow pipWindow={pipWindow}>\n <div className=\"pipRoot\">{pipChildren}</div>\n </PiPWindow>\n )\n )\n}\n"],"names":["Dialog","Button","usePiPWindow","jsx"],"mappings":";;;;;;;;;AAWA,MAAM,eAAe,OAAOA,iBAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAelC,MAAM,cAAc,OAAOC,0BAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB1B,MAAM,aAAkC,CAAC,EAAE,eAAe;AAC/D,QAAM,EAAE,WAAW,OAAO,aAAa,eAAA,IAAmBC,YAAAA,aAAa;AAGvE,QAAM,cACJ,SAAS,MAAM,eAAgC,QAAQ,IACnD,MAAM,aAAa,UAAU,EAAE,IAAI,MAAA,CAAO,IAC1C;AAGF,MAAA,CAAC,eAAe,OAAO;AAEvB,WAAAC,2BAAA,kBAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,yDAAS,aAAY,EAAA,MAAK,SAAQ,WAAU,SAAQ,SAAS,gBAAgB;AAAA,QAC7E,aAAa;AAAA,UACX,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA,cAAc,EAAE,UAAU,UAAU,QAAQ,gBAAgB,SAAS,GAAG,QAAQ,OAAO;AAAA,QACvF,WAAW,EAAE,eAAe,QAAQ,YAAY,QAAQ,iBAAiB,QAAQ;AAAA,QACjF,SAAS;AAAA,QACT,eAAe;AAAA,QACf,IAAI;AAAA,UACF,aAAa;AAAA,YACX,OAAO,EAAE,SAAS,OAAO;AAAA,UAC3B;AAAA,UACA,QAAQ;AAAA,YACN,OAAO,EAAE,SAAS,GAAG,QAAQ,OAAO;AAAA,UAAA;AAAA,QAExC;AAAA,QACA,QAAQ;AAAA,QACR,UAAS;AAAA,QAER,UAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAKF,SAAA,8DACG,WAAU,EAAA,WACT,2DAAC,OAAI,EAAA,WAAU,WAAW,UAAA,YAAA,CAAY,EACxC,CAAA;AAGN;;"}
1
+ {"version":3,"file":"PiPWrapper.cjs.js","sources":["../../../../../src/context/pip/PiPWrapper.tsx"],"sourcesContent":["import React, { FC } from 'react'\nimport { usePiPWindow } from './PiPProvider'\nimport PiPWindow from './PiPWindow'\nimport { Dialog } from 'primereact/dialog'\nimport { Button } from '@ynput/ayon-react-components'\nimport styled from 'styled-components'\n\nexport interface PiPWrapperProps {\n children: React.ReactNode\n}\n\nconst StyledDialog = styled(Dialog)`\n width: 25vw;\n height: 70vh;\n border: solid 1px var(--md-sys-color-outline-variant);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: 0 0 1px 1px #000, 0 11px 15px -7px #0003, 0 24px 38px 3px #00000024,\n 0 9px 46px 8px #0000001f;\n &:hover {\n .close {\n opacity: 1;\n }\n }\n`\n\nconst StyledClose = styled(Button)`\n width: 26px;\n height: 26px;\n margin-left: auto;\n\n .icon {\n font-size: 15px;\n font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 200, 'opsz' 20;\n }\n background-color: unset !important;\n opacity: 0;\n border-radius: 100%;\n transition: opacity 400ms, background-color 400ms;\n &:hover {\n background-color: #3d3e40;\n }\n`\n\nexport const PiPWrapper: FC<PiPWrapperProps> = ({ children }) => {\n const { pipWindow, pipId, isSupported, closePipWindow } = usePiPWindow()\n\n // attach pipId to id of children\n const pipChildren =\n pipId && React.isValidElement<{ id?: string }>(children)\n ? React.cloneElement(children, { id: pipId })\n : children\n\n // open using fallback dialog\n if (!isSupported && pipId) {\n return (\n <StyledDialog\n header={<StyledClose icon=\"close\" className=\"close\" onClick={closePipWindow} />}\n headerStyle={{\n padding: 4,\n backgroundColor: '#202124',\n border: 'none',\n height: 33,\n }}\n contentStyle={{ overflow: 'hidden', height: 'revert-layer', padding: 8, border: 'none' }}\n maskStyle={{ pointerEvents: 'none', userSelect: 'none', backgroundColor: 'unset' }}\n visible={true}\n closeOnEscape={false}\n pt={{\n closeButton: {\n style: { display: 'none' },\n },\n footer: {\n style: { padding: 0, border: 'none' },\n },\n }}\n onHide={closePipWindow}\n position=\"right\"\n >\n {pipChildren}\n </StyledDialog>\n )\n }\n\n return (\n pipWindow && (\n <PiPWindow pipWindow={pipWindow}>\n <div className=\"pipRoot\">{pipChildren}</div>\n </PiPWindow>\n )\n )\n}\n"],"names":["Dialog","Button","usePiPWindow","jsx"],"mappings":";;;;;;;;;AAWA,MAAM,eAAe,OAAOA,iBAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAelC,MAAM,cAAc,OAAOC,0BAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB1B,MAAM,aAAkC,CAAC,EAAE,eAAe;AAC/D,QAAM,EAAE,WAAW,OAAO,aAAa,eAAA,IAAmBC,YAAAA,aAAa;AAGvE,QAAM,cACJ,SAAS,MAAM,eAAgC,QAAQ,IACnD,MAAM,aAAa,UAAU,EAAE,IAAI,MAAA,CAAO,IAC1C;AAGF,MAAA,CAAC,eAAe,OAAO;AAEvB,WAAAC,2BAAA,kBAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,yDAAS,aAAY,EAAA,MAAK,SAAQ,WAAU,SAAQ,SAAS,gBAAgB;AAAA,QAC7E,aAAa;AAAA,UACX,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA,cAAc,EAAE,UAAU,UAAU,QAAQ,gBAAgB,SAAS,GAAG,QAAQ,OAAO;AAAA,QACvF,WAAW,EAAE,eAAe,QAAQ,YAAY,QAAQ,iBAAiB,QAAQ;AAAA,QACjF,SAAS;AAAA,QACT,eAAe;AAAA,QACf,IAAI;AAAA,UACF,aAAa;AAAA,YACX,OAAO,EAAE,SAAS,OAAO;AAAA,UAC3B;AAAA,UACA,QAAQ;AAAA,YACN,OAAO,EAAE,SAAS,GAAG,QAAQ,OAAO;AAAA,UAAA;AAAA,QAExC;AAAA,QACA,QAAQ;AAAA,QACR,UAAS;AAAA,QAER,UAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAKF,SAAA,8DACG,WAAU,EAAA,WACT,2DAAC,OAAI,EAAA,WAAU,WAAW,UAAA,YAAA,CAAY,EACxC,CAAA;AAGN;;"}
@@ -28,7 +28,7 @@ const StyledClose = styled(Button)`
28
28
  font-size: 15px;
29
29
  font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 200, 'opsz' 20;
30
30
  }
31
- background-color: unset;
31
+ background-color: unset !important;
32
32
  opacity: 0;
33
33
  border-radius: 100%;
34
34
  transition: opacity 400ms, background-color 400ms;
@@ -1 +1 @@
1
- {"version":3,"file":"PiPWrapper.es.js","sources":["../../../../../src/context/pip/PiPWrapper.tsx"],"sourcesContent":["import React, { FC } from 'react'\nimport { usePiPWindow } from './PiPProvider'\nimport PiPWindow from './PiPWindow'\nimport { Dialog } from 'primereact/dialog'\nimport { Button } from '@ynput/ayon-react-components'\nimport styled from 'styled-components'\n\nexport interface PiPWrapperProps {\n children: React.ReactNode\n}\n\nconst StyledDialog = styled(Dialog)`\n width: 25vw;\n height: 70vh;\n border: solid 1px var(--md-sys-color-outline-variant);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: 0 0 1px 1px #000, 0 11px 15px -7px #0003, 0 24px 38px 3px #00000024,\n 0 9px 46px 8px #0000001f;\n &:hover {\n .close {\n opacity: 1;\n }\n }\n`\n\nconst StyledClose = styled(Button)`\n width: 26px;\n height: 26px;\n margin-left: auto;\n\n .icon {\n font-size: 15px;\n font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 200, 'opsz' 20;\n }\n background-color: unset;\n opacity: 0;\n border-radius: 100%;\n transition: opacity 400ms, background-color 400ms;\n &:hover {\n background-color: #3d3e40;\n }\n`\n\nexport const PiPWrapper: FC<PiPWrapperProps> = ({ children }) => {\n const { pipWindow, pipId, isSupported, closePipWindow } = usePiPWindow()\n\n // attach pipId to id of children\n const pipChildren =\n pipId && React.isValidElement<{ id?: string }>(children)\n ? React.cloneElement(children, { id: pipId })\n : children\n\n // open using fallback dialog\n if (!isSupported && pipId) {\n return (\n <StyledDialog\n header={<StyledClose icon=\"close\" className=\"close\" onClick={closePipWindow} />}\n headerStyle={{\n padding: 4,\n backgroundColor: '#202124',\n border: 'none',\n height: 33,\n }}\n contentStyle={{ overflow: 'hidden', height: 'revert-layer', padding: 8, border: 'none' }}\n maskStyle={{ pointerEvents: 'none', userSelect: 'none', backgroundColor: 'unset' }}\n visible={true}\n closeOnEscape={false}\n pt={{\n closeButton: {\n style: { display: 'none' },\n },\n footer: {\n style: { padding: 0, border: 'none' },\n },\n }}\n onHide={closePipWindow}\n position=\"right\"\n >\n {pipChildren}\n </StyledDialog>\n )\n }\n\n return (\n pipWindow && (\n <PiPWindow pipWindow={pipWindow}>\n <div className=\"pipRoot\">{pipChildren}</div>\n </PiPWindow>\n )\n )\n}\n"],"names":["React","jsx"],"mappings":";;;;;;;AAWA,MAAM,eAAe,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAelC,MAAM,cAAc,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB1B,MAAM,aAAkC,CAAC,EAAE,eAAe;AAC/D,QAAM,EAAE,WAAW,OAAO,aAAa,eAAA,IAAmB,aAAa;AAGvE,QAAM,cACJ,SAASA,eAAM,eAAgC,QAAQ,IACnDA,eAAM,aAAa,UAAU,EAAE,IAAI,MAAA,CAAO,IAC1C;AAGF,MAAA,CAAC,eAAe,OAAO;AAEvB,WAAAC,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,8CAAS,aAAY,EAAA,MAAK,SAAQ,WAAU,SAAQ,SAAS,gBAAgB;AAAA,QAC7E,aAAa;AAAA,UACX,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA,cAAc,EAAE,UAAU,UAAU,QAAQ,gBAAgB,SAAS,GAAG,QAAQ,OAAO;AAAA,QACvF,WAAW,EAAE,eAAe,QAAQ,YAAY,QAAQ,iBAAiB,QAAQ;AAAA,QACjF,SAAS;AAAA,QACT,eAAe;AAAA,QACf,IAAI;AAAA,UACF,aAAa;AAAA,YACX,OAAO,EAAE,SAAS,OAAO;AAAA,UAC3B;AAAA,UACA,QAAQ;AAAA,YACN,OAAO,EAAE,SAAS,GAAG,QAAQ,OAAO;AAAA,UAAA;AAAA,QAExC;AAAA,QACA,QAAQ;AAAA,QACR,UAAS;AAAA,QAER,UAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAKF,SAAA,mDACG,WAAU,EAAA,WACT,gDAAC,OAAI,EAAA,WAAU,WAAW,UAAA,YAAA,CAAY,EACxC,CAAA;AAGN;"}
1
+ {"version":3,"file":"PiPWrapper.es.js","sources":["../../../../../src/context/pip/PiPWrapper.tsx"],"sourcesContent":["import React, { FC } from 'react'\nimport { usePiPWindow } from './PiPProvider'\nimport PiPWindow from './PiPWindow'\nimport { Dialog } from 'primereact/dialog'\nimport { Button } from '@ynput/ayon-react-components'\nimport styled from 'styled-components'\n\nexport interface PiPWrapperProps {\n children: React.ReactNode\n}\n\nconst StyledDialog = styled(Dialog)`\n width: 25vw;\n height: 70vh;\n border: solid 1px var(--md-sys-color-outline-variant);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: 0 0 1px 1px #000, 0 11px 15px -7px #0003, 0 24px 38px 3px #00000024,\n 0 9px 46px 8px #0000001f;\n &:hover {\n .close {\n opacity: 1;\n }\n }\n`\n\nconst StyledClose = styled(Button)`\n width: 26px;\n height: 26px;\n margin-left: auto;\n\n .icon {\n font-size: 15px;\n font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 200, 'opsz' 20;\n }\n background-color: unset !important;\n opacity: 0;\n border-radius: 100%;\n transition: opacity 400ms, background-color 400ms;\n &:hover {\n background-color: #3d3e40;\n }\n`\n\nexport const PiPWrapper: FC<PiPWrapperProps> = ({ children }) => {\n const { pipWindow, pipId, isSupported, closePipWindow } = usePiPWindow()\n\n // attach pipId to id of children\n const pipChildren =\n pipId && React.isValidElement<{ id?: string }>(children)\n ? React.cloneElement(children, { id: pipId })\n : children\n\n // open using fallback dialog\n if (!isSupported && pipId) {\n return (\n <StyledDialog\n header={<StyledClose icon=\"close\" className=\"close\" onClick={closePipWindow} />}\n headerStyle={{\n padding: 4,\n backgroundColor: '#202124',\n border: 'none',\n height: 33,\n }}\n contentStyle={{ overflow: 'hidden', height: 'revert-layer', padding: 8, border: 'none' }}\n maskStyle={{ pointerEvents: 'none', userSelect: 'none', backgroundColor: 'unset' }}\n visible={true}\n closeOnEscape={false}\n pt={{\n closeButton: {\n style: { display: 'none' },\n },\n footer: {\n style: { padding: 0, border: 'none' },\n },\n }}\n onHide={closePipWindow}\n position=\"right\"\n >\n {pipChildren}\n </StyledDialog>\n )\n }\n\n return (\n pipWindow && (\n <PiPWindow pipWindow={pipWindow}>\n <div className=\"pipRoot\">{pipChildren}</div>\n </PiPWindow>\n )\n )\n}\n"],"names":["React","jsx"],"mappings":";;;;;;;AAWA,MAAM,eAAe,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAelC,MAAM,cAAc,OAAO,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkB1B,MAAM,aAAkC,CAAC,EAAE,eAAe;AAC/D,QAAM,EAAE,WAAW,OAAO,aAAa,eAAA,IAAmB,aAAa;AAGvE,QAAM,cACJ,SAASA,eAAM,eAAgC,QAAQ,IACnDA,eAAM,aAAa,UAAU,EAAE,IAAI,MAAA,CAAO,IAC1C;AAGF,MAAA,CAAC,eAAe,OAAO;AAEvB,WAAAC,kCAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,8CAAS,aAAY,EAAA,MAAK,SAAQ,WAAU,SAAQ,SAAS,gBAAgB;AAAA,QAC7E,aAAa;AAAA,UACX,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA,cAAc,EAAE,UAAU,UAAU,QAAQ,gBAAgB,SAAS,GAAG,QAAQ,OAAO;AAAA,QACvF,WAAW,EAAE,eAAe,QAAQ,YAAY,QAAQ,iBAAiB,QAAQ;AAAA,QACjF,SAAS;AAAA,QACT,eAAe;AAAA,QACf,IAAI;AAAA,UACF,aAAa;AAAA,YACX,OAAO,EAAE,SAAS,OAAO;AAAA,UAC3B;AAAA,UACA,QAAQ;AAAA,YACN,OAAO,EAAE,SAAS,GAAG,QAAQ,OAAO;AAAA,UAAA;AAAA,QAExC;AAAA,QACA,QAAQ;AAAA,QACR,UAAS;AAAA,QAER,UAAA;AAAA,MAAA;AAAA,IACH;AAAA,EAAA;AAKF,SAAA,mDACG,WAAU,EAAA,WACT,gDAAC,OAAI,EAAA,WAAU,WAAW,UAAA,YAAA,CAAY,EACxC,CAAA;AAGN;"}
@@ -69,6 +69,8 @@ require("../api/queries/users/updateUsers.cjs.js");
69
69
  require("../api/queries/watchers/getWatchers.cjs.js");
70
70
  require("../api/queries/permissions/getPermissions.cjs.js");
71
71
  require("../api/queries/grouping/getGrouping.cjs.js");
72
+ require("../api/queries/versions/updateVersions.cjs.js");
73
+ require("../api/queries/products/createProduct.cjs.js");
72
74
  const useActionTriggers = ({
73
75
  searchParams,
74
76
  onSetSearchParams,
@@ -1 +1 @@
1
- {"version":3,"file":"useActionTriggers.cjs.js","sources":["../../../../src/hooks/useActionTriggers.ts"],"sourcesContent":["import { useDispatch } from 'react-redux'\nimport customProtocolCheck from 'custom-protocol-check'\nimport { api } from '@shared/api'\n\n\nexport type ActionTriggersProps = {\n searchParams: URLSearchParams\n onSetSearchParams: (params: URLSearchParams) => void\n onNavigate: (uri: string) => void\n}\n\ninterface QueryParams {\n [key: string]: string\n}\n\ninterface ActionPayload {\n query?: QueryParams // adds query params to the URL\n uri?: string // navigates to a different page\n new_tab?: boolean // opens a new tab\n extra_download?: string // triggers a file download from a URL\n extra_clipboard?: string // copies string content to clipboard\n extra_reload?: string[] // list of tags to invalidate\n [key: string]: any\n}\n\nexport const useActionTriggers = ({\n searchParams,\n onSetSearchParams,\n onNavigate,\n}: ActionTriggersProps) => {\n const dispatch = useDispatch()\n const handleActionPayload = (actionType: string, payload: ActionPayload | null): void => {\n if (!payload) return\n\n if (actionType === 'launcher') {\n if (payload?.uri) {\n customProtocolCheck(\n payload.uri,\n () => {},\n () => {},\n 2000,\n )\n }\n } else if (actionType === 'query') {\n // Validate it is an object of key:value pairs with value being string\n const isValid = Object.values(payload.query as QueryParams).every((value) => {\n return typeof value === 'string'\n })\n\n if (!isValid) {\n throw new Error('Invalid payload: query')\n } else {\n // Add query params to URL\n for (const [key, value] of Object.entries(payload.query as QueryParams)) {\n searchParams.set(key, value)\n }\n onSetSearchParams(searchParams)\n }\n } else if (actionType === 'navigate') {\n // Validate it is a string\n if (typeof payload.uri !== 'string') {\n throw new Error('Invalid payload: navigate')\n } else {\n // Navigate to the specified page\n onNavigate(payload.uri)\n }\n } else if (actionType === 'redirect') {\n // Validate it is a string\n if (typeof payload.uri !== 'string') {\n throw new Error('Invalid payload: redirect')\n } else {\n const newTab = payload?.new_tab || false\n window.open(payload.uri, newTab ? '_blank' : '_self')\n }\n }\n\n //\n // Sub-actions\n //\n\n if ('extra_download' in payload) {\n // Validate it is a string\n if (typeof payload.extra_download !== 'string') {\n throw new Error('Invalid payload: extra_download')\n } else {\n // Trigger file download from the URL\n const downloadUrl = new URL(payload.extra_download, window.location.origin).href\n console.log(downloadUrl)\n // Create a hidden anchor element\n const link = document.createElement('a')\n link.href = downloadUrl\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n // Set download attribute if it's a direct file download\n // If it's an API endpoint that handles the download, this is still good\n link.download = ''\n // Append to document, click and then remove\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n }\n }\n\n if ('extra_clipboard' in payload) {\n // Validate it is a string\n if (typeof payload.extra_clipboard !== 'string') {\n throw new Error('Invalid payload: extra_clipboard')\n } else {\n // Copy content to clipboard\n navigator.clipboard.writeText(payload.extra_clipboard).catch((err) => {\n console.error('Failed to copy text to clipboard:', err)\n })\n }\n }\n\n if ('extra_reload' in payload) {\n if (!Array.isArray(payload.extra_reload)) {\n throw new Error('Invalid payload: extra_reload')\n }\n\n if (payload.extra_reload.length) {\n dispatch(api.util.invalidateTags(payload.extra_reload))\n }\n }\n\n }\n\n return { handleActionPayload }\n}\n"],"names":["useDispatch","api"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,MAA2B;AACzB,QAAM,WAAWA,WAAAA,YAAY;AACvB,QAAA,sBAAsB,CAAC,YAAoB,YAAwC;AACvF,QAAI,CAAC,QAAS;AAEd,QAAI,eAAe,YAAY;AAC7B,UAAI,mCAAS,KAAK;AAChB;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UAAC;AAAA,UACP,MAAM;AAAA,UAAC;AAAA,UACP;AAAA,QACF;AAAA,MAAA;AAAA,IACF,WACS,eAAe,SAAS;AAE3B,YAAA,UAAU,OAAO,OAAO,QAAQ,KAAoB,EAAE,MAAM,CAAC,UAAU;AAC3E,eAAO,OAAO,UAAU;AAAA,MAAA,CACzB;AAED,UAAI,CAAC,SAAS;AACN,cAAA,IAAI,MAAM,wBAAwB;AAAA,MAAA,OACnC;AAEM,mBAAA,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAoB,GAAG;AAC1D,uBAAA,IAAI,KAAK,KAAK;AAAA,QAAA;AAE7B,0BAAkB,YAAY;AAAA,MAAA;AAAA,IAChC,WACS,eAAe,YAAY;AAEhC,UAAA,OAAO,QAAQ,QAAQ,UAAU;AAC7B,cAAA,IAAI,MAAM,2BAA2B;AAAA,MAAA,OACtC;AAEL,mBAAW,QAAQ,GAAG;AAAA,MAAA;AAAA,IACxB,WACS,eAAe,YAAY;AAEhC,UAAA,OAAO,QAAQ,QAAQ,UAAU;AAC7B,cAAA,IAAI,MAAM,2BAA2B;AAAA,MAAA,OACtC;AACC,cAAA,UAAS,mCAAS,YAAW;AACnC,eAAO,KAAK,QAAQ,KAAK,SAAS,WAAW,OAAO;AAAA,MAAA;AAAA,IACtD;AAOF,QAAI,oBAAoB,SAAS;AAE3B,UAAA,OAAO,QAAQ,mBAAmB,UAAU;AACxC,cAAA,IAAI,MAAM,iCAAiC;AAAA,MAAA,OAC5C;AAEC,cAAA,cAAc,IAAI,IAAI,QAAQ,gBAAgB,OAAO,SAAS,MAAM,EAAE;AAC5E,gBAAQ,IAAI,WAAW;AAEjB,cAAA,OAAO,SAAS,cAAc,GAAG;AACvC,aAAK,OAAO;AACZ,aAAK,SAAS;AACd,aAAK,MAAM;AAGX,aAAK,WAAW;AAEP,iBAAA,KAAK,YAAY,IAAI;AAC9B,aAAK,MAAM;AACF,iBAAA,KAAK,YAAY,IAAI;AAAA,MAAA;AAAA,IAChC;AAGF,QAAI,qBAAqB,SAAS;AAE5B,UAAA,OAAO,QAAQ,oBAAoB,UAAU;AACzC,cAAA,IAAI,MAAM,kCAAkC;AAAA,MAAA,OAC7C;AAEL,kBAAU,UAAU,UAAU,QAAQ,eAAe,EAAE,MAAM,CAAC,QAAQ;AAC5D,kBAAA,MAAM,qCAAqC,GAAG;AAAA,QAAA,CACvD;AAAA,MAAA;AAAA,IACH;AAGF,QAAI,kBAAkB,SAAS;AAC7B,UAAI,CAAC,MAAM,QAAQ,QAAQ,YAAY,GAAG;AAClC,cAAA,IAAI,MAAM,+BAA+B;AAAA,MAAA;AAG7C,UAAA,QAAQ,aAAa,QAAQ;AAC/B,iBAASC,OAAI,IAAA,KAAK,eAAe,QAAQ,YAAY,CAAC;AAAA,MAAA;AAAA,IACxD;AAAA,EAGJ;AAEA,SAAO,EAAE,oBAAoB;AAC/B;;"}
1
+ {"version":3,"file":"useActionTriggers.cjs.js","sources":["../../../../src/hooks/useActionTriggers.ts"],"sourcesContent":["import { useDispatch } from 'react-redux'\nimport customProtocolCheck from 'custom-protocol-check'\nimport { api } from '@shared/api'\n\n\nexport type ActionTriggersProps = {\n searchParams: URLSearchParams\n onSetSearchParams: (params: URLSearchParams) => void\n onNavigate: (uri: string) => void\n}\n\ninterface QueryParams {\n [key: string]: string\n}\n\ninterface ActionPayload {\n query?: QueryParams // adds query params to the URL\n uri?: string // navigates to a different page\n new_tab?: boolean // opens a new tab\n extra_download?: string // triggers a file download from a URL\n extra_clipboard?: string // copies string content to clipboard\n extra_reload?: string[] // list of tags to invalidate\n [key: string]: any\n}\n\nexport const useActionTriggers = ({\n searchParams,\n onSetSearchParams,\n onNavigate,\n}: ActionTriggersProps) => {\n const dispatch = useDispatch()\n const handleActionPayload = (actionType: string, payload: ActionPayload | null): void => {\n if (!payload) return\n\n if (actionType === 'launcher') {\n if (payload?.uri) {\n customProtocolCheck(\n payload.uri,\n () => {},\n () => {},\n 2000,\n )\n }\n } else if (actionType === 'query') {\n // Validate it is an object of key:value pairs with value being string\n const isValid = Object.values(payload.query as QueryParams).every((value) => {\n return typeof value === 'string'\n })\n\n if (!isValid) {\n throw new Error('Invalid payload: query')\n } else {\n // Add query params to URL\n for (const [key, value] of Object.entries(payload.query as QueryParams)) {\n searchParams.set(key, value)\n }\n onSetSearchParams(searchParams)\n }\n } else if (actionType === 'navigate') {\n // Validate it is a string\n if (typeof payload.uri !== 'string') {\n throw new Error('Invalid payload: navigate')\n } else {\n // Navigate to the specified page\n onNavigate(payload.uri)\n }\n } else if (actionType === 'redirect') {\n // Validate it is a string\n if (typeof payload.uri !== 'string') {\n throw new Error('Invalid payload: redirect')\n } else {\n const newTab = payload?.new_tab || false\n window.open(payload.uri, newTab ? '_blank' : '_self')\n }\n }\n\n //\n // Sub-actions\n //\n\n if ('extra_download' in payload) {\n // Validate it is a string\n if (typeof payload.extra_download !== 'string') {\n throw new Error('Invalid payload: extra_download')\n } else {\n // Trigger file download from the URL\n const downloadUrl = new URL(payload.extra_download, window.location.origin).href\n console.log(downloadUrl)\n // Create a hidden anchor element\n const link = document.createElement('a')\n link.href = downloadUrl\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n // Set download attribute if it's a direct file download\n // If it's an API endpoint that handles the download, this is still good\n link.download = ''\n // Append to document, click and then remove\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n }\n }\n\n if ('extra_clipboard' in payload) {\n // Validate it is a string\n if (typeof payload.extra_clipboard !== 'string') {\n throw new Error('Invalid payload: extra_clipboard')\n } else {\n // Copy content to clipboard\n navigator.clipboard.writeText(payload.extra_clipboard).catch((err) => {\n console.error('Failed to copy text to clipboard:', err)\n })\n }\n }\n\n if ('extra_reload' in payload) {\n if (!Array.isArray(payload.extra_reload)) {\n throw new Error('Invalid payload: extra_reload')\n }\n\n if (payload.extra_reload.length) {\n dispatch(api.util.invalidateTags(payload.extra_reload))\n }\n }\n\n }\n\n return { handleActionPayload }\n}\n"],"names":["useDispatch","api"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,MAA2B;AACzB,QAAM,WAAWA,WAAAA,YAAY;AACvB,QAAA,sBAAsB,CAAC,YAAoB,YAAwC;AACvF,QAAI,CAAC,QAAS;AAEd,QAAI,eAAe,YAAY;AAC7B,UAAI,mCAAS,KAAK;AAChB;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UAAC;AAAA,UACP,MAAM;AAAA,UAAC;AAAA,UACP;AAAA,QACF;AAAA,MAAA;AAAA,IACF,WACS,eAAe,SAAS;AAE3B,YAAA,UAAU,OAAO,OAAO,QAAQ,KAAoB,EAAE,MAAM,CAAC,UAAU;AAC3E,eAAO,OAAO,UAAU;AAAA,MAAA,CACzB;AAED,UAAI,CAAC,SAAS;AACN,cAAA,IAAI,MAAM,wBAAwB;AAAA,MAAA,OACnC;AAEM,mBAAA,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAoB,GAAG;AAC1D,uBAAA,IAAI,KAAK,KAAK;AAAA,QAAA;AAE7B,0BAAkB,YAAY;AAAA,MAAA;AAAA,IAChC,WACS,eAAe,YAAY;AAEhC,UAAA,OAAO,QAAQ,QAAQ,UAAU;AAC7B,cAAA,IAAI,MAAM,2BAA2B;AAAA,MAAA,OACtC;AAEL,mBAAW,QAAQ,GAAG;AAAA,MAAA;AAAA,IACxB,WACS,eAAe,YAAY;AAEhC,UAAA,OAAO,QAAQ,QAAQ,UAAU;AAC7B,cAAA,IAAI,MAAM,2BAA2B;AAAA,MAAA,OACtC;AACC,cAAA,UAAS,mCAAS,YAAW;AACnC,eAAO,KAAK,QAAQ,KAAK,SAAS,WAAW,OAAO;AAAA,MAAA;AAAA,IACtD;AAOF,QAAI,oBAAoB,SAAS;AAE3B,UAAA,OAAO,QAAQ,mBAAmB,UAAU;AACxC,cAAA,IAAI,MAAM,iCAAiC;AAAA,MAAA,OAC5C;AAEC,cAAA,cAAc,IAAI,IAAI,QAAQ,gBAAgB,OAAO,SAAS,MAAM,EAAE;AAC5E,gBAAQ,IAAI,WAAW;AAEjB,cAAA,OAAO,SAAS,cAAc,GAAG;AACvC,aAAK,OAAO;AACZ,aAAK,SAAS;AACd,aAAK,MAAM;AAGX,aAAK,WAAW;AAEP,iBAAA,KAAK,YAAY,IAAI;AAC9B,aAAK,MAAM;AACF,iBAAA,KAAK,YAAY,IAAI;AAAA,MAAA;AAAA,IAChC;AAGF,QAAI,qBAAqB,SAAS;AAE5B,UAAA,OAAO,QAAQ,oBAAoB,UAAU;AACzC,cAAA,IAAI,MAAM,kCAAkC;AAAA,MAAA,OAC7C;AAEL,kBAAU,UAAU,UAAU,QAAQ,eAAe,EAAE,MAAM,CAAC,QAAQ;AAC5D,kBAAA,MAAM,qCAAqC,GAAG;AAAA,QAAA,CACvD;AAAA,MAAA;AAAA,IACH;AAGF,QAAI,kBAAkB,SAAS;AAC7B,UAAI,CAAC,MAAM,QAAQ,QAAQ,YAAY,GAAG;AAClC,cAAA,IAAI,MAAM,+BAA+B;AAAA,MAAA;AAG7C,UAAA,QAAQ,aAAa,QAAQ;AAC/B,iBAASC,OAAI,IAAA,KAAK,eAAe,QAAQ,YAAY,CAAC;AAAA,MAAA;AAAA,IACxD;AAAA,EAGJ;AAEA,SAAO,EAAE,oBAAoB;AAC/B;;"}
@@ -67,6 +67,8 @@ import "../api/queries/users/updateUsers.es.js";
67
67
  import "../api/queries/watchers/getWatchers.es.js";
68
68
  import "../api/queries/permissions/getPermissions.es.js";
69
69
  import "../api/queries/grouping/getGrouping.es.js";
70
+ import "../api/queries/versions/updateVersions.es.js";
71
+ import "../api/queries/products/createProduct.es.js";
70
72
  const useActionTriggers = ({
71
73
  searchParams,
72
74
  onSetSearchParams,
@@ -1 +1 @@
1
- {"version":3,"file":"useActionTriggers.es.js","sources":["../../../../src/hooks/useActionTriggers.ts"],"sourcesContent":["import { useDispatch } from 'react-redux'\nimport customProtocolCheck from 'custom-protocol-check'\nimport { api } from '@shared/api'\n\n\nexport type ActionTriggersProps = {\n searchParams: URLSearchParams\n onSetSearchParams: (params: URLSearchParams) => void\n onNavigate: (uri: string) => void\n}\n\ninterface QueryParams {\n [key: string]: string\n}\n\ninterface ActionPayload {\n query?: QueryParams // adds query params to the URL\n uri?: string // navigates to a different page\n new_tab?: boolean // opens a new tab\n extra_download?: string // triggers a file download from a URL\n extra_clipboard?: string // copies string content to clipboard\n extra_reload?: string[] // list of tags to invalidate\n [key: string]: any\n}\n\nexport const useActionTriggers = ({\n searchParams,\n onSetSearchParams,\n onNavigate,\n}: ActionTriggersProps) => {\n const dispatch = useDispatch()\n const handleActionPayload = (actionType: string, payload: ActionPayload | null): void => {\n if (!payload) return\n\n if (actionType === 'launcher') {\n if (payload?.uri) {\n customProtocolCheck(\n payload.uri,\n () => {},\n () => {},\n 2000,\n )\n }\n } else if (actionType === 'query') {\n // Validate it is an object of key:value pairs with value being string\n const isValid = Object.values(payload.query as QueryParams).every((value) => {\n return typeof value === 'string'\n })\n\n if (!isValid) {\n throw new Error('Invalid payload: query')\n } else {\n // Add query params to URL\n for (const [key, value] of Object.entries(payload.query as QueryParams)) {\n searchParams.set(key, value)\n }\n onSetSearchParams(searchParams)\n }\n } else if (actionType === 'navigate') {\n // Validate it is a string\n if (typeof payload.uri !== 'string') {\n throw new Error('Invalid payload: navigate')\n } else {\n // Navigate to the specified page\n onNavigate(payload.uri)\n }\n } else if (actionType === 'redirect') {\n // Validate it is a string\n if (typeof payload.uri !== 'string') {\n throw new Error('Invalid payload: redirect')\n } else {\n const newTab = payload?.new_tab || false\n window.open(payload.uri, newTab ? '_blank' : '_self')\n }\n }\n\n //\n // Sub-actions\n //\n\n if ('extra_download' in payload) {\n // Validate it is a string\n if (typeof payload.extra_download !== 'string') {\n throw new Error('Invalid payload: extra_download')\n } else {\n // Trigger file download from the URL\n const downloadUrl = new URL(payload.extra_download, window.location.origin).href\n console.log(downloadUrl)\n // Create a hidden anchor element\n const link = document.createElement('a')\n link.href = downloadUrl\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n // Set download attribute if it's a direct file download\n // If it's an API endpoint that handles the download, this is still good\n link.download = ''\n // Append to document, click and then remove\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n }\n }\n\n if ('extra_clipboard' in payload) {\n // Validate it is a string\n if (typeof payload.extra_clipboard !== 'string') {\n throw new Error('Invalid payload: extra_clipboard')\n } else {\n // Copy content to clipboard\n navigator.clipboard.writeText(payload.extra_clipboard).catch((err) => {\n console.error('Failed to copy text to clipboard:', err)\n })\n }\n }\n\n if ('extra_reload' in payload) {\n if (!Array.isArray(payload.extra_reload)) {\n throw new Error('Invalid payload: extra_reload')\n }\n\n if (payload.extra_reload.length) {\n dispatch(api.util.invalidateTags(payload.extra_reload))\n }\n }\n\n }\n\n return { handleActionPayload }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,MAA2B;AACzB,QAAM,WAAW,YAAY;AACvB,QAAA,sBAAsB,CAAC,YAAoB,YAAwC;AACvF,QAAI,CAAC,QAAS;AAEd,QAAI,eAAe,YAAY;AAC7B,UAAI,mCAAS,KAAK;AAChB;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UAAC;AAAA,UACP,MAAM;AAAA,UAAC;AAAA,UACP;AAAA,QACF;AAAA,MAAA;AAAA,IACF,WACS,eAAe,SAAS;AAE3B,YAAA,UAAU,OAAO,OAAO,QAAQ,KAAoB,EAAE,MAAM,CAAC,UAAU;AAC3E,eAAO,OAAO,UAAU;AAAA,MAAA,CACzB;AAED,UAAI,CAAC,SAAS;AACN,cAAA,IAAI,MAAM,wBAAwB;AAAA,MAAA,OACnC;AAEM,mBAAA,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAoB,GAAG;AAC1D,uBAAA,IAAI,KAAK,KAAK;AAAA,QAAA;AAE7B,0BAAkB,YAAY;AAAA,MAAA;AAAA,IAChC,WACS,eAAe,YAAY;AAEhC,UAAA,OAAO,QAAQ,QAAQ,UAAU;AAC7B,cAAA,IAAI,MAAM,2BAA2B;AAAA,MAAA,OACtC;AAEL,mBAAW,QAAQ,GAAG;AAAA,MAAA;AAAA,IACxB,WACS,eAAe,YAAY;AAEhC,UAAA,OAAO,QAAQ,QAAQ,UAAU;AAC7B,cAAA,IAAI,MAAM,2BAA2B;AAAA,MAAA,OACtC;AACC,cAAA,UAAS,mCAAS,YAAW;AACnC,eAAO,KAAK,QAAQ,KAAK,SAAS,WAAW,OAAO;AAAA,MAAA;AAAA,IACtD;AAOF,QAAI,oBAAoB,SAAS;AAE3B,UAAA,OAAO,QAAQ,mBAAmB,UAAU;AACxC,cAAA,IAAI,MAAM,iCAAiC;AAAA,MAAA,OAC5C;AAEC,cAAA,cAAc,IAAI,IAAI,QAAQ,gBAAgB,OAAO,SAAS,MAAM,EAAE;AAC5E,gBAAQ,IAAI,WAAW;AAEjB,cAAA,OAAO,SAAS,cAAc,GAAG;AACvC,aAAK,OAAO;AACZ,aAAK,SAAS;AACd,aAAK,MAAM;AAGX,aAAK,WAAW;AAEP,iBAAA,KAAK,YAAY,IAAI;AAC9B,aAAK,MAAM;AACF,iBAAA,KAAK,YAAY,IAAI;AAAA,MAAA;AAAA,IAChC;AAGF,QAAI,qBAAqB,SAAS;AAE5B,UAAA,OAAO,QAAQ,oBAAoB,UAAU;AACzC,cAAA,IAAI,MAAM,kCAAkC;AAAA,MAAA,OAC7C;AAEL,kBAAU,UAAU,UAAU,QAAQ,eAAe,EAAE,MAAM,CAAC,QAAQ;AAC5D,kBAAA,MAAM,qCAAqC,GAAG;AAAA,QAAA,CACvD;AAAA,MAAA;AAAA,IACH;AAGF,QAAI,kBAAkB,SAAS;AAC7B,UAAI,CAAC,MAAM,QAAQ,QAAQ,YAAY,GAAG;AAClC,cAAA,IAAI,MAAM,+BAA+B;AAAA,MAAA;AAG7C,UAAA,QAAQ,aAAa,QAAQ;AAC/B,iBAAS,IAAI,KAAK,eAAe,QAAQ,YAAY,CAAC;AAAA,MAAA;AAAA,IACxD;AAAA,EAGJ;AAEA,SAAO,EAAE,oBAAoB;AAC/B;"}
1
+ {"version":3,"file":"useActionTriggers.es.js","sources":["../../../../src/hooks/useActionTriggers.ts"],"sourcesContent":["import { useDispatch } from 'react-redux'\nimport customProtocolCheck from 'custom-protocol-check'\nimport { api } from '@shared/api'\n\n\nexport type ActionTriggersProps = {\n searchParams: URLSearchParams\n onSetSearchParams: (params: URLSearchParams) => void\n onNavigate: (uri: string) => void\n}\n\ninterface QueryParams {\n [key: string]: string\n}\n\ninterface ActionPayload {\n query?: QueryParams // adds query params to the URL\n uri?: string // navigates to a different page\n new_tab?: boolean // opens a new tab\n extra_download?: string // triggers a file download from a URL\n extra_clipboard?: string // copies string content to clipboard\n extra_reload?: string[] // list of tags to invalidate\n [key: string]: any\n}\n\nexport const useActionTriggers = ({\n searchParams,\n onSetSearchParams,\n onNavigate,\n}: ActionTriggersProps) => {\n const dispatch = useDispatch()\n const handleActionPayload = (actionType: string, payload: ActionPayload | null): void => {\n if (!payload) return\n\n if (actionType === 'launcher') {\n if (payload?.uri) {\n customProtocolCheck(\n payload.uri,\n () => {},\n () => {},\n 2000,\n )\n }\n } else if (actionType === 'query') {\n // Validate it is an object of key:value pairs with value being string\n const isValid = Object.values(payload.query as QueryParams).every((value) => {\n return typeof value === 'string'\n })\n\n if (!isValid) {\n throw new Error('Invalid payload: query')\n } else {\n // Add query params to URL\n for (const [key, value] of Object.entries(payload.query as QueryParams)) {\n searchParams.set(key, value)\n }\n onSetSearchParams(searchParams)\n }\n } else if (actionType === 'navigate') {\n // Validate it is a string\n if (typeof payload.uri !== 'string') {\n throw new Error('Invalid payload: navigate')\n } else {\n // Navigate to the specified page\n onNavigate(payload.uri)\n }\n } else if (actionType === 'redirect') {\n // Validate it is a string\n if (typeof payload.uri !== 'string') {\n throw new Error('Invalid payload: redirect')\n } else {\n const newTab = payload?.new_tab || false\n window.open(payload.uri, newTab ? '_blank' : '_self')\n }\n }\n\n //\n // Sub-actions\n //\n\n if ('extra_download' in payload) {\n // Validate it is a string\n if (typeof payload.extra_download !== 'string') {\n throw new Error('Invalid payload: extra_download')\n } else {\n // Trigger file download from the URL\n const downloadUrl = new URL(payload.extra_download, window.location.origin).href\n console.log(downloadUrl)\n // Create a hidden anchor element\n const link = document.createElement('a')\n link.href = downloadUrl\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n // Set download attribute if it's a direct file download\n // If it's an API endpoint that handles the download, this is still good\n link.download = ''\n // Append to document, click and then remove\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n }\n }\n\n if ('extra_clipboard' in payload) {\n // Validate it is a string\n if (typeof payload.extra_clipboard !== 'string') {\n throw new Error('Invalid payload: extra_clipboard')\n } else {\n // Copy content to clipboard\n navigator.clipboard.writeText(payload.extra_clipboard).catch((err) => {\n console.error('Failed to copy text to clipboard:', err)\n })\n }\n }\n\n if ('extra_reload' in payload) {\n if (!Array.isArray(payload.extra_reload)) {\n throw new Error('Invalid payload: extra_reload')\n }\n\n if (payload.extra_reload.length) {\n dispatch(api.util.invalidateTags(payload.extra_reload))\n }\n }\n\n }\n\n return { handleActionPayload }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,MAA2B;AACzB,QAAM,WAAW,YAAY;AACvB,QAAA,sBAAsB,CAAC,YAAoB,YAAwC;AACvF,QAAI,CAAC,QAAS;AAEd,QAAI,eAAe,YAAY;AAC7B,UAAI,mCAAS,KAAK;AAChB;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UAAC;AAAA,UACP,MAAM;AAAA,UAAC;AAAA,UACP;AAAA,QACF;AAAA,MAAA;AAAA,IACF,WACS,eAAe,SAAS;AAE3B,YAAA,UAAU,OAAO,OAAO,QAAQ,KAAoB,EAAE,MAAM,CAAC,UAAU;AAC3E,eAAO,OAAO,UAAU;AAAA,MAAA,CACzB;AAED,UAAI,CAAC,SAAS;AACN,cAAA,IAAI,MAAM,wBAAwB;AAAA,MAAA,OACnC;AAEM,mBAAA,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAoB,GAAG;AAC1D,uBAAA,IAAI,KAAK,KAAK;AAAA,QAAA;AAE7B,0BAAkB,YAAY;AAAA,MAAA;AAAA,IAChC,WACS,eAAe,YAAY;AAEhC,UAAA,OAAO,QAAQ,QAAQ,UAAU;AAC7B,cAAA,IAAI,MAAM,2BAA2B;AAAA,MAAA,OACtC;AAEL,mBAAW,QAAQ,GAAG;AAAA,MAAA;AAAA,IACxB,WACS,eAAe,YAAY;AAEhC,UAAA,OAAO,QAAQ,QAAQ,UAAU;AAC7B,cAAA,IAAI,MAAM,2BAA2B;AAAA,MAAA,OACtC;AACC,cAAA,UAAS,mCAAS,YAAW;AACnC,eAAO,KAAK,QAAQ,KAAK,SAAS,WAAW,OAAO;AAAA,MAAA;AAAA,IACtD;AAOF,QAAI,oBAAoB,SAAS;AAE3B,UAAA,OAAO,QAAQ,mBAAmB,UAAU;AACxC,cAAA,IAAI,MAAM,iCAAiC;AAAA,MAAA,OAC5C;AAEC,cAAA,cAAc,IAAI,IAAI,QAAQ,gBAAgB,OAAO,SAAS,MAAM,EAAE;AAC5E,gBAAQ,IAAI,WAAW;AAEjB,cAAA,OAAO,SAAS,cAAc,GAAG;AACvC,aAAK,OAAO;AACZ,aAAK,SAAS;AACd,aAAK,MAAM;AAGX,aAAK,WAAW;AAEP,iBAAA,KAAK,YAAY,IAAI;AAC9B,aAAK,MAAM;AACF,iBAAA,KAAK,YAAY,IAAI;AAAA,MAAA;AAAA,IAChC;AAGF,QAAI,qBAAqB,SAAS;AAE5B,UAAA,OAAO,QAAQ,oBAAoB,UAAU;AACzC,cAAA,IAAI,MAAM,kCAAkC;AAAA,MAAA,OAC7C;AAEL,kBAAU,UAAU,UAAU,QAAQ,eAAe,EAAE,MAAM,CAAC,QAAQ;AAC5D,kBAAA,MAAM,qCAAqC,GAAG;AAAA,QAAA,CACvD;AAAA,MAAA;AAAA,IACH;AAGF,QAAI,kBAAkB,SAAS;AAC7B,UAAI,CAAC,MAAM,QAAQ,QAAQ,YAAY,GAAG;AAClC,cAAA,IAAI,MAAM,+BAA+B;AAAA,MAAA;AAG7C,UAAA,QAAQ,aAAa,QAAQ;AAC/B,iBAAS,IAAI,KAAK,eAAe,QAAQ,YAAY,CAAC;AAAA,MAAA;AAAA,IACxD;AAAA,EAGJ;AAEA,SAAO,EAAE,oBAAoB;AAC/B;"}
@@ -68,6 +68,8 @@ require("../api/queries/users/updateUsers.cjs.js");
68
68
  require("../api/queries/watchers/getWatchers.cjs.js");
69
69
  require("../api/queries/permissions/getPermissions.cjs.js");
70
70
  require("../api/queries/grouping/getGrouping.cjs.js");
71
+ require("../api/queries/versions/updateVersions.cjs.js");
72
+ require("../api/queries/products/createProduct.cjs.js");
71
73
  require("../context/RemoteModulesContext.cjs.js");
72
74
  const DetailsPanelContext = require("../context/DetailsPanelContext.cjs.js");
73
75
  require("../context/ThumbnailUploaderContext.cjs.js");
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityUpdate.cjs.js","sources":["../../../../src/hooks/useEntityUpdate.ts"],"sourcesContent":["import { toast } from 'react-toastify'\nimport { useUpdateEntitiesMutation } from '@shared/api'\nimport { useContext } from 'react'\nimport { useDetailsPanelContext } from '@shared/context'\n\ninterface Entity {\n id: string\n projectName: string\n users: string[]\n folderId?: string\n productId?: string\n}\n\nexport interface UseEntityUpdateParams {\n entities: Entity[]\n entityType: string\n}\n\n/**\n * Hook for updating entities with proper error handling and version-specific logic\n */\nexport const useEntityUpdate = ({ entities, entityType }: UseEntityUpdateParams) => {\n const [updateEntities] = useUpdateEntitiesMutation()\n const { onUpdateEntity } = useDetailsPanelContext()\n\n /**\n * Updates entities with the specified field and value\n * @param field The field to update\n * @param value The new value for the field\n * @returns Promise that resolves when the update is complete\n */\n const updateEntity = async (field: string, value: any): Promise<void> => {\n if (value === null || value === undefined) {\n console.error('value is null or undefined')\n return\n }\n\n try {\n // Build entities operations array\n const operations = entities.map((entity) => ({\n id: entity.id,\n projectName: entity.projectName,\n data: {\n [field]: value,\n },\n currentAssignees: entity.users,\n meta: {\n folderId: entity.folderId,\n },\n }))\n\n await updateEntities({ operations, entityType })\n onUpdateEntity?.({ operations, entityType })\n } catch (error) {\n toast.error(`Error updating ${entityType}`)\n }\n }\n\n return { updateEntity }\n}\n"],"names":["useUpdateEntitiesMutation","useDetailsPanelContext","updateEntity","toast"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,MAAM,kBAAkB,CAAC,EAAE,UAAU,iBAAwC;AAC5E,QAAA,CAAC,cAAc,IAAIA,uCAA0B;AAC7C,QAAA,EAAE,eAAe,IAAIC,2CAAuB;AAQ5C,QAAAC,iBAAe,OAAO,OAAe,UAA8B;AACnE,QAAA,UAAU,QAAQ,UAAU,QAAW;AACzC,cAAQ,MAAM,4BAA4B;AAC1C;AAAA,IAAA;AAGE,QAAA;AAEF,YAAM,aAAa,SAAS,IAAI,CAAC,YAAY;AAAA,QAC3C,IAAI,OAAO;AAAA,QACX,aAAa,OAAO;AAAA,QACpB,MAAM;AAAA,UACJ,CAAC,KAAK,GAAG;AAAA,QACX;AAAA,QACA,kBAAkB,OAAO;AAAA,QACzB,MAAM;AAAA,UACJ,UAAU,OAAO;AAAA,QAAA;AAAA,MACnB,EACA;AAEF,YAAM,eAAe,EAAE,YAAY,YAAY;AAC9B,uDAAA,EAAE,YAAY;aACxB,OAAO;AACRC,oBAAAA,MAAA,MAAM,kBAAkB,UAAU,EAAE;AAAA,IAAA;AAAA,EAE9C;AAEA,SAAO,EAAED,cAAAA,eAAa;AACxB;;"}
1
+ {"version":3,"file":"useEntityUpdate.cjs.js","sources":["../../../../src/hooks/useEntityUpdate.ts"],"sourcesContent":["import { toast } from 'react-toastify'\nimport { useUpdateEntitiesMutation } from '@shared/api'\nimport { useContext } from 'react'\nimport { useDetailsPanelContext } from '@shared/context'\n\ninterface Entity {\n id: string\n projectName: string\n users: string[]\n folderId?: string\n productId?: string\n}\n\nexport interface UseEntityUpdateParams {\n entities: Entity[]\n entityType: string\n}\n\n/**\n * Hook for updating entities with proper error handling and version-specific logic\n */\nexport const useEntityUpdate = ({ entities, entityType }: UseEntityUpdateParams) => {\n const [updateEntities] = useUpdateEntitiesMutation()\n const { onUpdateEntity } = useDetailsPanelContext()\n\n /**\n * Updates entities with the specified field and value\n * @param field The field to update\n * @param value The new value for the field\n * @returns Promise that resolves when the update is complete\n */\n const updateEntity = async (field: string, value: any): Promise<void> => {\n if (value === null || value === undefined) {\n console.error('value is null or undefined')\n return\n }\n\n try {\n // Build entities operations array\n const operations = entities.map((entity) => ({\n id: entity.id,\n projectName: entity.projectName,\n data: {\n [field]: value,\n },\n currentAssignees: entity.users,\n meta: {\n folderId: entity.folderId,\n },\n }))\n\n await updateEntities({ operations, entityType })\n onUpdateEntity?.({ operations, entityType })\n } catch (error) {\n toast.error(`Error updating ${entityType}`)\n }\n }\n\n return { updateEntity }\n}\n"],"names":["useUpdateEntitiesMutation","useDetailsPanelContext","updateEntity","toast"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,MAAM,kBAAkB,CAAC,EAAE,UAAU,iBAAwC;AAC5E,QAAA,CAAC,cAAc,IAAIA,uCAA0B;AAC7C,QAAA,EAAE,eAAe,IAAIC,2CAAuB;AAQ5C,QAAAC,iBAAe,OAAO,OAAe,UAA8B;AACnE,QAAA,UAAU,QAAQ,UAAU,QAAW;AACzC,cAAQ,MAAM,4BAA4B;AAC1C;AAAA,IAAA;AAGE,QAAA;AAEF,YAAM,aAAa,SAAS,IAAI,CAAC,YAAY;AAAA,QAC3C,IAAI,OAAO;AAAA,QACX,aAAa,OAAO;AAAA,QACpB,MAAM;AAAA,UACJ,CAAC,KAAK,GAAG;AAAA,QACX;AAAA,QACA,kBAAkB,OAAO;AAAA,QACzB,MAAM;AAAA,UACJ,UAAU,OAAO;AAAA,QAAA;AAAA,MACnB,EACA;AAEF,YAAM,eAAe,EAAE,YAAY,YAAY;AAC9B,uDAAA,EAAE,YAAY;aACxB,OAAO;AACRC,oBAAAA,MAAA,MAAM,kBAAkB,UAAU,EAAE;AAAA,IAAA;AAAA,EAE9C;AAEA,SAAO,EAAED,cAAAA,eAAa;AACxB;;"}
@@ -66,6 +66,8 @@ import "../api/queries/users/updateUsers.es.js";
66
66
  import "../api/queries/watchers/getWatchers.es.js";
67
67
  import "../api/queries/permissions/getPermissions.es.js";
68
68
  import "../api/queries/grouping/getGrouping.es.js";
69
+ import "../api/queries/versions/updateVersions.es.js";
70
+ import "../api/queries/products/createProduct.es.js";
69
71
  import "../context/RemoteModulesContext.es.js";
70
72
  import { useDetailsPanelContext } from "../context/DetailsPanelContext.es.js";
71
73
  import "../context/ThumbnailUploaderContext.es.js";
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityUpdate.es.js","sources":["../../../../src/hooks/useEntityUpdate.ts"],"sourcesContent":["import { toast } from 'react-toastify'\nimport { useUpdateEntitiesMutation } from '@shared/api'\nimport { useContext } from 'react'\nimport { useDetailsPanelContext } from '@shared/context'\n\ninterface Entity {\n id: string\n projectName: string\n users: string[]\n folderId?: string\n productId?: string\n}\n\nexport interface UseEntityUpdateParams {\n entities: Entity[]\n entityType: string\n}\n\n/**\n * Hook for updating entities with proper error handling and version-specific logic\n */\nexport const useEntityUpdate = ({ entities, entityType }: UseEntityUpdateParams) => {\n const [updateEntities] = useUpdateEntitiesMutation()\n const { onUpdateEntity } = useDetailsPanelContext()\n\n /**\n * Updates entities with the specified field and value\n * @param field The field to update\n * @param value The new value for the field\n * @returns Promise that resolves when the update is complete\n */\n const updateEntity = async (field: string, value: any): Promise<void> => {\n if (value === null || value === undefined) {\n console.error('value is null or undefined')\n return\n }\n\n try {\n // Build entities operations array\n const operations = entities.map((entity) => ({\n id: entity.id,\n projectName: entity.projectName,\n data: {\n [field]: value,\n },\n currentAssignees: entity.users,\n meta: {\n folderId: entity.folderId,\n },\n }))\n\n await updateEntities({ operations, entityType })\n onUpdateEntity?.({ operations, entityType })\n } catch (error) {\n toast.error(`Error updating ${entityType}`)\n }\n }\n\n return { updateEntity }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,MAAM,kBAAkB,CAAC,EAAE,UAAU,iBAAwC;AAC5E,QAAA,CAAC,cAAc,IAAI,0BAA0B;AAC7C,QAAA,EAAE,eAAe,IAAI,uBAAuB;AAQ5C,QAAA,eAAe,OAAO,OAAe,UAA8B;AACnE,QAAA,UAAU,QAAQ,UAAU,QAAW;AACzC,cAAQ,MAAM,4BAA4B;AAC1C;AAAA,IAAA;AAGE,QAAA;AAEF,YAAM,aAAa,SAAS,IAAI,CAAC,YAAY;AAAA,QAC3C,IAAI,OAAO;AAAA,QACX,aAAa,OAAO;AAAA,QACpB,MAAM;AAAA,UACJ,CAAC,KAAK,GAAG;AAAA,QACX;AAAA,QACA,kBAAkB,OAAO;AAAA,QACzB,MAAM;AAAA,UACJ,UAAU,OAAO;AAAA,QAAA;AAAA,MACnB,EACA;AAEF,YAAM,eAAe,EAAE,YAAY,YAAY;AAC9B,uDAAA,EAAE,YAAY;aACxB,OAAO;AACR,YAAA,MAAM,kBAAkB,UAAU,EAAE;AAAA,IAAA;AAAA,EAE9C;AAEA,SAAO,EAAE,aAAa;AACxB;"}
1
+ {"version":3,"file":"useEntityUpdate.es.js","sources":["../../../../src/hooks/useEntityUpdate.ts"],"sourcesContent":["import { toast } from 'react-toastify'\nimport { useUpdateEntitiesMutation } from '@shared/api'\nimport { useContext } from 'react'\nimport { useDetailsPanelContext } from '@shared/context'\n\ninterface Entity {\n id: string\n projectName: string\n users: string[]\n folderId?: string\n productId?: string\n}\n\nexport interface UseEntityUpdateParams {\n entities: Entity[]\n entityType: string\n}\n\n/**\n * Hook for updating entities with proper error handling and version-specific logic\n */\nexport const useEntityUpdate = ({ entities, entityType }: UseEntityUpdateParams) => {\n const [updateEntities] = useUpdateEntitiesMutation()\n const { onUpdateEntity } = useDetailsPanelContext()\n\n /**\n * Updates entities with the specified field and value\n * @param field The field to update\n * @param value The new value for the field\n * @returns Promise that resolves when the update is complete\n */\n const updateEntity = async (field: string, value: any): Promise<void> => {\n if (value === null || value === undefined) {\n console.error('value is null or undefined')\n return\n }\n\n try {\n // Build entities operations array\n const operations = entities.map((entity) => ({\n id: entity.id,\n projectName: entity.projectName,\n data: {\n [field]: value,\n },\n currentAssignees: entity.users,\n meta: {\n folderId: entity.folderId,\n },\n }))\n\n await updateEntities({ operations, entityType })\n onUpdateEntity?.({ operations, entityType })\n } catch (error) {\n toast.error(`Error updating ${entityType}`)\n }\n }\n\n return { updateEntity }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBO,MAAM,kBAAkB,CAAC,EAAE,UAAU,iBAAwC;AAC5E,QAAA,CAAC,cAAc,IAAI,0BAA0B;AAC7C,QAAA,EAAE,eAAe,IAAI,uBAAuB;AAQ5C,QAAA,eAAe,OAAO,OAAe,UAA8B;AACnE,QAAA,UAAU,QAAQ,UAAU,QAAW;AACzC,cAAQ,MAAM,4BAA4B;AAC1C;AAAA,IAAA;AAGE,QAAA;AAEF,YAAM,aAAa,SAAS,IAAI,CAAC,YAAY;AAAA,QAC3C,IAAI,OAAO;AAAA,QACX,aAAa,OAAO;AAAA,QACpB,MAAM;AAAA,UACJ,CAAC,KAAK,GAAG;AAAA,QACX;AAAA,QACA,kBAAkB,OAAO;AAAA,QACzB,MAAM;AAAA,UACJ,UAAU,OAAO;AAAA,QAAA;AAAA,MACnB,EACA;AAEF,YAAM,eAAe,EAAE,YAAY,YAAY;AAC9B,uDAAA,EAAE,YAAY;aACxB,OAAO;AACR,YAAA,MAAM,kBAAkB,UAAU,EAAE;AAAA,IAAA;AAAA,EAE9C;AAEA,SAAO,EAAE,aAAa;AACxB;"}
@@ -67,6 +67,8 @@ require("../api/queries/users/updateUsers.cjs.js");
67
67
  require("../api/queries/watchers/getWatchers.cjs.js");
68
68
  require("../api/queries/permissions/getPermissions.cjs.js");
69
69
  require("../api/queries/grouping/getGrouping.cjs.js");
70
+ require("../api/queries/versions/updateVersions.cjs.js");
71
+ require("../api/queries/products/createProduct.cjs.js");
70
72
  const lodash = require("lodash");
71
73
  const useScopedStatuses = (projects, entityTypes) => {
72
74
  const response = getUserDashboard.useGetProjectsInfoQuery({ projects: [...new Set(projects).values()] });
@@ -1 +1 @@
1
- {"version":3,"file":"useScopedStatuses.cjs.js","sources":["../../../../src/hooks/useScopedStatuses.ts"],"sourcesContent":["import { useGetProjectsInfoQuery } from '@shared/api'\nimport type { ProjectModel, Status } from '@shared/api'\nimport { intersectionBy } from 'lodash'\n\ntype EntityStatus = Status & {\n scope?: string[]\n}\n\nexport const useScopedStatuses = (projects: string[], entityTypes: string[]) => {\n const response = useGetProjectsInfoQuery({ projects: [...new Set(projects).values()] })\n\n if (!response || !response.data) {\n return []\n }\n\n let currentStatuses: EntityStatus[] | undefined\n for (const item of Object.values(response.data) as ProjectModel[]) {\n const filteredStatuses = item.statuses!.filter((status: EntityStatus) =>\n entityTypes.every((type) => (!status.scope || status.scope?.includes(type))),\n )\n if (currentStatuses === undefined) {\n currentStatuses = filteredStatuses\n continue\n }\n currentStatuses = intersectionBy(currentStatuses, filteredStatuses, 'name')\n }\n\n return currentStatuses\n}\n\nexport const filterProjectStatuses = (statuses: EntityStatus[], entityTypes: string[]) => {\n let statusesList: EntityStatus[] = Object.values(statuses || {})\n\n if (statusesList.length == 0 || statusesList[0].scope === undefined) {\n return statusesList\n }\n\n return statusesList.filter((el) => entityTypes.every((type) => el.scope!.includes(type)))\n}\n"],"names":["useGetProjectsInfoQuery","intersectionBy"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQa,MAAA,oBAAoB,CAAC,UAAoB,gBAA0B;AAC9E,QAAM,WAAWA,iBAAAA,wBAAwB,EAAE,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,OAAQ,CAAA,GAAG;AAEtF,MAAI,CAAC,YAAY,CAAC,SAAS,MAAM;AAC/B,WAAO,CAAC;AAAA,EAAA;AAGN,MAAA;AACJ,aAAW,QAAQ,OAAO,OAAO,SAAS,IAAI,GAAqB;AAC3D,UAAA,mBAAmB,KAAK,SAAU;AAAA,MAAO,CAAC,WAC9C,YAAY,MAAM,CAAC,SAAU;;AAAA,gBAAC,OAAO,WAAS,YAAO,UAAP,mBAAc,SAAS;AAAA,OAAM;AAAA,IAC7E;AACA,QAAI,oBAAoB,QAAW;AACf,wBAAA;AAClB;AAAA,IAAA;AAEgB,sBAAAC,OAAA,eAAe,iBAAiB,kBAAkB,MAAM;AAAA,EAAA;AAGrE,SAAA;AACT;AAEa,MAAA,wBAAwB,CAAC,UAA0B,gBAA0B;AACxF,MAAI,eAA+B,OAAO,OAAO,YAAY,CAAA,CAAE;AAE/D,MAAI,aAAa,UAAU,KAAK,aAAa,CAAC,EAAE,UAAU,QAAW;AAC5D,WAAA;AAAA,EAAA;AAGT,SAAO,aAAa,OAAO,CAAC,OAAO,YAAY,MAAM,CAAC,SAAS,GAAG,MAAO,SAAS,IAAI,CAAC,CAAC;AAC1F;;;"}
1
+ {"version":3,"file":"useScopedStatuses.cjs.js","sources":["../../../../src/hooks/useScopedStatuses.ts"],"sourcesContent":["import { useGetProjectsInfoQuery } from '@shared/api'\nimport type { ProjectModel, Status } from '@shared/api'\nimport { intersectionBy } from 'lodash'\n\ntype EntityStatus = Status & {\n scope?: string[]\n}\n\nexport const useScopedStatuses = (projects: string[], entityTypes: string[]) => {\n const response = useGetProjectsInfoQuery({ projects: [...new Set(projects).values()] })\n\n if (!response || !response.data) {\n return []\n }\n\n let currentStatuses: EntityStatus[] | undefined\n for (const item of Object.values(response.data) as ProjectModel[]) {\n const filteredStatuses = item.statuses!.filter((status: EntityStatus) =>\n entityTypes.every((type) => (!status.scope || status.scope?.includes(type))),\n )\n if (currentStatuses === undefined) {\n currentStatuses = filteredStatuses\n continue\n }\n currentStatuses = intersectionBy(currentStatuses, filteredStatuses, 'name')\n }\n\n return currentStatuses\n}\n\nexport const filterProjectStatuses = (statuses: EntityStatus[], entityTypes: string[]) => {\n let statusesList: EntityStatus[] = Object.values(statuses || {})\n\n if (statusesList.length == 0 || statusesList[0].scope === undefined) {\n return statusesList\n }\n\n return statusesList.filter((el) => entityTypes.every((type) => el.scope!.includes(type)))\n}\n"],"names":["useGetProjectsInfoQuery","intersectionBy"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQa,MAAA,oBAAoB,CAAC,UAAoB,gBAA0B;AAC9E,QAAM,WAAWA,iBAAAA,wBAAwB,EAAE,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,OAAQ,CAAA,GAAG;AAEtF,MAAI,CAAC,YAAY,CAAC,SAAS,MAAM;AAC/B,WAAO,CAAC;AAAA,EAAA;AAGN,MAAA;AACJ,aAAW,QAAQ,OAAO,OAAO,SAAS,IAAI,GAAqB;AAC3D,UAAA,mBAAmB,KAAK,SAAU;AAAA,MAAO,CAAC,WAC9C,YAAY,MAAM,CAAC,SAAU;;AAAA,gBAAC,OAAO,WAAS,YAAO,UAAP,mBAAc,SAAS;AAAA,OAAM;AAAA,IAC7E;AACA,QAAI,oBAAoB,QAAW;AACf,wBAAA;AAClB;AAAA,IAAA;AAEgB,sBAAAC,OAAA,eAAe,iBAAiB,kBAAkB,MAAM;AAAA,EAAA;AAGrE,SAAA;AACT;AAEa,MAAA,wBAAwB,CAAC,UAA0B,gBAA0B;AACxF,MAAI,eAA+B,OAAO,OAAO,YAAY,CAAA,CAAE;AAE/D,MAAI,aAAa,UAAU,KAAK,aAAa,CAAC,EAAE,UAAU,QAAW;AAC5D,WAAA;AAAA,EAAA;AAGT,SAAO,aAAa,OAAO,CAAC,OAAO,YAAY,MAAM,CAAC,SAAS,GAAG,MAAO,SAAS,IAAI,CAAC,CAAC;AAC1F;;;"}
@@ -65,6 +65,8 @@ import "../api/queries/users/updateUsers.es.js";
65
65
  import "../api/queries/watchers/getWatchers.es.js";
66
66
  import "../api/queries/permissions/getPermissions.es.js";
67
67
  import "../api/queries/grouping/getGrouping.es.js";
68
+ import "../api/queries/versions/updateVersions.es.js";
69
+ import "../api/queries/products/createProduct.es.js";
68
70
  import { intersectionBy } from "lodash";
69
71
  const useScopedStatuses = (projects, entityTypes) => {
70
72
  const response = useGetProjectsInfoQuery({ projects: [...new Set(projects).values()] });
@@ -1 +1 @@
1
- {"version":3,"file":"useScopedStatuses.es.js","sources":["../../../../src/hooks/useScopedStatuses.ts"],"sourcesContent":["import { useGetProjectsInfoQuery } from '@shared/api'\nimport type { ProjectModel, Status } from '@shared/api'\nimport { intersectionBy } from 'lodash'\n\ntype EntityStatus = Status & {\n scope?: string[]\n}\n\nexport const useScopedStatuses = (projects: string[], entityTypes: string[]) => {\n const response = useGetProjectsInfoQuery({ projects: [...new Set(projects).values()] })\n\n if (!response || !response.data) {\n return []\n }\n\n let currentStatuses: EntityStatus[] | undefined\n for (const item of Object.values(response.data) as ProjectModel[]) {\n const filteredStatuses = item.statuses!.filter((status: EntityStatus) =>\n entityTypes.every((type) => (!status.scope || status.scope?.includes(type))),\n )\n if (currentStatuses === undefined) {\n currentStatuses = filteredStatuses\n continue\n }\n currentStatuses = intersectionBy(currentStatuses, filteredStatuses, 'name')\n }\n\n return currentStatuses\n}\n\nexport const filterProjectStatuses = (statuses: EntityStatus[], entityTypes: string[]) => {\n let statusesList: EntityStatus[] = Object.values(statuses || {})\n\n if (statusesList.length == 0 || statusesList[0].scope === undefined) {\n return statusesList\n }\n\n return statusesList.filter((el) => entityTypes.every((type) => el.scope!.includes(type)))\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQa,MAAA,oBAAoB,CAAC,UAAoB,gBAA0B;AAC9E,QAAM,WAAW,wBAAwB,EAAE,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,OAAQ,CAAA,GAAG;AAEtF,MAAI,CAAC,YAAY,CAAC,SAAS,MAAM;AAC/B,WAAO,CAAC;AAAA,EAAA;AAGN,MAAA;AACJ,aAAW,QAAQ,OAAO,OAAO,SAAS,IAAI,GAAqB;AAC3D,UAAA,mBAAmB,KAAK,SAAU;AAAA,MAAO,CAAC,WAC9C,YAAY,MAAM,CAAC,SAAU;;AAAA,gBAAC,OAAO,WAAS,YAAO,UAAP,mBAAc,SAAS;AAAA,OAAM;AAAA,IAC7E;AACA,QAAI,oBAAoB,QAAW;AACf,wBAAA;AAClB;AAAA,IAAA;AAEgB,sBAAA,eAAe,iBAAiB,kBAAkB,MAAM;AAAA,EAAA;AAGrE,SAAA;AACT;AAEa,MAAA,wBAAwB,CAAC,UAA0B,gBAA0B;AACxF,MAAI,eAA+B,OAAO,OAAO,YAAY,CAAA,CAAE;AAE/D,MAAI,aAAa,UAAU,KAAK,aAAa,CAAC,EAAE,UAAU,QAAW;AAC5D,WAAA;AAAA,EAAA;AAGT,SAAO,aAAa,OAAO,CAAC,OAAO,YAAY,MAAM,CAAC,SAAS,GAAG,MAAO,SAAS,IAAI,CAAC,CAAC;AAC1F;"}
1
+ {"version":3,"file":"useScopedStatuses.es.js","sources":["../../../../src/hooks/useScopedStatuses.ts"],"sourcesContent":["import { useGetProjectsInfoQuery } from '@shared/api'\nimport type { ProjectModel, Status } from '@shared/api'\nimport { intersectionBy } from 'lodash'\n\ntype EntityStatus = Status & {\n scope?: string[]\n}\n\nexport const useScopedStatuses = (projects: string[], entityTypes: string[]) => {\n const response = useGetProjectsInfoQuery({ projects: [...new Set(projects).values()] })\n\n if (!response || !response.data) {\n return []\n }\n\n let currentStatuses: EntityStatus[] | undefined\n for (const item of Object.values(response.data) as ProjectModel[]) {\n const filteredStatuses = item.statuses!.filter((status: EntityStatus) =>\n entityTypes.every((type) => (!status.scope || status.scope?.includes(type))),\n )\n if (currentStatuses === undefined) {\n currentStatuses = filteredStatuses\n continue\n }\n currentStatuses = intersectionBy(currentStatuses, filteredStatuses, 'name')\n }\n\n return currentStatuses\n}\n\nexport const filterProjectStatuses = (statuses: EntityStatus[], entityTypes: string[]) => {\n let statusesList: EntityStatus[] = Object.values(statuses || {})\n\n if (statusesList.length == 0 || statusesList[0].scope === undefined) {\n return statusesList\n }\n\n return statusesList.filter((el) => entityTypes.every((type) => el.scope!.includes(type)))\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQa,MAAA,oBAAoB,CAAC,UAAoB,gBAA0B;AAC9E,QAAM,WAAW,wBAAwB,EAAE,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,OAAQ,CAAA,GAAG;AAEtF,MAAI,CAAC,YAAY,CAAC,SAAS,MAAM;AAC/B,WAAO,CAAC;AAAA,EAAA;AAGN,MAAA;AACJ,aAAW,QAAQ,OAAO,OAAO,SAAS,IAAI,GAAqB;AAC3D,UAAA,mBAAmB,KAAK,SAAU;AAAA,MAAO,CAAC,WAC9C,YAAY,MAAM,CAAC,SAAU;;AAAA,gBAAC,OAAO,WAAS,YAAO,UAAP,mBAAc,SAAS;AAAA,OAAM;AAAA,IAC7E;AACA,QAAI,oBAAoB,QAAW;AACf,wBAAA;AAClB;AAAA,IAAA;AAEgB,sBAAA,eAAe,iBAAiB,kBAAkB,MAAM;AAAA,EAAA;AAGrE,SAAA;AACT;AAEa,MAAA,wBAAwB,CAAC,UAA0B,gBAA0B;AACxF,MAAI,eAA+B,OAAO,OAAO,YAAY,CAAA,CAAE;AAE/D,MAAI,aAAa,UAAU,KAAK,aAAa,CAAC,EAAE,UAAU,QAAW;AAC5D,WAAA;AAAA,EAAA;AAGT,SAAO,aAAa,OAAO,CAAC,OAAO,YAAY,MAAM,CAAC,SAAS,GAAG,MAAO,SAAS,IAAI,CAAC,CAAC;AAC1F;"}
@@ -67,6 +67,8 @@ const updateUsers = require("../api/queries/users/updateUsers.cjs.js");
67
67
  require("../api/queries/watchers/getWatchers.cjs.js");
68
68
  require("../api/queries/permissions/getPermissions.cjs.js");
69
69
  require("../api/queries/grouping/getGrouping.cjs.js");
70
+ require("../api/queries/versions/updateVersions.cjs.js");
71
+ require("../api/queries/products/createProduct.cjs.js");
70
72
  const reactToastify = require("react-toastify");
71
73
  const useUserProjectConfig = ({ selectors = [], init }) => {
72
74
  const { data: user, isSuccess } = getUsers.useGetCurrentUserQuery();
@@ -1 +1 @@
1
- {"version":3,"file":"useUserProjectConfig.cjs.js","sources":["../../../../src/hooks/useUserProjectConfig.ts"],"sourcesContent":["import { useGetCurrentUserQuery, useSetFrontendPreferencesMutation } from '@shared/api'\nimport { toast } from 'react-toastify'\n\ntype Props = {\n selectors?: (string | undefined | null)[]\n init?: any\n}\n\ntype Result = [\n Record<string, any>,\n (config: Record<string, any>) => Promise<void>,\n { isSuccess: boolean },\n]\n\nexport const useUserProjectConfig = ({ selectors = [], init }: Props): Result => {\n // GET CURRENT USER\n const { data: user, isSuccess } = useGetCurrentUserQuery()\n // extract out columns config for project\n const { data: { frontendPreferences: preferences = {} } = {} } = user || {}\n\n const configPath = selectors\n .filter((selector) => selector !== undefined && selector !== null)\n .map((selector) => selector.replace(/\\s/g, ''))\n // Start with the root preferences\n let userConfig = preferences\n for (const selector of configPath) {\n userConfig = userConfig?.[selector]\n }\n\n userConfig = userConfig || init || {}\n\n const [updateUserPreferences] = useSetFrontendPreferencesMutation()\n\n // update the user preferences when the columns config changes\n const updateProjectConfig = async (config: Record<string, any>) => {\n try {\n if (!user?.name) throw { data: { detail: 'User not found' } }\n\n // Set the updated config at the correct nested path using only selectors\n let updatedPreferences = { ...preferences }\n\n // Helper function to set nested value\n const setNestedValue = (obj: any, path: string[], value: any): any => {\n if (path.length === 0) return { ...obj, ...value }\n\n const [first, ...rest] = path\n const nestedObj = obj?.[first] || {}\n\n return {\n ...obj,\n [first]: setNestedValue(nestedObj, rest, value),\n }\n }\n\n // Use the helper to set the value at the correct path\n updatedPreferences = setNestedValue(updatedPreferences, configPath, config)\n\n await updateUserPreferences({\n userName: user.name,\n patchData: updatedPreferences,\n // @ts-expect-error - disableInvalidations is not in the api\n disableInvalidations: true,\n }).unwrap()\n } catch (error: any) {\n console.error(error)\n toast.error(error.data?.detail)\n }\n }\n\n return [userConfig, updateProjectConfig, { isSuccess: isSuccess }]\n}\n"],"names":["useGetCurrentUserQuery","useSetFrontendPreferencesMutation","toast"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcO,MAAM,uBAAuB,CAAC,EAAE,YAAY,CAAC,GAAG,WAA0B;AAE/E,QAAM,EAAE,MAAM,MAAM,UAAA,IAAcA,SAAAA,uBAAuB;AAEzD,QAAM,EAAE,MAAM,EAAE,qBAAqB,cAAc,CAAA,MAAO,CAAA,MAAO,QAAQ,CAAC;AAE1E,QAAM,aAAa,UAChB,OAAO,CAAC,aAAa,aAAa,UAAa,aAAa,IAAI,EAChE,IAAI,CAAC,aAAa,SAAS,QAAQ,OAAO,EAAE,CAAC;AAEhD,MAAI,aAAa;AACjB,aAAW,YAAY,YAAY;AACjC,iBAAa,yCAAa;AAAA,EAAQ;AAGvB,eAAA,cAAc,QAAQ,CAAC;AAE9B,QAAA,CAAC,qBAAqB,IAAIC,8CAAkC;AAG5D,QAAA,sBAAsB,OAAO,WAAgC;;AAC7D,QAAA;AACE,UAAA,EAAC,6BAAM,MAAM,OAAM,EAAE,MAAM,EAAE,QAAQ,mBAAmB;AAGxD,UAAA,qBAAqB,EAAE,GAAG,YAAY;AAG1C,YAAM,iBAAiB,CAAC,KAAU,MAAgB,UAAoB;AAChE,YAAA,KAAK,WAAW,EAAG,QAAO,EAAE,GAAG,KAAK,GAAG,MAAM;AAEjD,cAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,cAAM,aAAY,2BAAM,WAAU,CAAC;AAE5B,eAAA;AAAA,UACL,GAAG;AAAA,UACH,CAAC,KAAK,GAAG,eAAe,WAAW,MAAM,KAAK;AAAA,QAChD;AAAA,MACF;AAGqB,2BAAA,eAAe,oBAAoB,YAAY,MAAM;AAE1E,YAAM,sBAAsB;AAAA,QAC1B,UAAU,KAAK;AAAA,QACf,WAAW;AAAA;AAAA,QAEX,sBAAsB;AAAA,MACvB,CAAA,EAAE,OAAO;AAAA,aACH,OAAY;AACnB,cAAQ,MAAM,KAAK;AACbC,oBAAAA,MAAA,OAAM,WAAM,SAAN,mBAAY,MAAM;AAAA,IAAA;AAAA,EAElC;AAEA,SAAO,CAAC,YAAY,qBAAqB,EAAE,WAAsB;AACnE;;"}
1
+ {"version":3,"file":"useUserProjectConfig.cjs.js","sources":["../../../../src/hooks/useUserProjectConfig.ts"],"sourcesContent":["import { useGetCurrentUserQuery, useSetFrontendPreferencesMutation } from '@shared/api'\nimport { toast } from 'react-toastify'\n\ntype Props = {\n selectors?: (string | undefined | null)[]\n init?: any\n}\n\ntype Result = [\n Record<string, any>,\n (config: Record<string, any>) => Promise<void>,\n { isSuccess: boolean },\n]\n\nexport const useUserProjectConfig = ({ selectors = [], init }: Props): Result => {\n // GET CURRENT USER\n const { data: user, isSuccess } = useGetCurrentUserQuery()\n // extract out columns config for project\n const { data: { frontendPreferences: preferences = {} } = {} } = user || {}\n\n const configPath = selectors\n .filter((selector) => selector !== undefined && selector !== null)\n .map((selector) => selector.replace(/\\s/g, ''))\n // Start with the root preferences\n let userConfig = preferences\n for (const selector of configPath) {\n userConfig = userConfig?.[selector]\n }\n\n userConfig = userConfig || init || {}\n\n const [updateUserPreferences] = useSetFrontendPreferencesMutation()\n\n // update the user preferences when the columns config changes\n const updateProjectConfig = async (config: Record<string, any>) => {\n try {\n if (!user?.name) throw { data: { detail: 'User not found' } }\n\n // Set the updated config at the correct nested path using only selectors\n let updatedPreferences = { ...preferences }\n\n // Helper function to set nested value\n const setNestedValue = (obj: any, path: string[], value: any): any => {\n if (path.length === 0) return { ...obj, ...value }\n\n const [first, ...rest] = path\n const nestedObj = obj?.[first] || {}\n\n return {\n ...obj,\n [first]: setNestedValue(nestedObj, rest, value),\n }\n }\n\n // Use the helper to set the value at the correct path\n updatedPreferences = setNestedValue(updatedPreferences, configPath, config)\n\n await updateUserPreferences({\n userName: user.name,\n patchData: updatedPreferences,\n // @ts-expect-error - disableInvalidations is not in the api\n disableInvalidations: true,\n }).unwrap()\n } catch (error: any) {\n console.error(error)\n toast.error(error.data?.detail)\n }\n }\n\n return [userConfig, updateProjectConfig, { isSuccess: isSuccess }]\n}\n"],"names":["useGetCurrentUserQuery","useSetFrontendPreferencesMutation","toast"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcO,MAAM,uBAAuB,CAAC,EAAE,YAAY,CAAC,GAAG,WAA0B;AAE/E,QAAM,EAAE,MAAM,MAAM,UAAA,IAAcA,SAAAA,uBAAuB;AAEzD,QAAM,EAAE,MAAM,EAAE,qBAAqB,cAAc,CAAA,MAAO,CAAA,MAAO,QAAQ,CAAC;AAE1E,QAAM,aAAa,UAChB,OAAO,CAAC,aAAa,aAAa,UAAa,aAAa,IAAI,EAChE,IAAI,CAAC,aAAa,SAAS,QAAQ,OAAO,EAAE,CAAC;AAEhD,MAAI,aAAa;AACjB,aAAW,YAAY,YAAY;AACjC,iBAAa,yCAAa;AAAA,EAAQ;AAGvB,eAAA,cAAc,QAAQ,CAAC;AAE9B,QAAA,CAAC,qBAAqB,IAAIC,8CAAkC;AAG5D,QAAA,sBAAsB,OAAO,WAAgC;;AAC7D,QAAA;AACE,UAAA,EAAC,6BAAM,MAAM,OAAM,EAAE,MAAM,EAAE,QAAQ,mBAAmB;AAGxD,UAAA,qBAAqB,EAAE,GAAG,YAAY;AAG1C,YAAM,iBAAiB,CAAC,KAAU,MAAgB,UAAoB;AAChE,YAAA,KAAK,WAAW,EAAG,QAAO,EAAE,GAAG,KAAK,GAAG,MAAM;AAEjD,cAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,cAAM,aAAY,2BAAM,WAAU,CAAC;AAE5B,eAAA;AAAA,UACL,GAAG;AAAA,UACH,CAAC,KAAK,GAAG,eAAe,WAAW,MAAM,KAAK;AAAA,QAChD;AAAA,MACF;AAGqB,2BAAA,eAAe,oBAAoB,YAAY,MAAM;AAE1E,YAAM,sBAAsB;AAAA,QAC1B,UAAU,KAAK;AAAA,QACf,WAAW;AAAA;AAAA,QAEX,sBAAsB;AAAA,MACvB,CAAA,EAAE,OAAO;AAAA,aACH,OAAY;AACnB,cAAQ,MAAM,KAAK;AACbC,oBAAAA,MAAA,OAAM,WAAM,SAAN,mBAAY,MAAM;AAAA,IAAA;AAAA,EAElC;AAEA,SAAO,CAAC,YAAY,qBAAqB,EAAE,WAAsB;AACnE;;"}
@@ -65,6 +65,8 @@ import { useSetFrontendPreferencesMutation } from "../api/queries/users/updateUs
65
65
  import "../api/queries/watchers/getWatchers.es.js";
66
66
  import "../api/queries/permissions/getPermissions.es.js";
67
67
  import "../api/queries/grouping/getGrouping.es.js";
68
+ import "../api/queries/versions/updateVersions.es.js";
69
+ import "../api/queries/products/createProduct.es.js";
68
70
  import { toast } from "react-toastify";
69
71
  const useUserProjectConfig = ({ selectors = [], init }) => {
70
72
  const { data: user, isSuccess } = useGetCurrentUserQuery();
@@ -1 +1 @@
1
- {"version":3,"file":"useUserProjectConfig.es.js","sources":["../../../../src/hooks/useUserProjectConfig.ts"],"sourcesContent":["import { useGetCurrentUserQuery, useSetFrontendPreferencesMutation } from '@shared/api'\nimport { toast } from 'react-toastify'\n\ntype Props = {\n selectors?: (string | undefined | null)[]\n init?: any\n}\n\ntype Result = [\n Record<string, any>,\n (config: Record<string, any>) => Promise<void>,\n { isSuccess: boolean },\n]\n\nexport const useUserProjectConfig = ({ selectors = [], init }: Props): Result => {\n // GET CURRENT USER\n const { data: user, isSuccess } = useGetCurrentUserQuery()\n // extract out columns config for project\n const { data: { frontendPreferences: preferences = {} } = {} } = user || {}\n\n const configPath = selectors\n .filter((selector) => selector !== undefined && selector !== null)\n .map((selector) => selector.replace(/\\s/g, ''))\n // Start with the root preferences\n let userConfig = preferences\n for (const selector of configPath) {\n userConfig = userConfig?.[selector]\n }\n\n userConfig = userConfig || init || {}\n\n const [updateUserPreferences] = useSetFrontendPreferencesMutation()\n\n // update the user preferences when the columns config changes\n const updateProjectConfig = async (config: Record<string, any>) => {\n try {\n if (!user?.name) throw { data: { detail: 'User not found' } }\n\n // Set the updated config at the correct nested path using only selectors\n let updatedPreferences = { ...preferences }\n\n // Helper function to set nested value\n const setNestedValue = (obj: any, path: string[], value: any): any => {\n if (path.length === 0) return { ...obj, ...value }\n\n const [first, ...rest] = path\n const nestedObj = obj?.[first] || {}\n\n return {\n ...obj,\n [first]: setNestedValue(nestedObj, rest, value),\n }\n }\n\n // Use the helper to set the value at the correct path\n updatedPreferences = setNestedValue(updatedPreferences, configPath, config)\n\n await updateUserPreferences({\n userName: user.name,\n patchData: updatedPreferences,\n // @ts-expect-error - disableInvalidations is not in the api\n disableInvalidations: true,\n }).unwrap()\n } catch (error: any) {\n console.error(error)\n toast.error(error.data?.detail)\n }\n }\n\n return [userConfig, updateProjectConfig, { isSuccess: isSuccess }]\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcO,MAAM,uBAAuB,CAAC,EAAE,YAAY,CAAC,GAAG,WAA0B;AAE/E,QAAM,EAAE,MAAM,MAAM,UAAA,IAAc,uBAAuB;AAEzD,QAAM,EAAE,MAAM,EAAE,qBAAqB,cAAc,CAAA,MAAO,CAAA,MAAO,QAAQ,CAAC;AAE1E,QAAM,aAAa,UAChB,OAAO,CAAC,aAAa,aAAa,UAAa,aAAa,IAAI,EAChE,IAAI,CAAC,aAAa,SAAS,QAAQ,OAAO,EAAE,CAAC;AAEhD,MAAI,aAAa;AACjB,aAAW,YAAY,YAAY;AACjC,iBAAa,yCAAa;AAAA,EAAQ;AAGvB,eAAA,cAAc,QAAQ,CAAC;AAE9B,QAAA,CAAC,qBAAqB,IAAI,kCAAkC;AAG5D,QAAA,sBAAsB,OAAO,WAAgC;;AAC7D,QAAA;AACE,UAAA,EAAC,6BAAM,MAAM,OAAM,EAAE,MAAM,EAAE,QAAQ,mBAAmB;AAGxD,UAAA,qBAAqB,EAAE,GAAG,YAAY;AAG1C,YAAM,iBAAiB,CAAC,KAAU,MAAgB,UAAoB;AAChE,YAAA,KAAK,WAAW,EAAG,QAAO,EAAE,GAAG,KAAK,GAAG,MAAM;AAEjD,cAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,cAAM,aAAY,2BAAM,WAAU,CAAC;AAE5B,eAAA;AAAA,UACL,GAAG;AAAA,UACH,CAAC,KAAK,GAAG,eAAe,WAAW,MAAM,KAAK;AAAA,QAChD;AAAA,MACF;AAGqB,2BAAA,eAAe,oBAAoB,YAAY,MAAM;AAE1E,YAAM,sBAAsB;AAAA,QAC1B,UAAU,KAAK;AAAA,QACf,WAAW;AAAA;AAAA,QAEX,sBAAsB;AAAA,MACvB,CAAA,EAAE,OAAO;AAAA,aACH,OAAY;AACnB,cAAQ,MAAM,KAAK;AACb,YAAA,OAAM,WAAM,SAAN,mBAAY,MAAM;AAAA,IAAA;AAAA,EAElC;AAEA,SAAO,CAAC,YAAY,qBAAqB,EAAE,WAAsB;AACnE;"}
1
+ {"version":3,"file":"useUserProjectConfig.es.js","sources":["../../../../src/hooks/useUserProjectConfig.ts"],"sourcesContent":["import { useGetCurrentUserQuery, useSetFrontendPreferencesMutation } from '@shared/api'\nimport { toast } from 'react-toastify'\n\ntype Props = {\n selectors?: (string | undefined | null)[]\n init?: any\n}\n\ntype Result = [\n Record<string, any>,\n (config: Record<string, any>) => Promise<void>,\n { isSuccess: boolean },\n]\n\nexport const useUserProjectConfig = ({ selectors = [], init }: Props): Result => {\n // GET CURRENT USER\n const { data: user, isSuccess } = useGetCurrentUserQuery()\n // extract out columns config for project\n const { data: { frontendPreferences: preferences = {} } = {} } = user || {}\n\n const configPath = selectors\n .filter((selector) => selector !== undefined && selector !== null)\n .map((selector) => selector.replace(/\\s/g, ''))\n // Start with the root preferences\n let userConfig = preferences\n for (const selector of configPath) {\n userConfig = userConfig?.[selector]\n }\n\n userConfig = userConfig || init || {}\n\n const [updateUserPreferences] = useSetFrontendPreferencesMutation()\n\n // update the user preferences when the columns config changes\n const updateProjectConfig = async (config: Record<string, any>) => {\n try {\n if (!user?.name) throw { data: { detail: 'User not found' } }\n\n // Set the updated config at the correct nested path using only selectors\n let updatedPreferences = { ...preferences }\n\n // Helper function to set nested value\n const setNestedValue = (obj: any, path: string[], value: any): any => {\n if (path.length === 0) return { ...obj, ...value }\n\n const [first, ...rest] = path\n const nestedObj = obj?.[first] || {}\n\n return {\n ...obj,\n [first]: setNestedValue(nestedObj, rest, value),\n }\n }\n\n // Use the helper to set the value at the correct path\n updatedPreferences = setNestedValue(updatedPreferences, configPath, config)\n\n await updateUserPreferences({\n userName: user.name,\n patchData: updatedPreferences,\n // @ts-expect-error - disableInvalidations is not in the api\n disableInvalidations: true,\n }).unwrap()\n } catch (error: any) {\n console.error(error)\n toast.error(error.data?.detail)\n }\n }\n\n return [userConfig, updateProjectConfig, { isSuccess: isSuccess }]\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcO,MAAM,uBAAuB,CAAC,EAAE,YAAY,CAAC,GAAG,WAA0B;AAE/E,QAAM,EAAE,MAAM,MAAM,UAAA,IAAc,uBAAuB;AAEzD,QAAM,EAAE,MAAM,EAAE,qBAAqB,cAAc,CAAA,MAAO,CAAA,MAAO,QAAQ,CAAC;AAE1E,QAAM,aAAa,UAChB,OAAO,CAAC,aAAa,aAAa,UAAa,aAAa,IAAI,EAChE,IAAI,CAAC,aAAa,SAAS,QAAQ,OAAO,EAAE,CAAC;AAEhD,MAAI,aAAa;AACjB,aAAW,YAAY,YAAY;AACjC,iBAAa,yCAAa;AAAA,EAAQ;AAGvB,eAAA,cAAc,QAAQ,CAAC;AAE9B,QAAA,CAAC,qBAAqB,IAAI,kCAAkC;AAG5D,QAAA,sBAAsB,OAAO,WAAgC;;AAC7D,QAAA;AACE,UAAA,EAAC,6BAAM,MAAM,OAAM,EAAE,MAAM,EAAE,QAAQ,mBAAmB;AAGxD,UAAA,qBAAqB,EAAE,GAAG,YAAY;AAG1C,YAAM,iBAAiB,CAAC,KAAU,MAAgB,UAAoB;AAChE,YAAA,KAAK,WAAW,EAAG,QAAO,EAAE,GAAG,KAAK,GAAG,MAAM;AAEjD,cAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,cAAM,aAAY,2BAAM,WAAU,CAAC;AAE5B,eAAA;AAAA,UACL,GAAG;AAAA,UACH,CAAC,KAAK,GAAG,eAAe,WAAW,MAAM,KAAK;AAAA,QAChD;AAAA,MACF;AAGqB,2BAAA,eAAe,oBAAoB,YAAY,MAAM;AAE1E,YAAM,sBAAsB;AAAA,QAC1B,UAAU,KAAK;AAAA,QACf,WAAW;AAAA;AAAA,QAEX,sBAAsB;AAAA,MACvB,CAAA,EAAE,OAAO;AAAA,aACH,OAAY;AACnB,cAAQ,MAAM,KAAK;AACb,YAAA,OAAM,WAAM,SAAN,mBAAY,MAAM;AAAA,IAAA;AAAA,EAElC;AAEA,SAAO,CAAC,YAAY,qBAAqB,EAAE,WAAsB;AACnE;"}
@@ -2,6 +2,7 @@
2
2
  const productTypes = {
3
3
  image: { name: "image", icon: "imagesmode" },
4
4
  render: { name: "render", icon: "photo_library" },
5
+ review: { name: "review", icon: "photo_library" },
5
6
  plate: { name: "plate", icon: "camera_roll" },
6
7
  camera: { name: "camera", icon: "videocam" },
7
8
  model: { name: "model", icon: "language" },
@@ -1 +1 @@
1
- {"version":3,"file":"productTypes.cjs.js","sources":["../../../../src/util/productTypes.ts"],"sourcesContent":["type ProductTypes = {\n [key: string]: { name: string; icon: string }\n}\n\nconst productTypes: ProductTypes = {\n image: { name: 'image', icon: 'imagesmode' },\n render: { name: 'render', icon: 'photo_library' },\n plate: { name: 'plate', icon: 'camera_roll' },\n camera: { name: 'camera', icon: 'videocam' },\n model: { name: 'model', icon: 'language' },\n texture: { name: 'texture', icon: 'texture' },\n look: { name: 'look', icon: 'ev_shadow' },\n rig: { name: 'rig', icon: 'accessibility' },\n animation: { name: 'animation', icon: 'directions_run' },\n cache: { name: 'cache', icon: 'animation' },\n layout: { name: 'layout', icon: 'nature_people' },\n setdress: { name: 'setdress', icon: 'forest' },\n groom: { name: 'groom', icon: 'content_cut' },\n matchmove: { name: 'matchmove', icon: 'switch_video' },\n vdbcache: { name: 'vdbcache', icon: 'local_fire_department' },\n lightrig: { name: 'lightrig', icon: 'wb_incandescent' },\n lut: { name: 'lut', icon: 'opacity' },\n workfile: { name: 'workfile', icon: 'home_repair_service' },\n}\n\nexport default productTypes\n"],"names":[],"mappings":";AAIA,MAAM,eAA6B;AAAA,EACjC,OAAO,EAAE,MAAM,SAAS,MAAM,aAAa;AAAA,EAC3C,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,EAC5C,QAAQ,EAAE,MAAM,UAAU,MAAM,WAAW;AAAA,EAC3C,OAAO,EAAE,MAAM,SAAS,MAAM,WAAW;AAAA,EACzC,SAAS,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EAC5C,MAAM,EAAE,MAAM,QAAQ,MAAM,YAAY;AAAA,EACxC,KAAK,EAAE,MAAM,OAAO,MAAM,gBAAgB;AAAA,EAC1C,WAAW,EAAE,MAAM,aAAa,MAAM,iBAAiB;AAAA,EACvD,OAAO,EAAE,MAAM,SAAS,MAAM,YAAY;AAAA,EAC1C,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,UAAU,EAAE,MAAM,YAAY,MAAM,SAAS;AAAA,EAC7C,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,EAC5C,WAAW,EAAE,MAAM,aAAa,MAAM,eAAe;AAAA,EACrD,UAAU,EAAE,MAAM,YAAY,MAAM,wBAAwB;AAAA,EAC5D,UAAU,EAAE,MAAM,YAAY,MAAM,kBAAkB;AAAA,EACtD,KAAK,EAAE,MAAM,OAAO,MAAM,UAAU;AAAA,EACpC,UAAU,EAAE,MAAM,YAAY,MAAM,sBAAsB;AAC5D;;"}
1
+ {"version":3,"file":"productTypes.cjs.js","sources":["../../../../src/util/productTypes.ts"],"sourcesContent":["type ProductTypes = {\n [key: string]: { name: string; icon: string }\n}\n\nconst productTypes: ProductTypes = {\n image: { name: 'image', icon: 'imagesmode' },\n render: { name: 'render', icon: 'photo_library' },\n review: { name: 'review', icon: 'photo_library' },\n plate: { name: 'plate', icon: 'camera_roll' },\n camera: { name: 'camera', icon: 'videocam' },\n model: { name: 'model', icon: 'language' },\n texture: { name: 'texture', icon: 'texture' },\n look: { name: 'look', icon: 'ev_shadow' },\n rig: { name: 'rig', icon: 'accessibility' },\n animation: { name: 'animation', icon: 'directions_run' },\n cache: { name: 'cache', icon: 'animation' },\n layout: { name: 'layout', icon: 'nature_people' },\n setdress: { name: 'setdress', icon: 'forest' },\n groom: { name: 'groom', icon: 'content_cut' },\n matchmove: { name: 'matchmove', icon: 'switch_video' },\n vdbcache: { name: 'vdbcache', icon: 'local_fire_department' },\n lightrig: { name: 'lightrig', icon: 'wb_incandescent' },\n lut: { name: 'lut', icon: 'opacity' },\n workfile: { name: 'workfile', icon: 'home_repair_service' },\n}\n\nexport default productTypes\n"],"names":[],"mappings":";AAIA,MAAM,eAA6B;AAAA,EACjC,OAAO,EAAE,MAAM,SAAS,MAAM,aAAa;AAAA,EAC3C,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,EAC5C,QAAQ,EAAE,MAAM,UAAU,MAAM,WAAW;AAAA,EAC3C,OAAO,EAAE,MAAM,SAAS,MAAM,WAAW;AAAA,EACzC,SAAS,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EAC5C,MAAM,EAAE,MAAM,QAAQ,MAAM,YAAY;AAAA,EACxC,KAAK,EAAE,MAAM,OAAO,MAAM,gBAAgB;AAAA,EAC1C,WAAW,EAAE,MAAM,aAAa,MAAM,iBAAiB;AAAA,EACvD,OAAO,EAAE,MAAM,SAAS,MAAM,YAAY;AAAA,EAC1C,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,UAAU,EAAE,MAAM,YAAY,MAAM,SAAS;AAAA,EAC7C,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,EAC5C,WAAW,EAAE,MAAM,aAAa,MAAM,eAAe;AAAA,EACrD,UAAU,EAAE,MAAM,YAAY,MAAM,wBAAwB;AAAA,EAC5D,UAAU,EAAE,MAAM,YAAY,MAAM,kBAAkB;AAAA,EACtD,KAAK,EAAE,MAAM,OAAO,MAAM,UAAU;AAAA,EACpC,UAAU,EAAE,MAAM,YAAY,MAAM,sBAAsB;AAC5D;;"}
@@ -1,6 +1,7 @@
1
1
  const productTypes = {
2
2
  image: { name: "image", icon: "imagesmode" },
3
3
  render: { name: "render", icon: "photo_library" },
4
+ review: { name: "review", icon: "photo_library" },
4
5
  plate: { name: "plate", icon: "camera_roll" },
5
6
  camera: { name: "camera", icon: "videocam" },
6
7
  model: { name: "model", icon: "language" },
@@ -1 +1 @@
1
- {"version":3,"file":"productTypes.es.js","sources":["../../../../src/util/productTypes.ts"],"sourcesContent":["type ProductTypes = {\n [key: string]: { name: string; icon: string }\n}\n\nconst productTypes: ProductTypes = {\n image: { name: 'image', icon: 'imagesmode' },\n render: { name: 'render', icon: 'photo_library' },\n plate: { name: 'plate', icon: 'camera_roll' },\n camera: { name: 'camera', icon: 'videocam' },\n model: { name: 'model', icon: 'language' },\n texture: { name: 'texture', icon: 'texture' },\n look: { name: 'look', icon: 'ev_shadow' },\n rig: { name: 'rig', icon: 'accessibility' },\n animation: { name: 'animation', icon: 'directions_run' },\n cache: { name: 'cache', icon: 'animation' },\n layout: { name: 'layout', icon: 'nature_people' },\n setdress: { name: 'setdress', icon: 'forest' },\n groom: { name: 'groom', icon: 'content_cut' },\n matchmove: { name: 'matchmove', icon: 'switch_video' },\n vdbcache: { name: 'vdbcache', icon: 'local_fire_department' },\n lightrig: { name: 'lightrig', icon: 'wb_incandescent' },\n lut: { name: 'lut', icon: 'opacity' },\n workfile: { name: 'workfile', icon: 'home_repair_service' },\n}\n\nexport default productTypes\n"],"names":[],"mappings":"AAIA,MAAM,eAA6B;AAAA,EACjC,OAAO,EAAE,MAAM,SAAS,MAAM,aAAa;AAAA,EAC3C,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,EAC5C,QAAQ,EAAE,MAAM,UAAU,MAAM,WAAW;AAAA,EAC3C,OAAO,EAAE,MAAM,SAAS,MAAM,WAAW;AAAA,EACzC,SAAS,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EAC5C,MAAM,EAAE,MAAM,QAAQ,MAAM,YAAY;AAAA,EACxC,KAAK,EAAE,MAAM,OAAO,MAAM,gBAAgB;AAAA,EAC1C,WAAW,EAAE,MAAM,aAAa,MAAM,iBAAiB;AAAA,EACvD,OAAO,EAAE,MAAM,SAAS,MAAM,YAAY;AAAA,EAC1C,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,UAAU,EAAE,MAAM,YAAY,MAAM,SAAS;AAAA,EAC7C,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,EAC5C,WAAW,EAAE,MAAM,aAAa,MAAM,eAAe;AAAA,EACrD,UAAU,EAAE,MAAM,YAAY,MAAM,wBAAwB;AAAA,EAC5D,UAAU,EAAE,MAAM,YAAY,MAAM,kBAAkB;AAAA,EACtD,KAAK,EAAE,MAAM,OAAO,MAAM,UAAU;AAAA,EACpC,UAAU,EAAE,MAAM,YAAY,MAAM,sBAAsB;AAC5D;"}
1
+ {"version":3,"file":"productTypes.es.js","sources":["../../../../src/util/productTypes.ts"],"sourcesContent":["type ProductTypes = {\n [key: string]: { name: string; icon: string }\n}\n\nconst productTypes: ProductTypes = {\n image: { name: 'image', icon: 'imagesmode' },\n render: { name: 'render', icon: 'photo_library' },\n review: { name: 'review', icon: 'photo_library' },\n plate: { name: 'plate', icon: 'camera_roll' },\n camera: { name: 'camera', icon: 'videocam' },\n model: { name: 'model', icon: 'language' },\n texture: { name: 'texture', icon: 'texture' },\n look: { name: 'look', icon: 'ev_shadow' },\n rig: { name: 'rig', icon: 'accessibility' },\n animation: { name: 'animation', icon: 'directions_run' },\n cache: { name: 'cache', icon: 'animation' },\n layout: { name: 'layout', icon: 'nature_people' },\n setdress: { name: 'setdress', icon: 'forest' },\n groom: { name: 'groom', icon: 'content_cut' },\n matchmove: { name: 'matchmove', icon: 'switch_video' },\n vdbcache: { name: 'vdbcache', icon: 'local_fire_department' },\n lightrig: { name: 'lightrig', icon: 'wb_incandescent' },\n lut: { name: 'lut', icon: 'opacity' },\n workfile: { name: 'workfile', icon: 'home_repair_service' },\n}\n\nexport default productTypes\n"],"names":[],"mappings":"AAIA,MAAM,eAA6B;AAAA,EACjC,OAAO,EAAE,MAAM,SAAS,MAAM,aAAa;AAAA,EAC3C,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,EAC5C,QAAQ,EAAE,MAAM,UAAU,MAAM,WAAW;AAAA,EAC3C,OAAO,EAAE,MAAM,SAAS,MAAM,WAAW;AAAA,EACzC,SAAS,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EAC5C,MAAM,EAAE,MAAM,QAAQ,MAAM,YAAY;AAAA,EACxC,KAAK,EAAE,MAAM,OAAO,MAAM,gBAAgB;AAAA,EAC1C,WAAW,EAAE,MAAM,aAAa,MAAM,iBAAiB;AAAA,EACvD,OAAO,EAAE,MAAM,SAAS,MAAM,YAAY;AAAA,EAC1C,QAAQ,EAAE,MAAM,UAAU,MAAM,gBAAgB;AAAA,EAChD,UAAU,EAAE,MAAM,YAAY,MAAM,SAAS;AAAA,EAC7C,OAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAAA,EAC5C,WAAW,EAAE,MAAM,aAAa,MAAM,eAAe;AAAA,EACrD,UAAU,EAAE,MAAM,YAAY,MAAM,wBAAwB;AAAA,EAC5D,UAAU,EAAE,MAAM,YAAY,MAAM,kBAAkB;AAAA,EACtD,KAAK,EAAE,MAAM,OAAO,MAAM,UAAU;AAAA,EACpC,UAAU,EAAE,MAAM,YAAY,MAAM,sBAAsB;AAC5D;"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function extractVersionFromFilename(filename) {
4
+ const nameWithoutExt = filename.replace(/\.[^/.]+$/, "");
5
+ const patterns = [
6
+ // Pattern: file_v001, file_v1, file_v01 (with 'v' prefix)
7
+ /.*[_\-\s]v(\d+)(?:[_\-\s].*|$)/i,
8
+ // Pattern: file_001, file_01, file_1 (at end of filename)
9
+ /.*[_\-\s](\d+)$/,
10
+ // Pattern: file_001_name, file_1_description (version in middle)
11
+ /.*[_\-\s](\d{2,})(?:[_\-\s].*)/,
12
+ // Pattern: 001_file, 1_file (at start of filename)
13
+ /^(\d+)[_\-\s]/,
14
+ // Pattern: fileV1, fileV001 (no separator)
15
+ /.*v(\d+)$/i,
16
+ // Pattern: file1, file001 (number at end, no separator)
17
+ /.*?(\d{2,})$/
18
+ ];
19
+ for (const pattern of patterns) {
20
+ const match = nameWithoutExt.match(pattern);
21
+ if (match) {
22
+ const versionStr = match[1];
23
+ const version = parseInt(versionStr, 10);
24
+ if (!isNaN(version) && version > 0) {
25
+ return version;
26
+ }
27
+ }
28
+ }
29
+ return null;
30
+ }
31
+ exports.extractVersionFromFilename = extractVersionFromFilename;
32
+ //# sourceMappingURL=extractVersionFromFilename.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractVersionFromFilename.cjs.js","sources":["../../../../src/utils/extractVersionFromFilename.ts"],"sourcesContent":["/**\n * Extracts version number from filename using common versioning patterns\n * Supports patterns like: file_001, file_v1, file_v001_name, file_name_1, etc.\n */\nexport function extractVersionFromFilename(filename: string): number | null {\n // Remove file extension for cleaner parsing\n const nameWithoutExt = filename.replace(/\\.[^/.]+$/, '')\n\n // Define version patterns in order of specificity\n const patterns = [\n // Pattern: file_v001, file_v1, file_v01 (with 'v' prefix)\n /.*[_\\-\\s]v(\\d+)(?:[_\\-\\s].*|$)/i,\n\n // Pattern: file_001, file_01, file_1 (at end of filename)\n /.*[_\\-\\s](\\d+)$/,\n\n // Pattern: file_001_name, file_1_description (version in middle)\n /.*[_\\-\\s](\\d{2,})(?:[_\\-\\s].*)/,\n\n // Pattern: 001_file, 1_file (at start of filename)\n /^(\\d+)[_\\-\\s]/,\n\n // Pattern: fileV1, fileV001 (no separator)\n /.*v(\\d+)$/i,\n\n // Pattern: file1, file001 (number at end, no separator)\n /.*?(\\d{2,})$/,\n ]\n\n for (const pattern of patterns) {\n const match = nameWithoutExt.match(pattern)\n if (match) {\n const versionStr = match[1]\n const version = parseInt(versionStr, 10)\n\n // Only return valid versions (positive numbers)\n if (!isNaN(version) && version > 0) {\n return version\n }\n }\n }\n\n return null\n}\n"],"names":[],"mappings":";;AAIO,SAAS,2BAA2B,UAAiC;AAE1E,QAAM,iBAAiB,SAAS,QAAQ,aAAa,EAAE;AAGvD,QAAM,WAAW;AAAA;AAAA,IAEf;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA,EACF;AAEA,aAAW,WAAW,UAAU;AACxB,UAAA,QAAQ,eAAe,MAAM,OAAO;AAC1C,QAAI,OAAO;AACH,YAAA,aAAa,MAAM,CAAC;AACpB,YAAA,UAAU,SAAS,YAAY,EAAE;AAGvC,UAAI,CAAC,MAAM,OAAO,KAAK,UAAU,GAAG;AAC3B,eAAA;AAAA,MAAA;AAAA,IACT;AAAA,EACF;AAGK,SAAA;AACT;;"}
@@ -0,0 +1,32 @@
1
+ function extractVersionFromFilename(filename) {
2
+ const nameWithoutExt = filename.replace(/\.[^/.]+$/, "");
3
+ const patterns = [
4
+ // Pattern: file_v001, file_v1, file_v01 (with 'v' prefix)
5
+ /.*[_\-\s]v(\d+)(?:[_\-\s].*|$)/i,
6
+ // Pattern: file_001, file_01, file_1 (at end of filename)
7
+ /.*[_\-\s](\d+)$/,
8
+ // Pattern: file_001_name, file_1_description (version in middle)
9
+ /.*[_\-\s](\d{2,})(?:[_\-\s].*)/,
10
+ // Pattern: 001_file, 1_file (at start of filename)
11
+ /^(\d+)[_\-\s]/,
12
+ // Pattern: fileV1, fileV001 (no separator)
13
+ /.*v(\d+)$/i,
14
+ // Pattern: file1, file001 (number at end, no separator)
15
+ /.*?(\d{2,})$/
16
+ ];
17
+ for (const pattern of patterns) {
18
+ const match = nameWithoutExt.match(pattern);
19
+ if (match) {
20
+ const versionStr = match[1];
21
+ const version = parseInt(versionStr, 10);
22
+ if (!isNaN(version) && version > 0) {
23
+ return version;
24
+ }
25
+ }
26
+ }
27
+ return null;
28
+ }
29
+ export {
30
+ extractVersionFromFilename
31
+ };
32
+ //# sourceMappingURL=extractVersionFromFilename.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractVersionFromFilename.es.js","sources":["../../../../src/utils/extractVersionFromFilename.ts"],"sourcesContent":["/**\n * Extracts version number from filename using common versioning patterns\n * Supports patterns like: file_001, file_v1, file_v001_name, file_name_1, etc.\n */\nexport function extractVersionFromFilename(filename: string): number | null {\n // Remove file extension for cleaner parsing\n const nameWithoutExt = filename.replace(/\\.[^/.]+$/, '')\n\n // Define version patterns in order of specificity\n const patterns = [\n // Pattern: file_v001, file_v1, file_v01 (with 'v' prefix)\n /.*[_\\-\\s]v(\\d+)(?:[_\\-\\s].*|$)/i,\n\n // Pattern: file_001, file_01, file_1 (at end of filename)\n /.*[_\\-\\s](\\d+)$/,\n\n // Pattern: file_001_name, file_1_description (version in middle)\n /.*[_\\-\\s](\\d{2,})(?:[_\\-\\s].*)/,\n\n // Pattern: 001_file, 1_file (at start of filename)\n /^(\\d+)[_\\-\\s]/,\n\n // Pattern: fileV1, fileV001 (no separator)\n /.*v(\\d+)$/i,\n\n // Pattern: file1, file001 (number at end, no separator)\n /.*?(\\d{2,})$/,\n ]\n\n for (const pattern of patterns) {\n const match = nameWithoutExt.match(pattern)\n if (match) {\n const versionStr = match[1]\n const version = parseInt(versionStr, 10)\n\n // Only return valid versions (positive numbers)\n if (!isNaN(version) && version > 0) {\n return version\n }\n }\n }\n\n return null\n}\n"],"names":[],"mappings":"AAIO,SAAS,2BAA2B,UAAiC;AAE1E,QAAM,iBAAiB,SAAS,QAAQ,aAAa,EAAE;AAGvD,QAAM,WAAW;AAAA;AAAA,IAEf;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA;AAAA,IAGA;AAAA,EACF;AAEA,aAAW,WAAW,UAAU;AACxB,UAAA,QAAQ,eAAe,MAAM,OAAO;AAC1C,QAAI,OAAO;AACH,YAAA,aAAa,MAAM,CAAC;AACpB,YAAA,UAAU,SAAS,YAAY,EAAE;AAGvC,UAAI,CAAC,MAAM,OAAO,KAAK,UAAU,GAAG;AAC3B,eAAA;AAAA,MAAA;AAAA,IACT;AAAA,EACF;AAGK,SAAA;AACT;"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const reactToastify = require("react-toastify");
4
+ const productTypes = require("../util/productTypes.cjs.js");
5
+ const lodash = require("lodash");
6
+ require("../util/pubsub.cjs.js");
7
+ const sanitizeProductName = (name) => {
8
+ return lodash.camelCase(name).replace(/[^a-zA-Z0-9_-]/g, "");
9
+ };
10
+ const validateProductName = (name) => {
11
+ if (!name || name.trim() === "") {
12
+ return { isValid: false, error: "Name is required" };
13
+ }
14
+ const nameRegex = /^[a-zA-Z0-9_]([a-zA-Z0-9_\\.\\-]*[a-zA-Z0-9_])?$/;
15
+ if (!nameRegex.test(name)) {
16
+ return {
17
+ isValid: false,
18
+ error: "Product name can only contain alphanumeric characters, underscores, dots, and dashes, and must not start or end with a dot or dash"
19
+ };
20
+ }
21
+ return { isValid: true };
22
+ };
23
+ const validateProductType = (productType) => {
24
+ if (!productType || !Object.keys(productTypes).includes(productType)) {
25
+ return {
26
+ isValid: false,
27
+ error: "Product type is required and must be a valid product type"
28
+ };
29
+ }
30
+ return { isValid: true };
31
+ };
32
+ const validateVersion = (version, existingVersion) => {
33
+ if (version < 1) {
34
+ return { isValid: false, error: "Version must be greater than 0" };
35
+ }
36
+ if (existingVersion && version <= existingVersion) {
37
+ return {
38
+ isValid: false,
39
+ error: `Version must be greater than ${existingVersion}`
40
+ };
41
+ }
42
+ return { isValid: true };
43
+ };
44
+ const validateFormData = (formData, existingVersion, isNewProduct = true) => {
45
+ const versionValidation = validateVersion(formData.version, existingVersion);
46
+ if (!versionValidation.isValid) {
47
+ return versionValidation;
48
+ }
49
+ if (isNewProduct) {
50
+ const nameValidation = validateProductName(formData.name);
51
+ if (!nameValidation.isValid) {
52
+ return nameValidation;
53
+ }
54
+ const typeValidation = validateProductType(formData.productType);
55
+ if (!typeValidation.isValid) {
56
+ return typeValidation;
57
+ }
58
+ }
59
+ return { isValid: true };
60
+ };
61
+ const createProductHelper = async (createProductMutation, projectName, productData) => {
62
+ try {
63
+ const response = await createProductMutation({
64
+ projectName,
65
+ productPostModel: productData
66
+ }).unwrap();
67
+ if (!response.id) {
68
+ throw new Error("Failed to create product - no ID returned");
69
+ }
70
+ return response;
71
+ } catch (error) {
72
+ console.error("Error creating product:", error);
73
+ throw new Error(error.message || "Failed to create product");
74
+ }
75
+ };
76
+ const createVersionHelper = async (createVersionMutation, projectName, versionData) => {
77
+ try {
78
+ const response = await createVersionMutation({
79
+ projectName,
80
+ versionPostModel: versionData
81
+ }).unwrap();
82
+ if (!response.id) {
83
+ throw new Error("Failed to create version - no ID returned");
84
+ }
85
+ return response;
86
+ } catch (error) {
87
+ console.error("Error creating version:", error);
88
+ throw new Error(error.message || "Failed to create version");
89
+ }
90
+ };
91
+ const createProductAndVersion = async (createProductMutation, createVersionMutation, projectName, productData, versionData) => {
92
+ const productRes = await createProductHelper(createProductMutation, projectName, productData);
93
+ const versionRes = await createVersionHelper(createVersionMutation, projectName, {
94
+ ...versionData,
95
+ productId: productRes.id
96
+ });
97
+ return {
98
+ product: productRes,
99
+ version: versionRes
100
+ };
101
+ };
102
+ const handleUploadError = (error, operation) => {
103
+ console.error(`Error ${operation}:`, error);
104
+ const message = (error == null ? void 0 : error.message) || `Failed to ${operation}`;
105
+ reactToastify.toast.error(message);
106
+ throw error;
107
+ };
108
+ const getNextVersionNumber = (existingVersion) => {
109
+ return existingVersion ? existingVersion.version + 1 : 1;
110
+ };
111
+ exports.createProductAndVersion = createProductAndVersion;
112
+ exports.createProductHelper = createProductHelper;
113
+ exports.createVersionHelper = createVersionHelper;
114
+ exports.getNextVersionNumber = getNextVersionNumber;
115
+ exports.handleUploadError = handleUploadError;
116
+ exports.sanitizeProductName = sanitizeProductName;
117
+ exports.validateFormData = validateFormData;
118
+ exports.validateProductName = validateProductName;
119
+ exports.validateProductType = validateProductType;
120
+ exports.validateVersion = validateVersion;
121
+ //# sourceMappingURL=versionUploadHelpers.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versionUploadHelpers.cjs.js","sources":["../../../../src/utils/versionUploadHelpers.ts"],"sourcesContent":["import { toast } from 'react-toastify'\nimport { productTypes } from '@shared/util'\nimport { camelCase } from 'lodash'\n\nexport interface ProductCreationData {\n folderId: string\n name: string\n productType: string\n}\n\nexport interface VersionCreationData {\n productId: string\n version: number\n taskId?: string\n}\n\nexport interface ValidationResult {\n isValid: boolean\n error?: string\n}\n\n/**\n * Sanitizes a product name by converting to camelCase and removing invalid characters\n */\nexport const sanitizeProductName = (name: string): string => {\n return camelCase(name).replace(/[^a-zA-Z0-9_-]/g, '')\n}\n\n/**\n * Validates a product name according to the naming rules\n */\nexport const validateProductName = (name: string): ValidationResult => {\n if (!name || name.trim() === '') {\n return { isValid: false, error: 'Name is required' }\n }\n\n const nameRegex = /^[a-zA-Z0-9_]([a-zA-Z0-9_\\\\.\\\\-]*[a-zA-Z0-9_])?$/\n if (!nameRegex.test(name)) {\n return {\n isValid: false,\n error:\n 'Product name can only contain alphanumeric characters, underscores, dots, and dashes, and must not start or end with a dot or dash',\n }\n }\n\n return { isValid: true }\n}\n\n/**\n * Validates a product type\n */\nexport const validateProductType = (productType: string): ValidationResult => {\n if (!productType || !Object.keys(productTypes).includes(productType)) {\n return {\n isValid: false,\n error: 'Product type is required and must be a valid product type',\n }\n }\n return { isValid: true }\n}\n\n/**\n * Validates a version number against an existing version\n */\nexport const validateVersion = (version: number, existingVersion?: number): ValidationResult => {\n if (version < 1) {\n return { isValid: false, error: 'Version must be greater than 0' }\n }\n\n if (existingVersion && version <= existingVersion) {\n return {\n isValid: false,\n error: `Version must be greater than ${existingVersion}`,\n }\n }\n\n return { isValid: true }\n}\n\n/**\n * Validates complete form data for product and version creation\n */\nexport const validateFormData = (\n formData: { name: string; productType: string; version: number },\n existingVersion?: number,\n isNewProduct = true,\n): ValidationResult => {\n // Validate version\n const versionValidation = validateVersion(formData.version, existingVersion)\n if (!versionValidation.isValid) {\n return versionValidation\n }\n\n // Only validate product details if creating a new product\n if (isNewProduct) {\n const nameValidation = validateProductName(formData.name)\n if (!nameValidation.isValid) {\n return nameValidation\n }\n\n const typeValidation = validateProductType(formData.productType)\n if (!typeValidation.isValid) {\n return typeValidation\n }\n }\n\n return { isValid: true }\n}\n\n/**\n * Creates a product using the provided mutation function\n */\nexport const createProductHelper = async (\n createProductMutation: any,\n projectName: string,\n productData: ProductCreationData,\n) => {\n try {\n const response = await createProductMutation({\n projectName,\n productPostModel: productData,\n }).unwrap()\n\n if (!response.id) {\n throw new Error('Failed to create product - no ID returned')\n }\n\n return response\n } catch (error: any) {\n console.error('Error creating product:', error)\n throw new Error(error.message || 'Failed to create product')\n }\n}\n\n/**\n * Creates a version using the provided mutation function\n */\nexport const createVersionHelper = async (\n createVersionMutation: any,\n projectName: string,\n versionData: VersionCreationData,\n) => {\n try {\n const response = await createVersionMutation({\n projectName,\n versionPostModel: versionData,\n }).unwrap()\n\n if (!response.id) {\n throw new Error('Failed to create version - no ID returned')\n }\n\n return response\n } catch (error: any) {\n console.error('Error creating version:', error)\n throw new Error(error.message || 'Failed to create version')\n }\n}\n\n/**\n * Creates a product and version together with proper error handling\n */\nexport const createProductAndVersion = async (\n createProductMutation: any,\n createVersionMutation: any,\n projectName: string,\n productData: ProductCreationData,\n versionData: Omit<VersionCreationData, 'productId'>,\n) => {\n // Create product first\n const productRes = await createProductHelper(createProductMutation, projectName, productData)\n\n // Create version for the new product\n const versionRes = await createVersionHelper(createVersionMutation, projectName, {\n ...versionData,\n productId: productRes.id,\n })\n\n return {\n product: productRes,\n version: versionRes,\n }\n}\n\n/**\n * Handles errors consistently across upload operations\n */\nexport const handleUploadError = (error: any, operation: string) => {\n console.error(`Error ${operation}:`, error)\n const message = error?.message || `Failed to ${operation}`\n toast.error(message)\n throw error\n}\n\n/**\n * Calculates the next version number based on existing version\n */\nexport const getNextVersionNumber = (existingVersion?: { version: number }): number => {\n return existingVersion ? existingVersion.version + 1 : 1\n}\n"],"names":["camelCase","toast"],"mappings":";;;;;;AAwBa,MAAA,sBAAsB,CAAC,SAAyB;AAC3D,SAAOA,OAAU,UAAA,IAAI,EAAE,QAAQ,mBAAmB,EAAE;AACtD;AAKa,MAAA,sBAAsB,CAAC,SAAmC;AACrE,MAAI,CAAC,QAAQ,KAAK,KAAA,MAAW,IAAI;AAC/B,WAAO,EAAE,SAAS,OAAO,OAAO,mBAAmB;AAAA,EAAA;AAGrD,QAAM,YAAY;AAClB,MAAI,CAAC,UAAU,KAAK,IAAI,GAAG;AAClB,WAAA;AAAA,MACL,SAAS;AAAA,MACT,OACE;AAAA,IACJ;AAAA,EAAA;AAGK,SAAA,EAAE,SAAS,KAAK;AACzB;AAKa,MAAA,sBAAsB,CAAC,gBAA0C;AACxE,MAAA,CAAC,eAAe,CAAC,OAAO,KAAK,YAAY,EAAE,SAAS,WAAW,GAAG;AAC7D,WAAA;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EAAA;AAEK,SAAA,EAAE,SAAS,KAAK;AACzB;AAKa,MAAA,kBAAkB,CAAC,SAAiB,oBAA+C;AAC9F,MAAI,UAAU,GAAG;AACf,WAAO,EAAE,SAAS,OAAO,OAAO,iCAAiC;AAAA,EAAA;AAG/D,MAAA,mBAAmB,WAAW,iBAAiB;AAC1C,WAAA;AAAA,MACL,SAAS;AAAA,MACT,OAAO,gCAAgC,eAAe;AAAA,IACxD;AAAA,EAAA;AAGK,SAAA,EAAE,SAAS,KAAK;AACzB;AAKO,MAAM,mBAAmB,CAC9B,UACA,iBACA,eAAe,SACM;AAErB,QAAM,oBAAoB,gBAAgB,SAAS,SAAS,eAAe;AACvE,MAAA,CAAC,kBAAkB,SAAS;AACvB,WAAA;AAAA,EAAA;AAIT,MAAI,cAAc;AACV,UAAA,iBAAiB,oBAAoB,SAAS,IAAI;AACpD,QAAA,CAAC,eAAe,SAAS;AACpB,aAAA;AAAA,IAAA;AAGH,UAAA,iBAAiB,oBAAoB,SAAS,WAAW;AAC3D,QAAA,CAAC,eAAe,SAAS;AACpB,aAAA;AAAA,IAAA;AAAA,EACT;AAGK,SAAA,EAAE,SAAS,KAAK;AACzB;AAKO,MAAM,sBAAsB,OACjC,uBACA,aACA,gBACG;AACC,MAAA;AACI,UAAA,WAAW,MAAM,sBAAsB;AAAA,MAC3C;AAAA,MACA,kBAAkB;AAAA,IACnB,CAAA,EAAE,OAAO;AAEN,QAAA,CAAC,SAAS,IAAI;AACV,YAAA,IAAI,MAAM,2CAA2C;AAAA,IAAA;AAGtD,WAAA;AAAA,WACA,OAAY;AACX,YAAA,MAAM,2BAA2B,KAAK;AAC9C,UAAM,IAAI,MAAM,MAAM,WAAW,0BAA0B;AAAA,EAAA;AAE/D;AAKO,MAAM,sBAAsB,OACjC,uBACA,aACA,gBACG;AACC,MAAA;AACI,UAAA,WAAW,MAAM,sBAAsB;AAAA,MAC3C;AAAA,MACA,kBAAkB;AAAA,IACnB,CAAA,EAAE,OAAO;AAEN,QAAA,CAAC,SAAS,IAAI;AACV,YAAA,IAAI,MAAM,2CAA2C;AAAA,IAAA;AAGtD,WAAA;AAAA,WACA,OAAY;AACX,YAAA,MAAM,2BAA2B,KAAK;AAC9C,UAAM,IAAI,MAAM,MAAM,WAAW,0BAA0B;AAAA,EAAA;AAE/D;AAKO,MAAM,0BAA0B,OACrC,uBACA,uBACA,aACA,aACA,gBACG;AAEH,QAAM,aAAa,MAAM,oBAAoB,uBAAuB,aAAa,WAAW;AAG5F,QAAM,aAAa,MAAM,oBAAoB,uBAAuB,aAAa;AAAA,IAC/E,GAAG;AAAA,IACH,WAAW,WAAW;AAAA,EAAA,CACvB;AAEM,SAAA;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;AAKa,MAAA,oBAAoB,CAAC,OAAY,cAAsB;AAClE,UAAQ,MAAM,SAAS,SAAS,KAAK,KAAK;AAC1C,QAAM,WAAU,+BAAO,YAAW,aAAa,SAAS;AACxDC,gBAAA,MAAM,MAAM,OAAO;AACb,QAAA;AACR;AAKa,MAAA,uBAAuB,CAAC,oBAAkD;AAC9E,SAAA,kBAAkB,gBAAgB,UAAU,IAAI;AACzD;;;;;;;;;;;"}