@ynput/ayon-frontend-shared 0.2.20 → 0.2.21

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 (381) hide show
  1. package/dist/DetailsPanel.cjs.js +4 -3
  2. package/dist/DetailsPanel.cjs.js.map +1 -1
  3. package/dist/DetailsPanel.es.js +4 -3
  4. package/dist/DetailsPanel.es.js.map +1 -1
  5. package/dist/ProjectTreeTable.cjs.js +2 -2
  6. package/dist/ProjectTreeTable.es.js +2 -2
  7. package/dist/Views.cjs.js +41 -0
  8. package/dist/Views.cjs.js.map +1 -0
  9. package/dist/Views.es.js +41 -0
  10. package/dist/Views.es.js.map +1 -0
  11. package/dist/_virtual/index.cjs5.js +5 -3
  12. package/dist/_virtual/index.cjs5.js.map +1 -1
  13. package/dist/_virtual/index.cjs6.js +3 -5
  14. package/dist/_virtual/index.cjs6.js.map +1 -1
  15. package/dist/_virtual/index.es5.js +5 -2
  16. package/dist/_virtual/index.es5.js.map +1 -1
  17. package/dist/_virtual/index.es6.js +2 -5
  18. package/dist/_virtual/index.es6.js.map +1 -1
  19. package/dist/api.cjs.js +6 -1
  20. package/dist/api.cjs.js.map +1 -1
  21. package/dist/api.es.js +8 -3
  22. package/dist/components.cjs.js +0 -17
  23. package/dist/components.cjs.js.map +1 -1
  24. package/dist/components.es.js +1 -18
  25. package/dist/components.es.js.map +1 -1
  26. package/dist/index.cjs.js +4 -3
  27. package/dist/index.cjs.js.map +1 -1
  28. package/dist/index.es.js +4 -3
  29. package/dist/index.es.js.map +1 -1
  30. package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js +1 -1
  31. package/dist/node_modules/rehype-prism-plus/dist/index.es.es.js +1 -1
  32. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  33. package/dist/node_modules/remove-accents/index.es.js +1 -1
  34. package/dist/shared/node_modules/uuid/dist/esm-browser/native.cjs.js +3 -1
  35. package/dist/shared/node_modules/uuid/dist/esm-browser/native.cjs.js.map +1 -1
  36. package/dist/shared/node_modules/uuid/dist/esm-browser/native.es.js +3 -1
  37. package/dist/shared/node_modules/uuid/dist/esm-browser/native.es.js.map +1 -1
  38. package/dist/shared/node_modules/uuid/dist/esm-browser/rng.cjs.js +2 -2
  39. package/dist/shared/node_modules/uuid/dist/esm-browser/rng.cjs.js.map +1 -1
  40. package/dist/shared/node_modules/uuid/dist/esm-browser/rng.es.js +2 -2
  41. package/dist/shared/node_modules/uuid/dist/esm-browser/rng.es.js.map +1 -1
  42. package/dist/shared/node_modules/uuid/dist/esm-browser/stringify.cjs.js +1 -1
  43. package/dist/shared/node_modules/uuid/dist/esm-browser/stringify.cjs.js.map +1 -1
  44. package/dist/shared/node_modules/uuid/dist/esm-browser/stringify.es.js +1 -1
  45. package/dist/shared/node_modules/uuid/dist/esm-browser/stringify.es.js.map +1 -1
  46. package/dist/shared/node_modules/uuid/dist/esm-browser/v1.cjs.js +41 -58
  47. package/dist/shared/node_modules/uuid/dist/esm-browser/v1.cjs.js.map +1 -1
  48. package/dist/shared/node_modules/uuid/dist/esm-browser/v1.es.js +41 -57
  49. package/dist/shared/node_modules/uuid/dist/esm-browser/v1.es.js.map +1 -1
  50. package/dist/shared/node_modules/uuid/dist/esm-browser/v4.cjs.js +1 -5
  51. package/dist/shared/node_modules/uuid/dist/esm-browser/v4.cjs.js.map +1 -1
  52. package/dist/shared/node_modules/uuid/dist/esm-browser/v4.es.js +1 -5
  53. package/dist/shared/node_modules/uuid/dist/esm-browser/v4.es.js.map +1 -1
  54. package/dist/shared/src/api/generated/views.cjs.js +30 -2
  55. package/dist/shared/src/api/generated/views.cjs.js.map +1 -1
  56. package/dist/shared/src/api/generated/views.es.js +30 -2
  57. package/dist/shared/src/api/generated/views.es.js.map +1 -1
  58. package/dist/shared/src/api/queries/views/getViews.cjs.js +29 -5
  59. package/dist/shared/src/api/queries/views/getViews.cjs.js.map +1 -1
  60. package/dist/shared/src/api/queries/views/getViews.es.js +29 -5
  61. package/dist/shared/src/api/queries/views/getViews.es.js.map +1 -1
  62. package/dist/shared/src/api/queries/views/updateViews.cjs.js +169 -9
  63. package/dist/shared/src/api/queries/views/updateViews.cjs.js.map +1 -1
  64. package/dist/shared/src/api/queries/views/updateViews.es.js +170 -10
  65. package/dist/shared/src/api/queries/views/updateViews.es.js.map +1 -1
  66. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js +4 -3
  67. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js.map +1 -1
  68. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js +4 -3
  69. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js.map +1 -1
  70. package/dist/shared/src/components/Feedback/FeedbackContext.cjs.js +1 -0
  71. package/dist/shared/src/components/Feedback/FeedbackContext.cjs.js.map +1 -1
  72. package/dist/shared/src/components/Feedback/FeedbackContext.es.js +1 -0
  73. package/dist/shared/src/components/Feedback/FeedbackContext.es.js.map +1 -1
  74. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js +4 -3
  75. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js.map +1 -1
  76. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js +4 -3
  77. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js.map +1 -1
  78. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js +4 -3
  79. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js.map +1 -1
  80. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js +4 -3
  81. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js.map +1 -1
  82. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +4 -3
  83. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
  84. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +4 -3
  85. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
  86. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +4 -3
  87. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
  88. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +4 -3
  89. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
  90. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +4 -3
  91. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
  92. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +4 -3
  93. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
  94. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +4 -3
  95. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
  96. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +4 -3
  97. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
  98. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js +4 -3
  99. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js.map +1 -1
  100. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js +4 -3
  101. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js.map +1 -1
  102. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +4 -3
  103. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
  104. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +4 -3
  105. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
  106. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +4 -3
  107. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
  108. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +4 -3
  109. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
  110. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +4 -3
  111. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  112. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +4 -3
  113. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  114. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +4 -3
  115. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
  116. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +4 -3
  117. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
  118. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +4 -3
  119. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
  120. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +4 -3
  121. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
  122. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +4 -3
  123. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
  124. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +4 -3
  125. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
  126. package/dist/shared/src/containers/Feed/hooks/useCommentMutations.cjs.js +1 -1
  127. package/dist/shared/src/containers/Feed/hooks/useCommentMutations.cjs.js.map +1 -1
  128. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +10 -11
  129. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  130. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +10 -11
  131. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  132. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +4 -3
  133. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
  134. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +4 -3
  135. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
  136. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.cjs.js.map +1 -1
  137. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.es.js.map +1 -1
  138. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.cjs.js +69 -21
  139. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.cjs.js.map +1 -1
  140. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.es.js +69 -21
  141. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.es.js.map +1 -1
  142. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js.map +1 -1
  143. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js.map +1 -1
  144. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js +0 -5
  145. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js.map +1 -1
  146. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js +0 -5
  147. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js.map +1 -1
  148. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +3 -5
  149. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
  150. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +3 -5
  151. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
  152. package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.cjs.js +1 -1
  153. package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.cjs.js.map +1 -1
  154. package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.es.js +1 -1
  155. package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.es.js.map +1 -1
  156. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +18 -10
  157. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
  158. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +18 -10
  159. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
  160. package/dist/shared/src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.cjs.js +106 -0
  161. package/dist/shared/src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.cjs.js.map +1 -0
  162. package/dist/shared/src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.es.js +106 -0
  163. package/dist/shared/src/containers/ProjectTreeTable/utils/queryFilterToClientFilter.es.js.map +1 -0
  164. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +4 -3
  165. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
  166. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +4 -3
  167. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
  168. package/dist/shared/src/containers/Views/ViewItem/ViewItem.cjs.js +49 -0
  169. package/dist/shared/src/containers/Views/ViewItem/ViewItem.cjs.js.map +1 -0
  170. package/dist/shared/src/containers/Views/ViewItem/ViewItem.es.js +49 -0
  171. package/dist/shared/src/containers/Views/ViewItem/ViewItem.es.js.map +1 -0
  172. package/dist/shared/src/{components → containers}/Views/ViewItem/ViewItem.styled.cjs.js +24 -12
  173. package/dist/shared/src/containers/Views/ViewItem/ViewItem.styled.cjs.js.map +1 -0
  174. package/dist/shared/src/{components → containers}/Views/ViewItem/ViewItem.styled.es.js +24 -12
  175. package/dist/shared/src/containers/Views/ViewItem/ViewItem.styled.es.js.map +1 -0
  176. package/dist/shared/src/{components → containers}/Views/Views.cjs.js +6 -10
  177. package/dist/shared/src/containers/Views/Views.cjs.js.map +1 -0
  178. package/dist/shared/src/{components → containers}/Views/Views.es.js +7 -11
  179. package/dist/shared/src/containers/Views/Views.es.js.map +1 -0
  180. package/dist/shared/src/{components → containers}/Views/Views.styled.cjs.js +4 -3
  181. package/dist/shared/src/containers/Views/Views.styled.cjs.js.map +1 -0
  182. package/dist/shared/src/{components → containers}/Views/Views.styled.es.js +4 -3
  183. package/dist/shared/src/containers/Views/Views.styled.es.js.map +1 -0
  184. package/dist/shared/src/{components → containers}/Views/ViewsButton/ViewsButton.cjs.js +11 -2
  185. package/dist/shared/src/containers/Views/ViewsButton/ViewsButton.cjs.js.map +1 -0
  186. package/dist/shared/src/{components → containers}/Views/ViewsButton/ViewsButton.es.js +11 -2
  187. package/dist/shared/src/containers/Views/ViewsButton/ViewsButton.es.js.map +1 -0
  188. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewFormDialogFallback.cjs.js +4 -0
  189. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewFormDialogFallback.cjs.js.map +1 -0
  190. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewFormDialogFallback.es.js +5 -0
  191. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewFormDialogFallback.es.js.map +1 -0
  192. package/dist/shared/src/{components/Views/context/ViewsContext.cjs.js → containers/Views/ViewsDialogContainer/ViewsDialogContainer.cjs.js} +67 -58
  193. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.cjs.js.map +1 -0
  194. package/dist/shared/src/{components/Views/context/ViewsContext.es.js → containers/Views/ViewsDialogContainer/ViewsDialogContainer.es.js} +66 -57
  195. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.es.js.map +1 -0
  196. package/dist/shared/src/{components → containers}/Views/ViewsMenu/ViewsMenu.cjs.js +1 -0
  197. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.cjs.js.map +1 -0
  198. package/dist/shared/src/{components → containers}/Views/ViewsMenu/ViewsMenu.es.js +1 -0
  199. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.es.js.map +1 -0
  200. package/dist/shared/src/{components → containers}/Views/ViewsMenu/ViewsMenu.styled.cjs.js.map +1 -1
  201. package/dist/shared/src/{components → containers}/Views/ViewsMenu/ViewsMenu.styled.es.js.map +1 -1
  202. package/dist/shared/src/containers/Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js +105 -0
  203. package/dist/shared/src/containers/Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js.map +1 -0
  204. package/dist/shared/src/containers/Views/ViewsMenuContainer/ViewsMenuContainer.es.js +105 -0
  205. package/dist/shared/src/containers/Views/ViewsMenuContainer/ViewsMenuContainer.es.js.map +1 -0
  206. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +211 -0
  207. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -0
  208. package/dist/shared/src/containers/Views/context/ViewsContext.es.js +211 -0
  209. package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -0
  210. package/dist/shared/src/containers/Views/hooks/pages/useListsViewSettings.cjs.js +52 -0
  211. package/dist/shared/src/containers/Views/hooks/pages/useListsViewSettings.cjs.js.map +1 -0
  212. package/dist/shared/src/containers/Views/hooks/pages/useListsViewSettings.es.js +52 -0
  213. package/dist/shared/src/containers/Views/hooks/pages/useListsViewSettings.es.js.map +1 -0
  214. package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.cjs.js +69 -0
  215. package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.cjs.js.map +1 -0
  216. package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.es.js +69 -0
  217. package/dist/shared/src/containers/Views/hooks/pages/useOverviewViewSettings.es.js.map +1 -0
  218. package/dist/shared/src/containers/Views/hooks/pages/useTaskProgressViewSettings.cjs.js +44 -0
  219. package/dist/shared/src/containers/Views/hooks/pages/useTaskProgressViewSettings.cjs.js.map +1 -0
  220. package/dist/shared/src/containers/Views/hooks/pages/useTaskProgressViewSettings.es.js +44 -0
  221. package/dist/shared/src/containers/Views/hooks/pages/useTaskProgressViewSettings.es.js.map +1 -0
  222. package/dist/shared/src/{components → containers}/Views/hooks/useBuildViewMenuItems.cjs.js +58 -32
  223. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.cjs.js.map +1 -0
  224. package/dist/shared/src/{components → containers}/Views/hooks/useBuildViewMenuItems.es.js +59 -33
  225. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.es.js.map +1 -0
  226. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.cjs.js +33 -0
  227. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.cjs.js.map +1 -0
  228. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.es.js +33 -0
  229. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.es.js.map +1 -0
  230. package/dist/shared/src/{components/Views/ViewForm/ViewFormContainer.cjs.js → containers/Views/hooks/useSelectedView.cjs.js} +33 -114
  231. package/dist/shared/src/containers/Views/hooks/useSelectedView.cjs.js.map +1 -0
  232. package/dist/shared/src/containers/Views/hooks/useSelectedView.es.js +108 -0
  233. package/dist/shared/src/containers/Views/hooks/useSelectedView.es.js.map +1 -0
  234. package/dist/shared/src/containers/Views/hooks/useViewSettingsChanged.cjs.js +19 -0
  235. package/dist/shared/src/containers/Views/hooks/useViewSettingsChanged.cjs.js.map +1 -0
  236. package/dist/shared/src/containers/Views/hooks/useViewSettingsChanged.es.js +19 -0
  237. package/dist/shared/src/containers/Views/hooks/useViewSettingsChanged.es.js.map +1 -0
  238. package/dist/shared/src/containers/Views/hooks/useViewsMutations.cjs.js +143 -0
  239. package/dist/shared/src/containers/Views/hooks/useViewsMutations.cjs.js.map +1 -0
  240. package/dist/shared/src/containers/Views/hooks/useViewsMutations.es.js +143 -0
  241. package/dist/shared/src/containers/Views/hooks/useViewsMutations.es.js.map +1 -0
  242. package/dist/shared/src/containers/Views/hooks/useViewsShortcuts.cjs.js +67 -0
  243. package/dist/shared/src/containers/Views/hooks/useViewsShortcuts.cjs.js.map +1 -0
  244. package/dist/shared/src/containers/Views/hooks/useViewsShortcuts.es.js +67 -0
  245. package/dist/shared/src/containers/Views/hooks/useViewsShortcuts.es.js.map +1 -0
  246. package/dist/shared/src/containers/Views/utils/generateWorkingView.cjs.js +13 -0
  247. package/dist/shared/src/containers/Views/utils/generateWorkingView.cjs.js.map +1 -0
  248. package/dist/shared/src/containers/Views/utils/generateWorkingView.es.js +13 -0
  249. package/dist/shared/src/containers/Views/utils/generateWorkingView.es.js.map +1 -0
  250. package/dist/shared/src/containers/Views/utils/getCustomViewsFallback.cjs.js.map +1 -0
  251. package/dist/shared/src/containers/Views/utils/getCustomViewsFallback.es.js.map +1 -0
  252. package/dist/shared/src/{components → containers}/Views/utils/portalUtils.cjs.js +1 -1
  253. package/dist/shared/src/{components → containers}/Views/utils/portalUtils.cjs.js.map +1 -1
  254. package/dist/shared/src/{components → containers}/Views/utils/portalUtils.es.js +1 -1
  255. package/dist/shared/src/{components → containers}/Views/utils/portalUtils.es.js.map +1 -1
  256. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +125 -0
  257. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -0
  258. package/dist/shared/src/{components/Views/ViewForm/ViewFormContainer.es.js → containers/Views/utils/viewUpdateHelper.es.js} +48 -112
  259. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -0
  260. package/dist/shared/src/context/PowerpackContext.cjs.js +9 -3
  261. package/dist/shared/src/context/PowerpackContext.cjs.js.map +1 -1
  262. package/dist/shared/src/context/PowerpackContext.es.js +9 -3
  263. package/dist/shared/src/context/PowerpackContext.es.js.map +1 -1
  264. package/dist/shared/src/hooks/useLoadModule.cjs.js +1 -1
  265. package/dist/shared/src/hooks/useLoadModule.cjs.js.map +1 -1
  266. package/dist/shared/src/hooks/useLoadModule.es.js +1 -1
  267. package/dist/shared/src/hooks/useLoadModule.es.js.map +1 -1
  268. package/dist/shared/src/util/columnConfigConverter.cjs.js +116 -0
  269. package/dist/shared/src/util/columnConfigConverter.cjs.js.map +1 -0
  270. package/dist/shared/src/util/columnConfigConverter.es.js +116 -0
  271. package/dist/shared/src/util/columnConfigConverter.es.js.map +1 -0
  272. package/dist/types/Views.d.ts +2 -0
  273. package/dist/types/api/generated/powerPack1.1.1Views.d.ts +25 -0
  274. package/dist/types/api/generated/views.d.ts +130 -22
  275. package/dist/types/api/queries/views/getViews.d.ts +161 -22
  276. package/dist/types/api/queries/views/updateViews.d.ts +500 -13
  277. package/dist/types/components/index.d.ts +0 -1
  278. package/dist/types/containers/ProjectTreeTable/context/ColumnSettingsContext.d.ts +15 -5
  279. package/dist/types/containers/ProjectTreeTable/context/ColumnSettingsProvider.d.ts +1 -1
  280. package/dist/types/containers/ProjectTreeTable/context/ProjectTableContext.d.ts +0 -2
  281. package/dist/types/containers/ProjectTreeTable/context/ProjectTableProvider.d.ts +2 -4
  282. package/dist/types/containers/ProjectTreeTable/hooks/index.d.ts +0 -1
  283. package/dist/types/containers/ProjectTreeTable/hooks/useFetchOverviewData.d.ts +3 -5
  284. package/dist/types/containers/ProjectTreeTable/hooks/useProjectTableModules.d.ts +2 -5
  285. package/dist/types/containers/ProjectTreeTable/hooks/useQueryFilters.d.ts +5 -3
  286. package/dist/types/containers/ProjectTreeTable/types/index.d.ts +1 -0
  287. package/dist/types/containers/ProjectTreeTable/types/overviewContext.d.ts +5 -6
  288. package/dist/types/containers/ProjectTreeTable/utils/index.d.ts +1 -0
  289. package/dist/types/containers/ProjectTreeTable/utils/queryFilterToClientFilter.d.ts +24 -0
  290. package/dist/types/{components → containers}/Views/ViewItem/ViewItem.d.ts +3 -1
  291. package/dist/types/{components → containers}/Views/ViewItem/ViewItem.styled.d.ts +1 -1
  292. package/dist/types/containers/Views/Views.d.ts +2 -0
  293. package/dist/types/containers/Views/ViewsDialogContainer/ViewFormDialogFallback.d.ts +24 -0
  294. package/dist/types/containers/Views/ViewsDialogContainer/ViewsDialogContainer.d.ts +6 -0
  295. package/dist/types/{components → containers}/Views/ViewsMenu/ViewsMenu.d.ts +1 -2
  296. package/dist/types/{components → containers}/Views/ViewsMenuContainer/ViewsMenuContainer.d.ts +1 -1
  297. package/dist/types/containers/Views/context/ViewsContext.d.ts +46 -0
  298. package/dist/types/containers/Views/hooks/index.d.ts +5 -0
  299. package/dist/types/containers/Views/hooks/pages/useListsViewSettings.d.ts +9 -0
  300. package/dist/types/containers/Views/hooks/pages/useOverviewViewSettings.d.ts +12 -0
  301. package/dist/types/containers/Views/hooks/pages/useTaskProgressViewSettings.d.ts +10 -0
  302. package/dist/types/containers/Views/hooks/pages/viewUpdateHelper.d.ts +0 -0
  303. package/dist/types/containers/Views/hooks/useBuildViewMenuItems.d.ts +22 -0
  304. package/dist/types/containers/Views/hooks/useOverviewViewSettings.d.ts +0 -0
  305. package/dist/types/containers/Views/hooks/useSaveViewFromCurrent.d.ts +12 -0
  306. package/dist/types/containers/Views/hooks/useSelectedView.d.ts +12 -0
  307. package/dist/types/containers/Views/hooks/useViewSettingsChanged.d.ts +6 -0
  308. package/dist/types/containers/Views/hooks/useViewsMutations.d.ts +13 -0
  309. package/dist/types/containers/Views/hooks/useViewsShortcuts.d.ts +13 -0
  310. package/dist/types/containers/Views/index.d.ts +19 -0
  311. package/dist/types/containers/Views/utils/generateWorkingView.d.ts +3 -0
  312. package/dist/types/{components → containers}/Views/utils/getCustomViewsFallback.d.ts +3 -2
  313. package/dist/types/{components → containers}/Views/utils/portalUtils.d.ts +1 -1
  314. package/dist/types/containers/Views/utils/viewUpdateHelper.d.ts +17 -0
  315. package/dist/types/containers/index.d.ts +1 -0
  316. package/dist/types/context/PowerpackContext.d.ts +4 -1
  317. package/dist/types/util/columnConfigConverter.d.ts +15 -0
  318. package/dist/types/util/index.d.ts +1 -0
  319. package/dist/util.cjs.js +3 -0
  320. package/dist/util.cjs.js.map +1 -1
  321. package/dist/util.es.js +3 -0
  322. package/dist/util.es.js.map +1 -1
  323. package/package.json +6 -1
  324. package/dist/shared/src/components/Views/ViewForm/ViewForm.cjs.js +0 -164
  325. package/dist/shared/src/components/Views/ViewForm/ViewForm.cjs.js.map +0 -1
  326. package/dist/shared/src/components/Views/ViewForm/ViewForm.es.js +0 -164
  327. package/dist/shared/src/components/Views/ViewForm/ViewForm.es.js.map +0 -1
  328. package/dist/shared/src/components/Views/ViewForm/ViewForm.styled.cjs.js +0 -71
  329. package/dist/shared/src/components/Views/ViewForm/ViewForm.styled.cjs.js.map +0 -1
  330. package/dist/shared/src/components/Views/ViewForm/ViewForm.styled.es.js +0 -71
  331. package/dist/shared/src/components/Views/ViewForm/ViewForm.styled.es.js.map +0 -1
  332. package/dist/shared/src/components/Views/ViewForm/ViewFormContainer.cjs.js.map +0 -1
  333. package/dist/shared/src/components/Views/ViewForm/ViewFormContainer.es.js.map +0 -1
  334. package/dist/shared/src/components/Views/ViewItem/ViewItem.cjs.js +0 -36
  335. package/dist/shared/src/components/Views/ViewItem/ViewItem.cjs.js.map +0 -1
  336. package/dist/shared/src/components/Views/ViewItem/ViewItem.es.js +0 -36
  337. package/dist/shared/src/components/Views/ViewItem/ViewItem.es.js.map +0 -1
  338. package/dist/shared/src/components/Views/ViewItem/ViewItem.styled.cjs.js.map +0 -1
  339. package/dist/shared/src/components/Views/ViewItem/ViewItem.styled.es.js.map +0 -1
  340. package/dist/shared/src/components/Views/Views.cjs.js.map +0 -1
  341. package/dist/shared/src/components/Views/Views.es.js.map +0 -1
  342. package/dist/shared/src/components/Views/Views.styled.cjs.js.map +0 -1
  343. package/dist/shared/src/components/Views/Views.styled.es.js.map +0 -1
  344. package/dist/shared/src/components/Views/ViewsButton/ViewsButton.cjs.js.map +0 -1
  345. package/dist/shared/src/components/Views/ViewsButton/ViewsButton.es.js.map +0 -1
  346. package/dist/shared/src/components/Views/ViewsMenu/ViewsMenu.cjs.js.map +0 -1
  347. package/dist/shared/src/components/Views/ViewsMenu/ViewsMenu.es.js.map +0 -1
  348. package/dist/shared/src/components/Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js +0 -132
  349. package/dist/shared/src/components/Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js.map +0 -1
  350. package/dist/shared/src/components/Views/ViewsMenuContainer/ViewsMenuContainer.es.js +0 -132
  351. package/dist/shared/src/components/Views/ViewsMenuContainer/ViewsMenuContainer.es.js.map +0 -1
  352. package/dist/shared/src/components/Views/context/ViewsContext.cjs.js.map +0 -1
  353. package/dist/shared/src/components/Views/context/ViewsContext.es.js.map +0 -1
  354. package/dist/shared/src/components/Views/hooks/useBuildViewMenuItems.cjs.js.map +0 -1
  355. package/dist/shared/src/components/Views/hooks/useBuildViewMenuItems.es.js.map +0 -1
  356. package/dist/shared/src/components/Views/utils/generatePersonalView.cjs.js +0 -13
  357. package/dist/shared/src/components/Views/utils/generatePersonalView.cjs.js.map +0 -1
  358. package/dist/shared/src/components/Views/utils/generatePersonalView.es.js +0 -13
  359. package/dist/shared/src/components/Views/utils/generatePersonalView.es.js.map +0 -1
  360. package/dist/shared/src/components/Views/utils/getCustomViewsFallback.cjs.js.map +0 -1
  361. package/dist/shared/src/components/Views/utils/getCustomViewsFallback.es.js.map +0 -1
  362. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnSorting.cjs.js +0 -24
  363. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnSorting.cjs.js.map +0 -1
  364. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnSorting.es.js +0 -24
  365. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnSorting.es.js.map +0 -1
  366. package/dist/types/components/Views/ViewForm/ViewForm.d.ts +0 -14
  367. package/dist/types/components/Views/ViewForm/ViewForm.styled.d.ts +0 -9
  368. package/dist/types/components/Views/ViewForm/ViewFormContainer.d.ts +0 -15
  369. package/dist/types/components/Views/Views.d.ts +0 -8
  370. package/dist/types/components/Views/context/ViewsContext.d.ts +0 -31
  371. package/dist/types/components/Views/hooks/useBuildViewMenuItems.d.ts +0 -14
  372. package/dist/types/components/Views/index.d.ts +0 -11
  373. package/dist/types/components/Views/utils/generatePersonalView.d.ts +0 -3
  374. package/dist/types/containers/ProjectTreeTable/hooks/useColumnSorting.d.ts +0 -12
  375. /package/dist/shared/src/{components → containers}/Views/ViewsMenu/ViewsMenu.styled.cjs.js +0 -0
  376. /package/dist/shared/src/{components → containers}/Views/ViewsMenu/ViewsMenu.styled.es.js +0 -0
  377. /package/dist/shared/src/{components → containers}/Views/utils/getCustomViewsFallback.cjs.js +0 -0
  378. /package/dist/shared/src/{components → containers}/Views/utils/getCustomViewsFallback.es.js +0 -0
  379. /package/dist/types/{components → containers}/Views/Views.styled.d.ts +0 -0
  380. /package/dist/types/{components → containers}/Views/ViewsButton/ViewsButton.d.ts +0 -0
  381. /package/dist/types/{components → containers}/Views/ViewsMenu/ViewsMenu.styled.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"updateViews.es.js","sources":["../../../../../../src/api/queries/views/updateViews.ts"],"sourcesContent":["import { getViewsApi } from './getViews'\n\nconst updateViewsApi = getViewsApi.enhanceEndpoints({\n endpoints: {\n createView: {\n onQueryStarted: async (arg, { dispatch, queryFulfilled }) => {\n try {\n const { payload } = arg\n // Optimistically update the view list with the new view\n dispatch(\n getViewsApi.util.updateQueryData(\n 'getViewList',\n { viewType: arg.viewType, project: arg.project },\n (draft) => {\n draft.push(payload)\n },\n ),\n )\n } catch (error) {\n console.error('Failed to create view:', error)\n }\n },\n transformErrorResponse: (error: any) => error.data?.detail,\n },\n },\n})\n\nexport const { useCreateViewMutation } = updateViewsApi\nexport { updateViewsApi as viewsQueries }\n"],"names":[],"mappings":";AAEM,MAAA,iBAAiB,YAAY,iBAAiB;AAAA,EAClD,WAAW;AAAA,IACT,YAAY;AAAA,MACV,gBAAgB,OAAO,KAAK,EAAE,UAAU,qBAAqB;AACvD,YAAA;AACI,gBAAA,EAAE,YAAY;AAEpB;AAAA,YACE,YAAY,KAAK;AAAA,cACf;AAAA,cACA,EAAE,UAAU,IAAI,UAAU,SAAS,IAAI,QAAQ;AAAA,cAC/C,CAAC,UAAU;AACT,sBAAM,KAAK,OAAO;AAAA,cAAA;AAAA,YACpB;AAAA,UAEJ;AAAA,iBACO,OAAO;AACN,kBAAA,MAAM,0BAA0B,KAAK;AAAA,QAAA;AAAA,MAEjD;AAAA,MACA,wBAAwB,CAAC;;AAAe,2BAAM,SAAN,mBAAY;AAAA;AAAA,IAAA;AAAA,EACtD;AAEJ,CAAC;AAEY,MAAA,EAAE,0BAA0B;"}
1
+ {"version":3,"file":"updateViews.es.js","sources":["../../../../../../src/api/queries/views/updateViews.ts"],"sourcesContent":["import { ViewListItemModel } from '@shared/api/generated'\nimport { getScopeTag, getViewsApi } from './getViews'\n\nconst updateViewsApi = getViewsApi.enhanceEndpoints({\n endpoints: {\n createView: {\n onQueryStarted: async (arg, { dispatch, queryFulfilled, getState }) => {\n const { payload } = arg\n const state = getState()\n // @ts-expect-error - user is not typed in the state\n const user = state.user.name\n\n // Optimistically update the view list\n const patch = dispatch(\n getViewsApi.util.updateQueryData(\n 'listViews',\n { viewType: arg.viewType, projectName: arg.projectName },\n (draft) => {\n const newView: ViewListItemModel = {\n ...payload,\n working: payload.working || false,\n scope: arg.projectName ? 'project' : 'studio',\n visibility: 'private',\n position: draft.length + 1, // Add to the end of the list\n owner: user,\n editable: true,\n access: {},\n }\n if (payload.working) {\n // For working views, find and replace the existing working view\n const existingWorkingIndex = draft.findIndex((view) => view.working === true)\n if (existingWorkingIndex !== -1) {\n // Keep the existing ID but update all other properties\n const existingId = draft[existingWorkingIndex].id\n draft[existingWorkingIndex] = { ...newView, id: existingId }\n } else {\n // No existing working view, add the new one\n draft.push(newView)\n }\n } else {\n // For non-working views, add to the list as usual\n draft.push(newView)\n }\n\n // finally sort the view by position and then by label\n draft.sort((a, b) => {\n if (a.position !== b.position) {\n return a.position - b.position\n }\n return a.label.localeCompare(b.label)\n })\n },\n ),\n )\n\n // Also update the getWorkingView cache if this is a working view\n let workingViewPatch\n if (payload.working) {\n workingViewPatch = dispatch(\n getViewsApi.util.updateQueryData(\n 'getWorkingView',\n { viewType: arg.viewType, projectName: arg.projectName },\n (draft) => {\n // Preserve the existing ID if there's already a working view\n const existingId = draft?.id\n const updatedWorkingView = {\n ...payload,\n working: true,\n scope: arg.projectName ? 'project' : 'studio',\n visibility: 'private',\n owner: user,\n ...(existingId && { id: existingId }), // Keep existing ID if it exists\n }\n console.log('Updated working view:', updatedWorkingView)\n // Update the working view cache with the new view data\n Object.assign(draft, updatedWorkingView)\n },\n ),\n )\n }\n\n try {\n await queryFulfilled\n } catch (error) {\n // If the query failed, we need to roll back the optimistic updates\n patch.undo()\n if (workingViewPatch) {\n workingViewPatch.undo()\n }\n console.error('Failed to create view:', error)\n }\n },\n transformErrorResponse: (error: any) => error.data?.detail,\n // updates the view list cache for a specific view type and project\n invalidatesTags: (_r, _e, { viewType, projectName, payload }) => [\n { type: 'view', id: payload.id },\n getScopeTag(viewType, projectName),\n ],\n },\n updateView: {\n transformErrorResponse: (error: any) => error.data?.detail,\n invalidatesTags: (_r, _e, { viewType, projectName, viewId }) => [\n { type: 'view', id: viewId },\n getScopeTag(viewType, projectName),\n ],\n },\n deleteView: {\n onQueryStarted: async (arg, { dispatch, queryFulfilled }) => {\n const { viewId, projectName, viewType } = arg\n // Optimistically remove the view from the list\n const patch = dispatch(\n getViewsApi.util.updateQueryData('listViews', { viewType, projectName }, (draft) => {\n return draft.filter((view) => view.id !== viewId)\n }),\n )\n\n try {\n await queryFulfilled\n } catch (error) {\n // If the query failed, we need to roll back the optimistic update\n patch.undo()\n console.error('Failed to delete view:', error)\n }\n },\n transformErrorResponse: (error: any) => error.data?.detail,\n // updates the view list cache for a specific view type and project\n invalidatesTags: (_r, _e, { viewType, projectName, viewId }) => [\n { type: 'view', id: viewId },\n getScopeTag(viewType, projectName),\n ],\n },\n setDefaultView: {\n onQueryStarted: async (arg, { dispatch, queryFulfilled, getState }) => {\n const { setDefaultViewRequestModel, projectName, viewType } = arg\n const { viewId } = setDefaultViewRequestModel\n const state = getState()\n // get current state of default view\n const currentDefaultView = getViewsApi.endpoints.getDefaultView.select({\n viewType,\n projectName,\n })(state)\n\n // check if there is even a cache for the default view\n if (currentDefaultView?.isSuccess && currentDefaultView.data?.id) {\n // Optimistically update the default view\n const patch = dispatch(\n getViewsApi.util.updateQueryData(\n 'getDefaultView',\n { viewType, projectName },\n (draft) => {\n if (draft) {\n // Try to find the view in the listViews cache\n const listViewData = getViewsApi.endpoints.listViews.select({\n viewType,\n projectName,\n })(state)\n const view = listViewData?.data?.find((v) => v.id === viewId)\n\n console.debug('updating default view:', viewId, 'found in list:', view)\n\n if (view) {\n // If the view is found in the listViews cache, update the getDefaultView cache with the full view data\n Object.assign(draft, view)\n } else {\n // If the view is not found, only update the ID\n draft.id = viewId\n }\n }\n },\n ),\n )\n\n try {\n await queryFulfilled\n } catch (error) {\n // If the query failed, we need to roll back the optimistic update\n patch.undo()\n console.error('Failed to set default view:', error)\n }\n } else {\n console.warn(\n 'No current default view found, skipping optimistic update and invalidating default view cache',\n )\n // If there is no current default view, we skip the optimistic update\n // it will be handled by the invalidation below\n }\n },\n transformErrorResponse: (error: any) => error.data?.detail,\n // updates the default view cache for a specific view type and project\n invalidatesTags: (_r, _e, { viewType, projectName, setDefaultViewRequestModel }) => [\n { type: 'view', id: setDefaultViewRequestModel.viewId },\n getScopeTag(viewType, projectName),\n ],\n },\n },\n})\n\nexport const {\n useCreateViewMutation,\n useUpdateViewMutation,\n useDeleteViewMutation,\n useSetDefaultViewMutation,\n} = updateViewsApi\nexport { updateViewsApi as viewsQueries }\n"],"names":["_a"],"mappings":"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"}
@@ -186,9 +186,6 @@ require("../VersionUploader/components/UploadVersionDialog.cjs.js");
186
186
  require("../VersionUploader/context/VersionUploadContext.cjs.js");
187
187
  require("../Feedback/FeedbackContext.cjs.js");
188
188
  require("../Feedback/SupportBubble.cjs.js");
189
- require("../Views/context/ViewsContext.cjs.js");
190
- require("../Views/Views.styled.cjs.js");
191
- require("../Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");
192
189
  require("../../containers/DetailsPanel/DetailsPanel.styled.cjs.js");
193
190
  require("../../containers/DetailsPanel/FeedFilters/FeedFilters.styled.cjs.js");
194
191
  const DetailsPanelHeader_styled = require("../../containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.cjs.js");
@@ -199,6 +196,10 @@ require("../../containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating
199
196
  require("../../containers/Actions/Actions.styled.cjs.js");
200
197
  require("../../containers/Actions/ActionsDropdown/ActionsDropdown.cjs.js");
201
198
  require("../../containers/Actions/ActionIcon.cjs.js");
199
+ require("../../containers/Views/context/ViewsContext.cjs.js");
200
+ require("../../containers/Views/Views.styled.cjs.js");
201
+ require("../../containers/Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");
202
+ require("../../containers/Views/ViewsMenu/ViewsMenu.cjs.js");
202
203
  const dropZones = [
203
204
  { id: "thumbnail", label: "Upload thumbnail", icon: "add_photo_alternate" },
204
205
  { id: "version", label: "Upload version", icon: "layers" }
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPanelUploader.cjs.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\nimport { upperFirst } from 'lodash'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n type ProductCreationData,\n type VersionCreationData,\n} from '@shared/utils/versionUploadHelpers'\n// 3811c830436f11f0abc9d6ac5bf0bcfb\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["useDetailsPanelContext","useState","useRef","useReviewablesUpload","progress","sanitizeProductName","toast","createProductHelper","createProduct","handleUploadError","useCreateVersionMutation","useCreateProductMutation","productId","_a","getNextVersionNumber","createVersionHelper","entityType","projectName","res","useUpdateEntitiesMutation","jsxs","ThumbnailUploadProvider","Styled.DragAndDropWrapper","jsx","ThumbnailWrapper","Styled.DropZones","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton"],"mappings":"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"}
1
+ {"version":3,"file":"EntityPanelUploader.cjs.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\nimport { upperFirst } from 'lodash'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n type ProductCreationData,\n type VersionCreationData,\n} from '@shared/utils/versionUploadHelpers'\n// 3811c830436f11f0abc9d6ac5bf0bcfb\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["useDetailsPanelContext","useState","useRef","useReviewablesUpload","progress","sanitizeProductName","toast","createProductHelper","createProduct","handleUploadError","useCreateVersionMutation","useCreateProductMutation","productId","_a","getNextVersionNumber","createVersionHelper","entityType","projectName","res","useUpdateEntitiesMutation","jsxs","ThumbnailUploadProvider","Styled.DragAndDropWrapper","jsx","ThumbnailWrapper","Styled.DropZones","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton"],"mappings":"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"}
@@ -184,9 +184,6 @@ import "../VersionUploader/components/UploadVersionDialog.es.js";
184
184
  import "../VersionUploader/context/VersionUploadContext.es.js";
185
185
  import "../Feedback/FeedbackContext.es.js";
186
186
  import "../Feedback/SupportBubble.es.js";
187
- import "../Views/context/ViewsContext.es.js";
188
- import "../Views/Views.styled.es.js";
189
- import "../Views/ViewsMenuContainer/ViewsMenuContainer.es.js";
190
187
  import "../../containers/DetailsPanel/DetailsPanel.styled.es.js";
191
188
  import "../../containers/DetailsPanel/FeedFilters/FeedFilters.styled.es.js";
192
189
  import { ThumbnailWrapper } from "../../containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.styled.es.js";
@@ -197,6 +194,10 @@ import "../../containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.
197
194
  import "../../containers/Actions/Actions.styled.es.js";
198
195
  import "../../containers/Actions/ActionsDropdown/ActionsDropdown.es.js";
199
196
  import "../../containers/Actions/ActionIcon.es.js";
197
+ import "../../containers/Views/context/ViewsContext.es.js";
198
+ import "../../containers/Views/Views.styled.es.js";
199
+ import "../../containers/Views/ViewsMenuContainer/ViewsMenuContainer.es.js";
200
+ import "../../containers/Views/ViewsMenu/ViewsMenu.es.js";
200
201
  const dropZones = [
201
202
  { id: "thumbnail", label: "Upload thumbnail", icon: "add_photo_alternate" },
202
203
  { id: "version", label: "Upload version", icon: "layers" }
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPanelUploader.es.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\nimport { upperFirst } from 'lodash'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n type ProductCreationData,\n type VersionCreationData,\n} from '@shared/utils/versionUploadHelpers'\n// 3811c830436f11f0abc9d6ac5bf0bcfb\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["progress","productId","_a","entityType","projectName","res","jsxs","Styled.DragAndDropWrapper","jsx","Styled.DropZones","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton"],"mappings":"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"}
1
+ {"version":3,"file":"EntityPanelUploader.es.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\nimport { upperFirst } from 'lodash'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n type ProductCreationData,\n type VersionCreationData,\n} from '@shared/utils/versionUploadHelpers'\n// 3811c830436f11f0abc9d6ac5bf0bcfb\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["progress","productId","_a","entityType","projectName","res","jsxs","Styled.DragAndDropWrapper","jsx","Styled.DropZones","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton"],"mappings":"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"}
@@ -131,6 +131,7 @@ const FeedbackProvider = ({ children }) => {
131
131
  instanceId: connect == null ? void 0 : connect.instanceId
132
132
  }
133
133
  };
134
+ console.log(identifyData);
134
135
  const win = window;
135
136
  win.Featurebase("identify", identifyData, (err) => {
136
137
  if (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackContext.cjs.js","sources":["../../../../../src/components/Feedback/FeedbackContext.tsx"],"sourcesContent":["import { cloneDeep } from 'lodash'\nimport React, { createContext, useContext, ReactNode, useEffect, useState } from 'react'\nimport {\n useGetCurrentUserQuery,\n useGetFeedbackVerificationQuery,\n useGetSiteInfoQuery,\n useGetYnputCloudInfoQuery,\n} from '@shared/api'\n\nexport type FeedbackContextType = {\n loaded: boolean\n openSupport: (\n page?: 'Home' | 'Messages' | 'Changelog' | 'Help' | 'NewMessage' | 'ShowArticle',\n id?: string,\n ) => void\n messengerLoaded: boolean // whether the messenger widget is loaded\n unreadCount: number // number of unread messages\n messengerVisibility: boolean\n setMessengerVisibility: (show: boolean) => void // show/hide the messenger icon\n openFeedback: () => void\n openPortal: (\n page?: 'MainView' | 'RoadmapView' | 'CreatePost' | 'PostsView' | 'ChangelogView' | 'HelpView',\n articleId?: string,\n ) => void\n}\n\nconst FeedbackContext = createContext<FeedbackContextType | undefined>(undefined)\n\ntype FeedbackProviderProps = {\n children: ReactNode\n}\n\nexport const FeedbackProvider: React.FC<FeedbackProviderProps> = ({ children }) => {\n const [scriptLoaded, setScriptLoaded] = useState(false)\n\n const { data: user } = useGetCurrentUserQuery()\n const { data: siteInfo } = useGetSiteInfoQuery({ full: true }, { skip: !user?.name })\n const { data: connect } = useGetYnputCloudInfoQuery(undefined, { skip: !user?.name })\n const { data: verification, isLoading: isLoadingVerification } = useGetFeedbackVerificationQuery(\n undefined,\n {\n skip: !user?.name,\n },\n )\n\n const loadScript = () => {\n if (!scriptLoaded) {\n const script = document.createElement('script')\n script.src = 'https://do.featurebase.app/js/sdk.js'\n script.id = 'featurebase-sdk'\n script.async = true\n document.body.appendChild(script)\n setScriptLoaded(true)\n }\n }\n\n const initialize = () => {\n // Initialize Featurebase\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n win.Featurebase = function () {\n ;(win.Featurebase.q = win.Featurebase.q || []).push(arguments)\n }\n }\n }\n\n const serverVersion = siteInfo?.version?.split('+')[0] || 'unknown'\n const frontendVersion = siteInfo?.version?.split('+')[1] || 'unknown'\n\n const identifyUser = () => {\n if (!user?.name || !verification) return\n const verificationData = cloneDeep(verification)\n // delete any undefined/null properties\n const cleanObject = (obj: any) => {\n Object.keys(obj).forEach((key) => {\n if (obj[key] && typeof obj[key] === 'object') {\n cleanObject(obj[key])\n } else if (obj[key] === undefined || obj[key] === null) {\n delete obj[key]\n }\n })\n }\n\n cleanObject(verificationData)\n\n const identifyData = {\n ...verificationData,\n customFields: {\n origin: window.location.origin,\n serverVersion: serverVersion,\n frontendVersion: frontendVersion,\n instanceId: connect?.instanceId,\n },\n }\n\n const win = window as any\n win.Featurebase('identify', identifyData, (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase identify completed')\n }\n })\n }\n\n const [messengerLoaded, setMessengerLoaded] = useState(false)\n const [unreadCount, setUnreadCount] = useState(0)\n\n // MESSENGER WIDGET\n const initializeMessenger = (): void => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n console.log('Initializing Featurebase messenger widget')\n win.Featurebase(\n 'boot',\n {\n appId: '67b76a31b8a7a2f3181da4ba',\n email: verification?.email,\n theme: 'dark',\n userId: verification?.userId, // user ID from verification\n userHash: verification?.userHash, // generated user hash token\n },\n (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase messenger completed')\n setMessengerLoaded(true)\n\n // register event listener for unread messages\n win.Featurebase('onUnreadCountChange', function (unreadCount: number) {\n setUnreadCount(unreadCount)\n })\n }\n },\n )\n }\n }\n\n // CHANGELOG WIDGET\n const initializeChangelog = (): boolean => {\n // everyone sees highlights\n const categories: string[] = []\n\n if (user?.data?.isAdmin) {\n // admins see everything\n const adminCategories = ['Server', 'Addon', 'Pipeline']\n categories.push(...adminCategories)\n } else if (!siteInfo?.disableChangelog) {\n // users only see highlights (unless disabled)\n // admins do not see highlights as it is a subset of the other categories\n categories.push('Highlights')\n }\n\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('init_changelog_widget', {\n organization: 'ayon',\n dropdown: {\n enabled: true,\n },\n popup: {\n enabled: true,\n usersName: user?.attrib?.fullName,\n autoOpenForNewUpdates: true,\n },\n category: categories,\n theme: 'dark',\n })\n }\n return false\n }\n\n // FEEDBACK WIDGET\n const initializeFeedbackWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_feedback_widget',\n {\n organization: 'ayon',\n theme: 'dark',\n metadata: {},\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing feedback widget:', error)\n } else {\n }\n },\n )\n }\n return false\n }\n\n // PORTAL WIDGET (old)\n const initializePortalWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_portal_widget',\n {\n organization: 'ayon',\n fullScreen: true,\n initialPage: 'MainView',\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing portal widget:', error)\n return false\n } else {\n return true\n }\n },\n )\n }\n return false\n }\n\n // Use an environment variable to skip loading Featurebase in certain environments\n // @ts-expect-error: Vite provides import.meta.env at runtime\n const skipFeaturebase = import.meta.env.VITE_SKIP_FEATUREBASE === 'true'\n\n // Load Featurebase script and initialize widgets\n useEffect(() => {\n // if skip flag is set, do not load the script\n if (skipFeaturebase) return\n // if not logged in, do not load the script\n if (!user?.name) return\n if (!siteInfo) return\n\n // if already loaded, do not load again\n if (scriptLoaded) return\n\n // Load the Featurebase script\n loadScript()\n\n // Initialize Featurebase\n initialize()\n\n // Initialize changelog widget\n initializeChangelog()\n\n // Initialize feedback widget\n initializeFeedbackWidget()\n\n // Initialize portal widget\n initializePortalWidget()\n }, [user?.name, scriptLoaded, siteInfo])\n\n const [identified, setIdentified] = useState(false)\n // verify user\n useEffect(() => {\n // check if we can identify the user\n if (!user?.name || !verification || !scriptLoaded) return\n // if we are already identified, do not identify again\n if (identified) return\n // Identify the user\n identifyUser()\n setIdentified(true)\n }, [\n user?.name,\n connect?.instanceId,\n verification?.userHash,\n scriptLoaded,\n window.location.pathname,\n identified,\n ])\n\n // load messenger widget once verification is done loading\n // we don't need verification but we should use it if we have it\n useEffect(() => {\n // wait for script to be loaded and verification to finish loading\n if (isLoadingVerification || !scriptLoaded) return\n\n // initialize the messenger widget\n initializeMessenger()\n }, [verification, isLoadingVerification, scriptLoaded])\n\n const openFeedback: FeedbackContextType['openFeedback'] = () => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'openFeedbackWidget',\n },\n })\n }\n\n const openPortal = (\n page:\n | 'MainView'\n | 'RoadmapView'\n | 'CreatePost'\n | 'PostsView'\n | 'ChangelogView'\n | 'HelpView' = 'MainView',\n articleId?: string,\n ) => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'changePage',\n payload: page,\n openWidget: true,\n ...(articleId && { articleId }),\n },\n })\n }\n\n const [messengerVisibility, setMessengerVisibility] = useState(false)\n const supportElement = document.getElementById('fb-messenger-root')\n\n const setSupportDisplay = (show: boolean) =>\n supportElement instanceof HTMLElement &&\n (supportElement.style.display = show ? 'block' : 'none')\n\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n setSupportDisplay(messengerVisibility)\n }, [scriptLoaded, messengerLoaded, messengerVisibility])\n\n // when the messenger is hidden, we need to hide the root element again\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('onHide', function () {\n // hide the messenger root element\n setMessengerVisibility(false)\n })\n }\n }, [scriptLoaded, messengerLoaded])\n\n const openSupport: FeedbackContextType['openSupport'] = (page = 'Home', id) => {\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n window.alert('Featurebase SDK is not loaded yet. Please try again later.')\n console.warn('Featurebase SDK is not loaded yet.')\n return\n }\n\n if (messengerVisibility) {\n // if the messenger is already visible, close it\n win.Featurebase('hide')\n setMessengerVisibility(false)\n return\n }\n\n // ensure the messenger is visible\n setMessengerVisibility(true)\n\n switch (page) {\n case 'Home':\n // Show messenger home\n win.Featurebase('show')\n break\n case 'Messages':\n // Show messages view\n win.Featurebase('show', 'messages')\n break\n case 'Changelog':\n // Show changelog view\n win.Featurebase('show', 'changelog')\n break\n case 'Help':\n // Open help center\n win.Featurebase('show', 'help')\n break\n case 'ShowArticle':\n // Open a specific help article\n if (id) win.Featurebase('showArticle', id)\n else win.Featurebase('show', 'help')\n break\n case 'NewMessage':\n // Open new message dialog\n win.Featurebase('showNewMessage', id)\n break\n default:\n // Default to showing the main widget\n win.Featurebase('show')\n break\n }\n }\n\n return (\n <FeedbackContext.Provider\n value={{\n openSupport,\n openFeedback,\n openPortal,\n messengerLoaded,\n unreadCount,\n messengerVisibility,\n setMessengerVisibility,\n loaded: scriptLoaded,\n }}\n >\n {children}\n </FeedbackContext.Provider>\n )\n}\n\nexport const useFeedback = (): FeedbackContextType => {\n const context = useContext(FeedbackContext)\n if (!context) {\n throw new Error('useFeedback must be used within a FeedbackProvider')\n }\n return context\n}\n"],"names":["createContext","useState","useGetCurrentUserQuery","useGetSiteInfoQuery","useGetYnputCloudInfoQuery","useGetFeedbackVerificationQuery","cloneDeep","unreadCount","_a","_b","useEffect","jsx","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"FeedbackContext.cjs.js","sources":["../../../../../src/components/Feedback/FeedbackContext.tsx"],"sourcesContent":["import { cloneDeep } from 'lodash'\nimport React, { createContext, useContext, ReactNode, useEffect, useState } from 'react'\nimport {\n useGetCurrentUserQuery,\n useGetFeedbackVerificationQuery,\n useGetSiteInfoQuery,\n useGetYnputCloudInfoQuery,\n} from '@shared/api'\n\nexport type FeedbackContextType = {\n loaded: boolean\n openSupport: (\n page?: 'Home' | 'Messages' | 'Changelog' | 'Help' | 'NewMessage' | 'ShowArticle',\n id?: string,\n ) => void\n messengerLoaded: boolean // whether the messenger widget is loaded\n unreadCount: number // number of unread messages\n messengerVisibility: boolean\n setMessengerVisibility: (show: boolean) => void // show/hide the messenger icon\n openFeedback: () => void\n openPortal: (\n page?: 'MainView' | 'RoadmapView' | 'CreatePost' | 'PostsView' | 'ChangelogView' | 'HelpView',\n articleId?: string,\n ) => void\n}\n\nconst FeedbackContext = createContext<FeedbackContextType | undefined>(undefined)\n\ntype FeedbackProviderProps = {\n children: ReactNode\n}\n\nexport const FeedbackProvider: React.FC<FeedbackProviderProps> = ({ children }) => {\n const [scriptLoaded, setScriptLoaded] = useState(false)\n\n const { data: user } = useGetCurrentUserQuery()\n const { data: siteInfo } = useGetSiteInfoQuery({ full: true }, { skip: !user?.name })\n const { data: connect } = useGetYnputCloudInfoQuery(undefined, { skip: !user?.name })\n const { data: verification, isLoading: isLoadingVerification } = useGetFeedbackVerificationQuery(\n undefined,\n {\n skip: !user?.name,\n },\n )\n\n const loadScript = () => {\n if (!scriptLoaded) {\n const script = document.createElement('script')\n script.src = 'https://do.featurebase.app/js/sdk.js'\n script.id = 'featurebase-sdk'\n script.async = true\n document.body.appendChild(script)\n setScriptLoaded(true)\n }\n }\n\n const initialize = () => {\n // Initialize Featurebase\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n win.Featurebase = function () {\n ;(win.Featurebase.q = win.Featurebase.q || []).push(arguments)\n }\n }\n }\n\n const serverVersion = siteInfo?.version?.split('+')[0] || 'unknown'\n const frontendVersion = siteInfo?.version?.split('+')[1] || 'unknown'\n\n const identifyUser = () => {\n if (!user?.name || !verification) return\n const verificationData = cloneDeep(verification)\n // delete any undefined/null properties\n const cleanObject = (obj: any) => {\n Object.keys(obj).forEach((key) => {\n if (obj[key] && typeof obj[key] === 'object') {\n cleanObject(obj[key])\n } else if (obj[key] === undefined || obj[key] === null) {\n delete obj[key]\n }\n })\n }\n\n cleanObject(verificationData)\n\n const identifyData = {\n ...verificationData,\n customFields: {\n origin: window.location.origin,\n serverVersion: serverVersion,\n frontendVersion: frontendVersion,\n instanceId: connect?.instanceId,\n },\n }\n\n console.log(identifyData)\n\n const win = window as any\n win.Featurebase('identify', identifyData, (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase identify completed')\n }\n })\n }\n\n const [messengerLoaded, setMessengerLoaded] = useState(false)\n const [unreadCount, setUnreadCount] = useState(0)\n\n // MESSENGER WIDGET\n const initializeMessenger = (): void => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n console.log('Initializing Featurebase messenger widget')\n win.Featurebase(\n 'boot',\n {\n appId: '67b76a31b8a7a2f3181da4ba',\n email: verification?.email,\n theme: 'dark',\n userId: verification?.userId, // user ID from verification\n userHash: verification?.userHash, // generated user hash token\n },\n (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase messenger completed')\n setMessengerLoaded(true)\n\n // register event listener for unread messages\n win.Featurebase('onUnreadCountChange', function (unreadCount: number) {\n setUnreadCount(unreadCount)\n })\n }\n },\n )\n }\n }\n\n // CHANGELOG WIDGET\n const initializeChangelog = (): boolean => {\n // everyone sees highlights\n const categories: string[] = []\n\n if (user?.data?.isAdmin) {\n // admins see everything\n const adminCategories = ['Server', 'Addon', 'Pipeline']\n categories.push(...adminCategories)\n } else if (!siteInfo?.disableChangelog) {\n // users only see highlights (unless disabled)\n // admins do not see highlights as it is a subset of the other categories\n categories.push('Highlights')\n }\n\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('init_changelog_widget', {\n organization: 'ayon',\n dropdown: {\n enabled: true,\n },\n popup: {\n enabled: true,\n usersName: user?.attrib?.fullName,\n autoOpenForNewUpdates: true,\n },\n category: categories,\n theme: 'dark',\n })\n }\n return false\n }\n\n // FEEDBACK WIDGET\n const initializeFeedbackWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_feedback_widget',\n {\n organization: 'ayon',\n theme: 'dark',\n metadata: {},\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing feedback widget:', error)\n } else {\n }\n },\n )\n }\n return false\n }\n\n // PORTAL WIDGET (old)\n const initializePortalWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_portal_widget',\n {\n organization: 'ayon',\n fullScreen: true,\n initialPage: 'MainView',\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing portal widget:', error)\n return false\n } else {\n return true\n }\n },\n )\n }\n return false\n }\n\n // Use an environment variable to skip loading Featurebase in certain environments\n // @ts-expect-error: Vite provides import.meta.env at runtime\n const skipFeaturebase = import.meta.env.VITE_SKIP_FEATUREBASE === 'true'\n\n // Load Featurebase script and initialize widgets\n useEffect(() => {\n // if skip flag is set, do not load the script\n if (skipFeaturebase) return\n // if not logged in, do not load the script\n if (!user?.name) return\n if (!siteInfo) return\n\n // if already loaded, do not load again\n if (scriptLoaded) return\n\n // Load the Featurebase script\n loadScript()\n\n // Initialize Featurebase\n initialize()\n\n // Initialize changelog widget\n initializeChangelog()\n\n // Initialize feedback widget\n initializeFeedbackWidget()\n\n // Initialize portal widget\n initializePortalWidget()\n }, [user?.name, scriptLoaded, siteInfo])\n\n const [identified, setIdentified] = useState(false)\n // verify user\n useEffect(() => {\n // check if we can identify the user\n if (!user?.name || !verification || !scriptLoaded) return\n // if we are already identified, do not identify again\n if (identified) return\n // Identify the user\n identifyUser()\n setIdentified(true)\n }, [\n user?.name,\n connect?.instanceId,\n verification?.userHash,\n scriptLoaded,\n window.location.pathname,\n identified,\n ])\n\n // load messenger widget once verification is done loading\n // we don't need verification but we should use it if we have it\n useEffect(() => {\n // wait for script to be loaded and verification to finish loading\n if (isLoadingVerification || !scriptLoaded) return\n\n // initialize the messenger widget\n initializeMessenger()\n }, [verification, isLoadingVerification, scriptLoaded])\n\n const openFeedback: FeedbackContextType['openFeedback'] = () => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'openFeedbackWidget',\n },\n })\n }\n\n const openPortal = (\n page:\n | 'MainView'\n | 'RoadmapView'\n | 'CreatePost'\n | 'PostsView'\n | 'ChangelogView'\n | 'HelpView' = 'MainView',\n articleId?: string,\n ) => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'changePage',\n payload: page,\n openWidget: true,\n ...(articleId && { articleId }),\n },\n })\n }\n\n const [messengerVisibility, setMessengerVisibility] = useState(false)\n const supportElement = document.getElementById('fb-messenger-root')\n\n const setSupportDisplay = (show: boolean) =>\n supportElement instanceof HTMLElement &&\n (supportElement.style.display = show ? 'block' : 'none')\n\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n setSupportDisplay(messengerVisibility)\n }, [scriptLoaded, messengerLoaded, messengerVisibility])\n\n // when the messenger is hidden, we need to hide the root element again\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('onHide', function () {\n // hide the messenger root element\n setMessengerVisibility(false)\n })\n }\n }, [scriptLoaded, messengerLoaded])\n\n const openSupport: FeedbackContextType['openSupport'] = (page = 'Home', id) => {\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n window.alert('Featurebase SDK is not loaded yet. Please try again later.')\n console.warn('Featurebase SDK is not loaded yet.')\n return\n }\n\n if (messengerVisibility) {\n // if the messenger is already visible, close it\n win.Featurebase('hide')\n setMessengerVisibility(false)\n return\n }\n\n // ensure the messenger is visible\n setMessengerVisibility(true)\n\n switch (page) {\n case 'Home':\n // Show messenger home\n win.Featurebase('show')\n break\n case 'Messages':\n // Show messages view\n win.Featurebase('show', 'messages')\n break\n case 'Changelog':\n // Show changelog view\n win.Featurebase('show', 'changelog')\n break\n case 'Help':\n // Open help center\n win.Featurebase('show', 'help')\n break\n case 'ShowArticle':\n // Open a specific help article\n if (id) win.Featurebase('showArticle', id)\n else win.Featurebase('show', 'help')\n break\n case 'NewMessage':\n // Open new message dialog\n win.Featurebase('showNewMessage', id)\n break\n default:\n // Default to showing the main widget\n win.Featurebase('show')\n break\n }\n }\n\n return (\n <FeedbackContext.Provider\n value={{\n openSupport,\n openFeedback,\n openPortal,\n messengerLoaded,\n unreadCount,\n messengerVisibility,\n setMessengerVisibility,\n loaded: scriptLoaded,\n }}\n >\n {children}\n </FeedbackContext.Provider>\n )\n}\n\nexport const useFeedback = (): FeedbackContextType => {\n const context = useContext(FeedbackContext)\n if (!context) {\n throw new Error('useFeedback must be used within a FeedbackProvider')\n }\n return context\n}\n"],"names":["createContext","useState","useGetCurrentUserQuery","useGetSiteInfoQuery","useGetYnputCloudInfoQuery","useGetFeedbackVerificationQuery","cloneDeep","unreadCount","_a","_b","useEffect","jsx","useContext"],"mappings":"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"}
@@ -129,6 +129,7 @@ const FeedbackProvider = ({ children }) => {
129
129
  instanceId: connect == null ? void 0 : connect.instanceId
130
130
  }
131
131
  };
132
+ console.log(identifyData);
132
133
  const win = window;
133
134
  win.Featurebase("identify", identifyData, (err) => {
134
135
  if (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackContext.es.js","sources":["../../../../../src/components/Feedback/FeedbackContext.tsx"],"sourcesContent":["import { cloneDeep } from 'lodash'\nimport React, { createContext, useContext, ReactNode, useEffect, useState } from 'react'\nimport {\n useGetCurrentUserQuery,\n useGetFeedbackVerificationQuery,\n useGetSiteInfoQuery,\n useGetYnputCloudInfoQuery,\n} from '@shared/api'\n\nexport type FeedbackContextType = {\n loaded: boolean\n openSupport: (\n page?: 'Home' | 'Messages' | 'Changelog' | 'Help' | 'NewMessage' | 'ShowArticle',\n id?: string,\n ) => void\n messengerLoaded: boolean // whether the messenger widget is loaded\n unreadCount: number // number of unread messages\n messengerVisibility: boolean\n setMessengerVisibility: (show: boolean) => void // show/hide the messenger icon\n openFeedback: () => void\n openPortal: (\n page?: 'MainView' | 'RoadmapView' | 'CreatePost' | 'PostsView' | 'ChangelogView' | 'HelpView',\n articleId?: string,\n ) => void\n}\n\nconst FeedbackContext = createContext<FeedbackContextType | undefined>(undefined)\n\ntype FeedbackProviderProps = {\n children: ReactNode\n}\n\nexport const FeedbackProvider: React.FC<FeedbackProviderProps> = ({ children }) => {\n const [scriptLoaded, setScriptLoaded] = useState(false)\n\n const { data: user } = useGetCurrentUserQuery()\n const { data: siteInfo } = useGetSiteInfoQuery({ full: true }, { skip: !user?.name })\n const { data: connect } = useGetYnputCloudInfoQuery(undefined, { skip: !user?.name })\n const { data: verification, isLoading: isLoadingVerification } = useGetFeedbackVerificationQuery(\n undefined,\n {\n skip: !user?.name,\n },\n )\n\n const loadScript = () => {\n if (!scriptLoaded) {\n const script = document.createElement('script')\n script.src = 'https://do.featurebase.app/js/sdk.js'\n script.id = 'featurebase-sdk'\n script.async = true\n document.body.appendChild(script)\n setScriptLoaded(true)\n }\n }\n\n const initialize = () => {\n // Initialize Featurebase\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n win.Featurebase = function () {\n ;(win.Featurebase.q = win.Featurebase.q || []).push(arguments)\n }\n }\n }\n\n const serverVersion = siteInfo?.version?.split('+')[0] || 'unknown'\n const frontendVersion = siteInfo?.version?.split('+')[1] || 'unknown'\n\n const identifyUser = () => {\n if (!user?.name || !verification) return\n const verificationData = cloneDeep(verification)\n // delete any undefined/null properties\n const cleanObject = (obj: any) => {\n Object.keys(obj).forEach((key) => {\n if (obj[key] && typeof obj[key] === 'object') {\n cleanObject(obj[key])\n } else if (obj[key] === undefined || obj[key] === null) {\n delete obj[key]\n }\n })\n }\n\n cleanObject(verificationData)\n\n const identifyData = {\n ...verificationData,\n customFields: {\n origin: window.location.origin,\n serverVersion: serverVersion,\n frontendVersion: frontendVersion,\n instanceId: connect?.instanceId,\n },\n }\n\n const win = window as any\n win.Featurebase('identify', identifyData, (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase identify completed')\n }\n })\n }\n\n const [messengerLoaded, setMessengerLoaded] = useState(false)\n const [unreadCount, setUnreadCount] = useState(0)\n\n // MESSENGER WIDGET\n const initializeMessenger = (): void => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n console.log('Initializing Featurebase messenger widget')\n win.Featurebase(\n 'boot',\n {\n appId: '67b76a31b8a7a2f3181da4ba',\n email: verification?.email,\n theme: 'dark',\n userId: verification?.userId, // user ID from verification\n userHash: verification?.userHash, // generated user hash token\n },\n (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase messenger completed')\n setMessengerLoaded(true)\n\n // register event listener for unread messages\n win.Featurebase('onUnreadCountChange', function (unreadCount: number) {\n setUnreadCount(unreadCount)\n })\n }\n },\n )\n }\n }\n\n // CHANGELOG WIDGET\n const initializeChangelog = (): boolean => {\n // everyone sees highlights\n const categories: string[] = []\n\n if (user?.data?.isAdmin) {\n // admins see everything\n const adminCategories = ['Server', 'Addon', 'Pipeline']\n categories.push(...adminCategories)\n } else if (!siteInfo?.disableChangelog) {\n // users only see highlights (unless disabled)\n // admins do not see highlights as it is a subset of the other categories\n categories.push('Highlights')\n }\n\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('init_changelog_widget', {\n organization: 'ayon',\n dropdown: {\n enabled: true,\n },\n popup: {\n enabled: true,\n usersName: user?.attrib?.fullName,\n autoOpenForNewUpdates: true,\n },\n category: categories,\n theme: 'dark',\n })\n }\n return false\n }\n\n // FEEDBACK WIDGET\n const initializeFeedbackWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_feedback_widget',\n {\n organization: 'ayon',\n theme: 'dark',\n metadata: {},\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing feedback widget:', error)\n } else {\n }\n },\n )\n }\n return false\n }\n\n // PORTAL WIDGET (old)\n const initializePortalWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_portal_widget',\n {\n organization: 'ayon',\n fullScreen: true,\n initialPage: 'MainView',\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing portal widget:', error)\n return false\n } else {\n return true\n }\n },\n )\n }\n return false\n }\n\n // Use an environment variable to skip loading Featurebase in certain environments\n // @ts-expect-error: Vite provides import.meta.env at runtime\n const skipFeaturebase = import.meta.env.VITE_SKIP_FEATUREBASE === 'true'\n\n // Load Featurebase script and initialize widgets\n useEffect(() => {\n // if skip flag is set, do not load the script\n if (skipFeaturebase) return\n // if not logged in, do not load the script\n if (!user?.name) return\n if (!siteInfo) return\n\n // if already loaded, do not load again\n if (scriptLoaded) return\n\n // Load the Featurebase script\n loadScript()\n\n // Initialize Featurebase\n initialize()\n\n // Initialize changelog widget\n initializeChangelog()\n\n // Initialize feedback widget\n initializeFeedbackWidget()\n\n // Initialize portal widget\n initializePortalWidget()\n }, [user?.name, scriptLoaded, siteInfo])\n\n const [identified, setIdentified] = useState(false)\n // verify user\n useEffect(() => {\n // check if we can identify the user\n if (!user?.name || !verification || !scriptLoaded) return\n // if we are already identified, do not identify again\n if (identified) return\n // Identify the user\n identifyUser()\n setIdentified(true)\n }, [\n user?.name,\n connect?.instanceId,\n verification?.userHash,\n scriptLoaded,\n window.location.pathname,\n identified,\n ])\n\n // load messenger widget once verification is done loading\n // we don't need verification but we should use it if we have it\n useEffect(() => {\n // wait for script to be loaded and verification to finish loading\n if (isLoadingVerification || !scriptLoaded) return\n\n // initialize the messenger widget\n initializeMessenger()\n }, [verification, isLoadingVerification, scriptLoaded])\n\n const openFeedback: FeedbackContextType['openFeedback'] = () => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'openFeedbackWidget',\n },\n })\n }\n\n const openPortal = (\n page:\n | 'MainView'\n | 'RoadmapView'\n | 'CreatePost'\n | 'PostsView'\n | 'ChangelogView'\n | 'HelpView' = 'MainView',\n articleId?: string,\n ) => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'changePage',\n payload: page,\n openWidget: true,\n ...(articleId && { articleId }),\n },\n })\n }\n\n const [messengerVisibility, setMessengerVisibility] = useState(false)\n const supportElement = document.getElementById('fb-messenger-root')\n\n const setSupportDisplay = (show: boolean) =>\n supportElement instanceof HTMLElement &&\n (supportElement.style.display = show ? 'block' : 'none')\n\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n setSupportDisplay(messengerVisibility)\n }, [scriptLoaded, messengerLoaded, messengerVisibility])\n\n // when the messenger is hidden, we need to hide the root element again\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('onHide', function () {\n // hide the messenger root element\n setMessengerVisibility(false)\n })\n }\n }, [scriptLoaded, messengerLoaded])\n\n const openSupport: FeedbackContextType['openSupport'] = (page = 'Home', id) => {\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n window.alert('Featurebase SDK is not loaded yet. Please try again later.')\n console.warn('Featurebase SDK is not loaded yet.')\n return\n }\n\n if (messengerVisibility) {\n // if the messenger is already visible, close it\n win.Featurebase('hide')\n setMessengerVisibility(false)\n return\n }\n\n // ensure the messenger is visible\n setMessengerVisibility(true)\n\n switch (page) {\n case 'Home':\n // Show messenger home\n win.Featurebase('show')\n break\n case 'Messages':\n // Show messages view\n win.Featurebase('show', 'messages')\n break\n case 'Changelog':\n // Show changelog view\n win.Featurebase('show', 'changelog')\n break\n case 'Help':\n // Open help center\n win.Featurebase('show', 'help')\n break\n case 'ShowArticle':\n // Open a specific help article\n if (id) win.Featurebase('showArticle', id)\n else win.Featurebase('show', 'help')\n break\n case 'NewMessage':\n // Open new message dialog\n win.Featurebase('showNewMessage', id)\n break\n default:\n // Default to showing the main widget\n win.Featurebase('show')\n break\n }\n }\n\n return (\n <FeedbackContext.Provider\n value={{\n openSupport,\n openFeedback,\n openPortal,\n messengerLoaded,\n unreadCount,\n messengerVisibility,\n setMessengerVisibility,\n loaded: scriptLoaded,\n }}\n >\n {children}\n </FeedbackContext.Provider>\n )\n}\n\nexport const useFeedback = (): FeedbackContextType => {\n const context = useContext(FeedbackContext)\n if (!context) {\n throw new Error('useFeedback must be used within a FeedbackProvider')\n }\n return context\n}\n"],"names":["unreadCount","_a","_b","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"FeedbackContext.es.js","sources":["../../../../../src/components/Feedback/FeedbackContext.tsx"],"sourcesContent":["import { cloneDeep } from 'lodash'\nimport React, { createContext, useContext, ReactNode, useEffect, useState } from 'react'\nimport {\n useGetCurrentUserQuery,\n useGetFeedbackVerificationQuery,\n useGetSiteInfoQuery,\n useGetYnputCloudInfoQuery,\n} from '@shared/api'\n\nexport type FeedbackContextType = {\n loaded: boolean\n openSupport: (\n page?: 'Home' | 'Messages' | 'Changelog' | 'Help' | 'NewMessage' | 'ShowArticle',\n id?: string,\n ) => void\n messengerLoaded: boolean // whether the messenger widget is loaded\n unreadCount: number // number of unread messages\n messengerVisibility: boolean\n setMessengerVisibility: (show: boolean) => void // show/hide the messenger icon\n openFeedback: () => void\n openPortal: (\n page?: 'MainView' | 'RoadmapView' | 'CreatePost' | 'PostsView' | 'ChangelogView' | 'HelpView',\n articleId?: string,\n ) => void\n}\n\nconst FeedbackContext = createContext<FeedbackContextType | undefined>(undefined)\n\ntype FeedbackProviderProps = {\n children: ReactNode\n}\n\nexport const FeedbackProvider: React.FC<FeedbackProviderProps> = ({ children }) => {\n const [scriptLoaded, setScriptLoaded] = useState(false)\n\n const { data: user } = useGetCurrentUserQuery()\n const { data: siteInfo } = useGetSiteInfoQuery({ full: true }, { skip: !user?.name })\n const { data: connect } = useGetYnputCloudInfoQuery(undefined, { skip: !user?.name })\n const { data: verification, isLoading: isLoadingVerification } = useGetFeedbackVerificationQuery(\n undefined,\n {\n skip: !user?.name,\n },\n )\n\n const loadScript = () => {\n if (!scriptLoaded) {\n const script = document.createElement('script')\n script.src = 'https://do.featurebase.app/js/sdk.js'\n script.id = 'featurebase-sdk'\n script.async = true\n document.body.appendChild(script)\n setScriptLoaded(true)\n }\n }\n\n const initialize = () => {\n // Initialize Featurebase\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n win.Featurebase = function () {\n ;(win.Featurebase.q = win.Featurebase.q || []).push(arguments)\n }\n }\n }\n\n const serverVersion = siteInfo?.version?.split('+')[0] || 'unknown'\n const frontendVersion = siteInfo?.version?.split('+')[1] || 'unknown'\n\n const identifyUser = () => {\n if (!user?.name || !verification) return\n const verificationData = cloneDeep(verification)\n // delete any undefined/null properties\n const cleanObject = (obj: any) => {\n Object.keys(obj).forEach((key) => {\n if (obj[key] && typeof obj[key] === 'object') {\n cleanObject(obj[key])\n } else if (obj[key] === undefined || obj[key] === null) {\n delete obj[key]\n }\n })\n }\n\n cleanObject(verificationData)\n\n const identifyData = {\n ...verificationData,\n customFields: {\n origin: window.location.origin,\n serverVersion: serverVersion,\n frontendVersion: frontendVersion,\n instanceId: connect?.instanceId,\n },\n }\n\n console.log(identifyData)\n\n const win = window as any\n win.Featurebase('identify', identifyData, (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase identify completed')\n }\n })\n }\n\n const [messengerLoaded, setMessengerLoaded] = useState(false)\n const [unreadCount, setUnreadCount] = useState(0)\n\n // MESSENGER WIDGET\n const initializeMessenger = (): void => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n console.log('Initializing Featurebase messenger widget')\n win.Featurebase(\n 'boot',\n {\n appId: '67b76a31b8a7a2f3181da4ba',\n email: verification?.email,\n theme: 'dark',\n userId: verification?.userId, // user ID from verification\n userHash: verification?.userHash, // generated user hash token\n },\n (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase messenger completed')\n setMessengerLoaded(true)\n\n // register event listener for unread messages\n win.Featurebase('onUnreadCountChange', function (unreadCount: number) {\n setUnreadCount(unreadCount)\n })\n }\n },\n )\n }\n }\n\n // CHANGELOG WIDGET\n const initializeChangelog = (): boolean => {\n // everyone sees highlights\n const categories: string[] = []\n\n if (user?.data?.isAdmin) {\n // admins see everything\n const adminCategories = ['Server', 'Addon', 'Pipeline']\n categories.push(...adminCategories)\n } else if (!siteInfo?.disableChangelog) {\n // users only see highlights (unless disabled)\n // admins do not see highlights as it is a subset of the other categories\n categories.push('Highlights')\n }\n\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('init_changelog_widget', {\n organization: 'ayon',\n dropdown: {\n enabled: true,\n },\n popup: {\n enabled: true,\n usersName: user?.attrib?.fullName,\n autoOpenForNewUpdates: true,\n },\n category: categories,\n theme: 'dark',\n })\n }\n return false\n }\n\n // FEEDBACK WIDGET\n const initializeFeedbackWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_feedback_widget',\n {\n organization: 'ayon',\n theme: 'dark',\n metadata: {},\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing feedback widget:', error)\n } else {\n }\n },\n )\n }\n return false\n }\n\n // PORTAL WIDGET (old)\n const initializePortalWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_portal_widget',\n {\n organization: 'ayon',\n fullScreen: true,\n initialPage: 'MainView',\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing portal widget:', error)\n return false\n } else {\n return true\n }\n },\n )\n }\n return false\n }\n\n // Use an environment variable to skip loading Featurebase in certain environments\n // @ts-expect-error: Vite provides import.meta.env at runtime\n const skipFeaturebase = import.meta.env.VITE_SKIP_FEATUREBASE === 'true'\n\n // Load Featurebase script and initialize widgets\n useEffect(() => {\n // if skip flag is set, do not load the script\n if (skipFeaturebase) return\n // if not logged in, do not load the script\n if (!user?.name) return\n if (!siteInfo) return\n\n // if already loaded, do not load again\n if (scriptLoaded) return\n\n // Load the Featurebase script\n loadScript()\n\n // Initialize Featurebase\n initialize()\n\n // Initialize changelog widget\n initializeChangelog()\n\n // Initialize feedback widget\n initializeFeedbackWidget()\n\n // Initialize portal widget\n initializePortalWidget()\n }, [user?.name, scriptLoaded, siteInfo])\n\n const [identified, setIdentified] = useState(false)\n // verify user\n useEffect(() => {\n // check if we can identify the user\n if (!user?.name || !verification || !scriptLoaded) return\n // if we are already identified, do not identify again\n if (identified) return\n // Identify the user\n identifyUser()\n setIdentified(true)\n }, [\n user?.name,\n connect?.instanceId,\n verification?.userHash,\n scriptLoaded,\n window.location.pathname,\n identified,\n ])\n\n // load messenger widget once verification is done loading\n // we don't need verification but we should use it if we have it\n useEffect(() => {\n // wait for script to be loaded and verification to finish loading\n if (isLoadingVerification || !scriptLoaded) return\n\n // initialize the messenger widget\n initializeMessenger()\n }, [verification, isLoadingVerification, scriptLoaded])\n\n const openFeedback: FeedbackContextType['openFeedback'] = () => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'openFeedbackWidget',\n },\n })\n }\n\n const openPortal = (\n page:\n | 'MainView'\n | 'RoadmapView'\n | 'CreatePost'\n | 'PostsView'\n | 'ChangelogView'\n | 'HelpView' = 'MainView',\n articleId?: string,\n ) => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'changePage',\n payload: page,\n openWidget: true,\n ...(articleId && { articleId }),\n },\n })\n }\n\n const [messengerVisibility, setMessengerVisibility] = useState(false)\n const supportElement = document.getElementById('fb-messenger-root')\n\n const setSupportDisplay = (show: boolean) =>\n supportElement instanceof HTMLElement &&\n (supportElement.style.display = show ? 'block' : 'none')\n\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n setSupportDisplay(messengerVisibility)\n }, [scriptLoaded, messengerLoaded, messengerVisibility])\n\n // when the messenger is hidden, we need to hide the root element again\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('onHide', function () {\n // hide the messenger root element\n setMessengerVisibility(false)\n })\n }\n }, [scriptLoaded, messengerLoaded])\n\n const openSupport: FeedbackContextType['openSupport'] = (page = 'Home', id) => {\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n window.alert('Featurebase SDK is not loaded yet. Please try again later.')\n console.warn('Featurebase SDK is not loaded yet.')\n return\n }\n\n if (messengerVisibility) {\n // if the messenger is already visible, close it\n win.Featurebase('hide')\n setMessengerVisibility(false)\n return\n }\n\n // ensure the messenger is visible\n setMessengerVisibility(true)\n\n switch (page) {\n case 'Home':\n // Show messenger home\n win.Featurebase('show')\n break\n case 'Messages':\n // Show messages view\n win.Featurebase('show', 'messages')\n break\n case 'Changelog':\n // Show changelog view\n win.Featurebase('show', 'changelog')\n break\n case 'Help':\n // Open help center\n win.Featurebase('show', 'help')\n break\n case 'ShowArticle':\n // Open a specific help article\n if (id) win.Featurebase('showArticle', id)\n else win.Featurebase('show', 'help')\n break\n case 'NewMessage':\n // Open new message dialog\n win.Featurebase('showNewMessage', id)\n break\n default:\n // Default to showing the main widget\n win.Featurebase('show')\n break\n }\n }\n\n return (\n <FeedbackContext.Provider\n value={{\n openSupport,\n openFeedback,\n openPortal,\n messengerLoaded,\n unreadCount,\n messengerVisibility,\n setMessengerVisibility,\n loaded: scriptLoaded,\n }}\n >\n {children}\n </FeedbackContext.Provider>\n )\n}\n\nexport const useFeedback = (): FeedbackContextType => {\n const context = useContext(FeedbackContext)\n if (!context) {\n throw new Error('useFeedback must be used within a FeedbackProvider')\n }\n return context\n}\n"],"names":["unreadCount","_a","_b","jsx"],"mappings":"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"}
@@ -173,6 +173,10 @@ require("../../containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating
173
173
  require("../../containers/Actions/Actions.styled.cjs.js");
174
174
  require("../../containers/Actions/ActionsDropdown/ActionsDropdown.cjs.js");
175
175
  require("../../containers/Actions/ActionIcon.cjs.js");
176
+ require("../../containers/Views/context/ViewsContext.cjs.js");
177
+ require("../../containers/Views/Views.styled.cjs.js");
178
+ require("../../containers/Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");
179
+ require("../../containers/Views/ViewsMenu/ViewsMenu.cjs.js");
176
180
  require("../EntityPanelUploader/EntityPanelUploader.styled.cjs.js");
177
181
  require("../SimpleFormDialog/SimpleFormDialog.cjs.js");
178
182
  require("../EntityPath/EntityPath.styled.cjs.js");
@@ -192,9 +196,6 @@ require("../VersionUploader/components/UploadVersionDialog.cjs.js");
192
196
  require("../VersionUploader/context/VersionUploadContext.cjs.js");
193
197
  const FeedbackContext = require("../Feedback/FeedbackContext.cjs.js");
194
198
  require("../Feedback/SupportBubble.cjs.js");
195
- require("../Views/context/ViewsContext.cjs.js");
196
- require("../Views/Views.styled.cjs.js");
197
- require("../Views/ViewsMenuContainer/ViewsMenuContainer.cjs.js");
198
199
  const PowerpackDialog = ({
199
200
  label,
200
201
  description,
@@ -1 +1 @@
1
- {"version":3,"file":"PowerpackDialog.cjs.js","sources":["../../../../../src/components/Powerpack/PowerpackDialog.tsx"],"sourcesContent":["import * as Styled from './PowerpackDialog.styled'\nimport { FC } from 'react'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { PricingLink } from './PricingLink'\nimport { powerpackFeatures, usePowerpack } from '@shared/context'\nimport type { PowerpackDialogType } from '@shared/context/PowerpackContext'\nimport { useFeedback } from '@shared/components'\nimport { CTAButton } from './CTAButton'\n\nexport interface PowerpackDialogProps {\n label?: string\n description?: string\n features?: Record<string, Pick<PowerpackDialogType, 'bullet' | 'icon'>>\n isCloseable?: boolean\n addon?: {\n icon: string\n }\n}\n\nexport const PowerpackDialog: FC<PowerpackDialogProps> = ({\n label,\n description,\n features,\n isCloseable = true,\n addon,\n}) => {\n const { setPowerpackDialog, selectedPowerPack, powerpackDialog } = usePowerpack()\n const { openSupport, messengerLoaded } = useFeedback()\n\n if (!powerpackDialog && (!label || !description)) return null\n\n // Dynamic support message\n const featureLabel =\n label ?? powerpackDialog?.label ?? (addon ? 'this addon' : 'this feature')\n const SUPPORT_MESSAGE = addon\n ? `I would like to know how I can try out the \"${featureLabel}\" addon?`\n : `I would like to know how I can try out the \"${featureLabel}\" power feature?`\n\n return (\n <Styled.PowerpackDialog\n isOpen\n onClose={() => (isCloseable ? setPowerpackDialog(null) : undefined)}\n size=\"lg\"\n hideCancelButton={!isCloseable}\n hideBackdrop={!isCloseable}\n >\n <Styled.MainFeature>\n <h1>\n <Icon icon={addon?.icon ? addon.icon : 'bolt'} />\n {label ?? powerpackDialog?.label}\n </h1>\n <h2>{description ?? powerpackDialog?.description}</h2>\n </Styled.MainFeature>\n\n <Styled.FeaturesList>\n {addon ? (\n <h3>\n Unlock all <span className=\"green\">Premium Addons</span> with an AYON Studio\n subscription.\n </h3>\n ) : (\n <h3>\n Unlock all <Icon icon=\"bolt\" /> <span className=\"green\">Power Features</span> with an\n AYON subscription.\n </h3>\n )}\n <ul>\n {Object.entries(features ?? powerpackFeatures)\n .sort(([key]) => (key !== selectedPowerPack ? 1 : -1))\n .map(([key, value]) => (\n <li key={key}>\n <Icon icon={value.icon ?? 'check'} />\n <span>{value.bullet}</span>\n </li>\n ))}\n </ul>\n </Styled.FeaturesList>\n {messengerLoaded ? (\n <CTAButton onClick={() => openSupport('NewMessage', SUPPORT_MESSAGE)} />\n ) : (\n <PricingLink>\n <CTAButton />\n </PricingLink>\n )}\n </Styled.PowerpackDialog>\n )\n}\n"],"names":["usePowerpack","useFeedback","jsxs","Styled.PowerpackDialog","Styled.MainFeature","jsx","Icon","Styled.FeaturesList","powerpackFeatures","CTAButton","PricingLink"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACF,MAAM;AACJ,QAAM,EAAE,oBAAoB,mBAAmB,gBAAA,IAAoBA,iBAAAA,aAAa;AAChF,QAAM,EAAE,aAAa,gBAAgB,IAAIC,4BAAY;AAErD,MAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,aAAqB,QAAA;AAGzD,QAAM,eACJ,UAAS,mDAAiB,WAAU,QAAQ,eAAe;AAC7D,QAAM,kBAAkB,QACpB,+CAA+C,YAAY,aAC3D,+CAA+C,YAAY;AAG7D,SAAAC,2BAAA,kBAAA;AAAA,IAACC,uBAAO;AAAA,IAAP;AAAA,MACC,QAAM;AAAA,MACN,SAAS,MAAO,cAAc,mBAAmB,IAAI,IAAI;AAAA,MACzD,MAAK;AAAA,MACL,kBAAkB,CAAC;AAAA,MACnB,cAAc,CAAC;AAAA,MAEf,UAAA;AAAA,QAACD,kDAAAE,uBAAAA,aAAA,EACC,UAAA;AAAA,UAAAF,kDAAC,MACC,EAAA,UAAA;AAAA,YAAAG,iDAACC,oBAAAA,QAAK,OAAM,+BAAO,QAAO,MAAM,OAAO,QAAQ;AAAA,YAC9C,UAAS,mDAAiB;AAAA,UAAA,GAC7B;AAAA,UACCD,2BAAA,kBAAA,IAAA,MAAA,EAAI,UAAe,gBAAA,mDAAiB,aAAY,CAAA;AAAA,QAAA,GACnD;AAAA,QAEAH,kDAACK,uBAAAA,cAAA,EACE,UAAA;AAAA,UAAA,0DACE,MAAG,EAAA,UAAA;AAAA,YAAA;AAAA,YACUF,2BAAA,kBAAA,IAAA,QAAA,EAAK,WAAU,SAAQ,UAAc,kBAAA;AAAA,YAAO;AAAA,UAE1D,EAAA,CAAA,sDAEC,MAAG,EAAA,UAAA;AAAA,YAAA;AAAA,YACSA,2BAAAA,kBAAAA,IAACC,oBAAK,MAAA,EAAA,MAAK,OAAO,CAAA;AAAA,YAAE;AAAA,YAAED,2BAAA,kBAAA,IAAA,QAAA,EAAK,WAAU,SAAQ,UAAc,kBAAA;AAAA,YAAO;AAAA,UAAA,GAE/E;AAAA,UAEFA,2BAAAA,kBAAAA,IAAC,MACE,EAAA,UAAA,OAAO,QAAQ,YAAYG,kCAAiB,EAC1C,KAAK,CAAC,CAAC,GAAG,MAAO,QAAQ,oBAAoB,IAAI,EAAG,EACpD,IAAI,CAAC,CAAC,KAAK,KAAK,MACfN,2BAAAA,kBAAAA,KAAC,MACC,EAAA,UAAA;AAAA,YAAAG,2BAAA,kBAAA,IAACC,oBAAK,MAAA,EAAA,MAAM,MAAM,QAAQ,SAAS;AAAA,YACnCD,2BAAAA,kBAAAA,IAAC,QAAM,EAAA,UAAA,MAAM,OAAO,CAAA;AAAA,UAAA,EAFb,GAAA,GAGT,CACD,EACL,CAAA;AAAA,QAAA,GACF;AAAA,QACC,kBACCA,2BAAA,kBAAA,IAACI,qBAAU,EAAA,SAAS,MAAM,YAAY,cAAc,eAAe,EAAG,CAAA,IAEtEJ,2BAAAA,kBAAAA,IAACK,YAAAA,aACC,EAAA,UAAAL,2BAAAA,kBAAAA,IAACI,UAAAA,aAAU,EACb,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEJ;AAEJ;;"}
1
+ {"version":3,"file":"PowerpackDialog.cjs.js","sources":["../../../../../src/components/Powerpack/PowerpackDialog.tsx"],"sourcesContent":["import * as Styled from './PowerpackDialog.styled'\nimport { FC } from 'react'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { PricingLink } from './PricingLink'\nimport { powerpackFeatures, usePowerpack } from '@shared/context'\nimport type { PowerpackDialogType } from '@shared/context/PowerpackContext'\nimport { useFeedback } from '@shared/components'\nimport { CTAButton } from './CTAButton'\n\nexport interface PowerpackDialogProps {\n label?: string\n description?: string\n features?: Record<string, Pick<PowerpackDialogType, 'bullet' | 'icon'>>\n isCloseable?: boolean\n addon?: {\n icon: string\n }\n}\n\nexport const PowerpackDialog: FC<PowerpackDialogProps> = ({\n label,\n description,\n features,\n isCloseable = true,\n addon,\n}) => {\n const { setPowerpackDialog, selectedPowerPack, powerpackDialog } = usePowerpack()\n const { openSupport, messengerLoaded } = useFeedback()\n\n if (!powerpackDialog && (!label || !description)) return null\n\n // Dynamic support message\n const featureLabel =\n label ?? powerpackDialog?.label ?? (addon ? 'this addon' : 'this feature')\n const SUPPORT_MESSAGE = addon\n ? `I would like to know how I can try out the \"${featureLabel}\" addon?`\n : `I would like to know how I can try out the \"${featureLabel}\" power feature?`\n\n return (\n <Styled.PowerpackDialog\n isOpen\n onClose={() => (isCloseable ? setPowerpackDialog(null) : undefined)}\n size=\"lg\"\n hideCancelButton={!isCloseable}\n hideBackdrop={!isCloseable}\n >\n <Styled.MainFeature>\n <h1>\n <Icon icon={addon?.icon ? addon.icon : 'bolt'} />\n {label ?? powerpackDialog?.label}\n </h1>\n <h2>{description ?? powerpackDialog?.description}</h2>\n </Styled.MainFeature>\n\n <Styled.FeaturesList>\n {addon ? (\n <h3>\n Unlock all <span className=\"green\">Premium Addons</span> with an AYON Studio\n subscription.\n </h3>\n ) : (\n <h3>\n Unlock all <Icon icon=\"bolt\" /> <span className=\"green\">Power Features</span> with an\n AYON subscription.\n </h3>\n )}\n <ul>\n {Object.entries(features ?? powerpackFeatures)\n .sort(([key]) => (key !== selectedPowerPack ? 1 : -1))\n .map(([key, value]) => (\n <li key={key}>\n <Icon icon={value.icon ?? 'check'} />\n <span>{value.bullet}</span>\n </li>\n ))}\n </ul>\n </Styled.FeaturesList>\n {messengerLoaded ? (\n <CTAButton onClick={() => openSupport('NewMessage', SUPPORT_MESSAGE)} />\n ) : (\n <PricingLink>\n <CTAButton />\n </PricingLink>\n )}\n </Styled.PowerpackDialog>\n )\n}\n"],"names":["usePowerpack","useFeedback","jsxs","Styled.PowerpackDialog","Styled.MainFeature","jsx","Icon","Styled.FeaturesList","powerpackFeatures","CTAButton","PricingLink"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACF,MAAM;AACJ,QAAM,EAAE,oBAAoB,mBAAmB,gBAAA,IAAoBA,iBAAAA,aAAa;AAChF,QAAM,EAAE,aAAa,gBAAgB,IAAIC,4BAAY;AAErD,MAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,aAAqB,QAAA;AAGzD,QAAM,eACJ,UAAS,mDAAiB,WAAU,QAAQ,eAAe;AAC7D,QAAM,kBAAkB,QACpB,+CAA+C,YAAY,aAC3D,+CAA+C,YAAY;AAG7D,SAAAC,2BAAA,kBAAA;AAAA,IAACC,uBAAO;AAAA,IAAP;AAAA,MACC,QAAM;AAAA,MACN,SAAS,MAAO,cAAc,mBAAmB,IAAI,IAAI;AAAA,MACzD,MAAK;AAAA,MACL,kBAAkB,CAAC;AAAA,MACnB,cAAc,CAAC;AAAA,MAEf,UAAA;AAAA,QAACD,kDAAAE,uBAAAA,aAAA,EACC,UAAA;AAAA,UAAAF,kDAAC,MACC,EAAA,UAAA;AAAA,YAAAG,iDAACC,oBAAAA,QAAK,OAAM,+BAAO,QAAO,MAAM,OAAO,QAAQ;AAAA,YAC9C,UAAS,mDAAiB;AAAA,UAAA,GAC7B;AAAA,UACCD,2BAAA,kBAAA,IAAA,MAAA,EAAI,UAAe,gBAAA,mDAAiB,aAAY,CAAA;AAAA,QAAA,GACnD;AAAA,QAEAH,kDAACK,uBAAAA,cAAA,EACE,UAAA;AAAA,UAAA,0DACE,MAAG,EAAA,UAAA;AAAA,YAAA;AAAA,YACUF,2BAAA,kBAAA,IAAA,QAAA,EAAK,WAAU,SAAQ,UAAc,kBAAA;AAAA,YAAO;AAAA,UAE1D,EAAA,CAAA,sDAEC,MAAG,EAAA,UAAA;AAAA,YAAA;AAAA,YACSA,2BAAAA,kBAAAA,IAACC,oBAAK,MAAA,EAAA,MAAK,OAAO,CAAA;AAAA,YAAE;AAAA,YAAED,2BAAA,kBAAA,IAAA,QAAA,EAAK,WAAU,SAAQ,UAAc,kBAAA;AAAA,YAAO;AAAA,UAAA,GAE/E;AAAA,UAEFA,2BAAAA,kBAAAA,IAAC,MACE,EAAA,UAAA,OAAO,QAAQ,YAAYG,kCAAiB,EAC1C,KAAK,CAAC,CAAC,GAAG,MAAO,QAAQ,oBAAoB,IAAI,EAAG,EACpD,IAAI,CAAC,CAAC,KAAK,KAAK,MACfN,2BAAAA,kBAAAA,KAAC,MACC,EAAA,UAAA;AAAA,YAAAG,2BAAA,kBAAA,IAACC,oBAAK,MAAA,EAAA,MAAM,MAAM,QAAQ,SAAS;AAAA,YACnCD,2BAAAA,kBAAAA,IAAC,QAAM,EAAA,UAAA,MAAM,OAAO,CAAA;AAAA,UAAA,EAFb,GAAA,GAGT,CACD,EACL,CAAA;AAAA,QAAA,GACF;AAAA,QACC,kBACCA,2BAAA,kBAAA,IAACI,qBAAU,EAAA,SAAS,MAAM,YAAY,cAAc,eAAe,EAAG,CAAA,IAEtEJ,2BAAAA,kBAAAA,IAACK,YAAAA,aACC,EAAA,UAAAL,2BAAAA,kBAAAA,IAACI,UAAAA,aAAU,EACb,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEJ;AAEJ;;"}
@@ -171,6 +171,10 @@ import "../../containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.
171
171
  import "../../containers/Actions/Actions.styled.es.js";
172
172
  import "../../containers/Actions/ActionsDropdown/ActionsDropdown.es.js";
173
173
  import "../../containers/Actions/ActionIcon.es.js";
174
+ import "../../containers/Views/context/ViewsContext.es.js";
175
+ import "../../containers/Views/Views.styled.es.js";
176
+ import "../../containers/Views/ViewsMenuContainer/ViewsMenuContainer.es.js";
177
+ import "../../containers/Views/ViewsMenu/ViewsMenu.es.js";
174
178
  import "../EntityPanelUploader/EntityPanelUploader.styled.es.js";
175
179
  import "../SimpleFormDialog/SimpleFormDialog.es.js";
176
180
  import "../EntityPath/EntityPath.styled.es.js";
@@ -190,9 +194,6 @@ import "../VersionUploader/components/UploadVersionDialog.es.js";
190
194
  import "../VersionUploader/context/VersionUploadContext.es.js";
191
195
  import { useFeedback } from "../Feedback/FeedbackContext.es.js";
192
196
  import "../Feedback/SupportBubble.es.js";
193
- import "../Views/context/ViewsContext.es.js";
194
- import "../Views/Views.styled.es.js";
195
- import "../Views/ViewsMenuContainer/ViewsMenuContainer.es.js";
196
197
  const PowerpackDialog = ({
197
198
  label,
198
199
  description,