@ynput/ayon-frontend-shared 0.2.14 → 0.2.16

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 (668) hide show
  1. package/dist/DetailsPanel.cjs.js +10 -0
  2. package/dist/DetailsPanel.cjs.js.map +1 -1
  3. package/dist/DetailsPanel.es.js +10 -0
  4. package/dist/DetailsPanel.es.js.map +1 -1
  5. package/dist/ProjectTreeTable.cjs.js +39 -1
  6. package/dist/ProjectTreeTable.cjs.js.map +1 -1
  7. package/dist/ProjectTreeTable.es.js +41 -3
  8. package/dist/ProjectTreeTable.es.js.map +1 -1
  9. package/dist/_virtual/index.cjs10.js +4 -4
  10. package/dist/_virtual/index.cjs5.js +3 -5
  11. package/dist/_virtual/index.cjs5.js.map +1 -1
  12. package/dist/_virtual/index.cjs6.js +5 -3
  13. package/dist/_virtual/index.cjs6.js.map +1 -1
  14. package/dist/_virtual/index.cjs8.js +4 -4
  15. package/dist/_virtual/index.cjs9.js +4 -4
  16. package/dist/_virtual/index.es10.js +4 -4
  17. package/dist/_virtual/index.es5.js +2 -5
  18. package/dist/_virtual/index.es5.js.map +1 -1
  19. package/dist/_virtual/index.es6.js +5 -2
  20. package/dist/_virtual/index.es6.js.map +1 -1
  21. package/dist/_virtual/index.es8.js +4 -4
  22. package/dist/_virtual/index.es9.js +4 -4
  23. package/dist/api.cjs.js +7 -0
  24. package/dist/api.cjs.js.map +1 -1
  25. package/dist/api.es.js +9 -2
  26. package/dist/api.es.js.map +1 -1
  27. package/dist/components.cjs.js +12 -0
  28. package/dist/components.cjs.js.map +1 -1
  29. package/dist/components.es.js +12 -0
  30. package/dist/components.es.js.map +1 -1
  31. package/dist/context.cjs.js +4 -0
  32. package/dist/context.cjs.js.map +1 -1
  33. package/dist/context.es.js +4 -0
  34. package/dist/context.es.js.map +1 -1
  35. package/dist/index.cjs.js +10 -0
  36. package/dist/index.cjs.js.map +1 -1
  37. package/dist/index.es.js +10 -0
  38. package/dist/index.es.js.map +1 -1
  39. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +2 -2
  40. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  41. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  42. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  43. package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js +1 -1
  44. package/dist/node_modules/rehype-prism-plus/dist/index.es.es.js +1 -1
  45. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  46. package/dist/node_modules/remove-accents/index.es.js +1 -1
  47. package/dist/node_modules/vfile/lib/index.cjs.js +1 -1
  48. package/dist/node_modules/vfile/lib/index.es.js +1 -1
  49. package/dist/shared/src/api/generated/actions.cjs.js.map +1 -1
  50. package/dist/shared/src/api/generated/actions.es.js.map +1 -1
  51. package/dist/shared/src/api/generated/addons.cjs.js.map +1 -1
  52. package/dist/shared/src/api/generated/addons.es.js.map +1 -1
  53. package/dist/shared/src/api/generated/anatomy.cjs.js.map +1 -1
  54. package/dist/shared/src/api/generated/anatomy.es.js.map +1 -1
  55. package/dist/shared/src/api/generated/attributes.cjs.js.map +1 -1
  56. package/dist/shared/src/api/generated/attributes.es.js.map +1 -1
  57. package/dist/shared/src/api/generated/configuration.cjs.js.map +1 -1
  58. package/dist/shared/src/api/generated/configuration.es.js.map +1 -1
  59. package/dist/shared/src/api/generated/entityLists.cjs.js.map +1 -1
  60. package/dist/shared/src/api/generated/entityLists.es.js.map +1 -1
  61. package/dist/shared/src/api/generated/events.cjs.js.map +1 -1
  62. package/dist/shared/src/api/generated/events.es.js.map +1 -1
  63. package/dist/shared/src/api/generated/files.cjs.js +5 -0
  64. package/dist/shared/src/api/generated/files.cjs.js.map +1 -1
  65. package/dist/shared/src/api/generated/files.es.js +5 -0
  66. package/dist/shared/src/api/generated/files.es.js.map +1 -1
  67. package/dist/shared/src/api/generated/graphql.cjs.js +24 -0
  68. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  69. package/dist/shared/src/api/generated/graphql.es.js +24 -0
  70. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  71. package/dist/shared/src/api/generated/grouping.cjs.js +18 -0
  72. package/dist/shared/src/api/generated/grouping.cjs.js.map +1 -0
  73. package/dist/shared/src/api/generated/grouping.es.js +18 -0
  74. package/dist/shared/src/api/generated/grouping.es.js.map +1 -0
  75. package/dist/shared/src/api/generated/operations.cjs.js.map +1 -1
  76. package/dist/shared/src/api/generated/operations.es.js.map +1 -1
  77. package/dist/shared/src/api/generated/projects.cjs.js +16 -0
  78. package/dist/shared/src/api/generated/projects.cjs.js.map +1 -1
  79. package/dist/shared/src/api/generated/projects.es.js +16 -0
  80. package/dist/shared/src/api/generated/projects.es.js.map +1 -1
  81. package/dist/shared/src/api/generated/reviewables.cjs.js.map +1 -1
  82. package/dist/shared/src/api/generated/reviewables.es.js.map +1 -1
  83. package/dist/shared/src/api/generated/system.cjs.js.map +1 -1
  84. package/dist/shared/src/api/generated/system.es.js.map +1 -1
  85. package/dist/shared/src/api/generated/tasks.cjs.js.map +1 -1
  86. package/dist/shared/src/api/generated/tasks.es.js.map +1 -1
  87. package/dist/shared/src/api/generated/users.cjs.js.map +1 -1
  88. package/dist/shared/src/api/generated/users.es.js.map +1 -1
  89. package/dist/shared/src/api/queries/actions/getActions.cjs.js +1 -0
  90. package/dist/shared/src/api/queries/actions/getActions.cjs.js.map +1 -1
  91. package/dist/shared/src/api/queries/actions/getActions.es.js +1 -0
  92. package/dist/shared/src/api/queries/actions/getActions.es.js.map +1 -1
  93. package/dist/shared/src/api/queries/activities/getActivities.cjs.js +1 -0
  94. package/dist/shared/src/api/queries/activities/getActivities.cjs.js.map +1 -1
  95. package/dist/shared/src/api/queries/activities/getActivities.es.js +1 -0
  96. package/dist/shared/src/api/queries/activities/getActivities.es.js.map +1 -1
  97. package/dist/shared/src/api/queries/activities/getMentions.cjs.js +1 -0
  98. package/dist/shared/src/api/queries/activities/getMentions.cjs.js.map +1 -1
  99. package/dist/shared/src/api/queries/activities/getMentions.es.js +1 -0
  100. package/dist/shared/src/api/queries/activities/getMentions.es.js.map +1 -1
  101. package/dist/shared/src/api/queries/activities/updateReaction.cjs.js +1 -0
  102. package/dist/shared/src/api/queries/activities/updateReaction.cjs.js.map +1 -1
  103. package/dist/shared/src/api/queries/activities/updateReaction.es.js +1 -0
  104. package/dist/shared/src/api/queries/activities/updateReaction.es.js.map +1 -1
  105. package/dist/shared/src/api/queries/addons/getAddons.cjs.js +1 -0
  106. package/dist/shared/src/api/queries/addons/getAddons.cjs.js.map +1 -1
  107. package/dist/shared/src/api/queries/addons/getAddons.es.js +1 -0
  108. package/dist/shared/src/api/queries/addons/getAddons.es.js.map +1 -1
  109. package/dist/shared/src/api/queries/attributes/getAttributes.cjs.js +1 -0
  110. package/dist/shared/src/api/queries/attributes/getAttributes.cjs.js.map +1 -1
  111. package/dist/shared/src/api/queries/attributes/getAttributes.es.js +1 -0
  112. package/dist/shared/src/api/queries/attributes/getAttributes.es.js.map +1 -1
  113. package/dist/shared/src/api/queries/authentication/getAuthentication.cjs.js +1 -0
  114. package/dist/shared/src/api/queries/authentication/getAuthentication.cjs.js.map +1 -1
  115. package/dist/shared/src/api/queries/authentication/getAuthentication.es.js +1 -0
  116. package/dist/shared/src/api/queries/authentication/getAuthentication.es.js.map +1 -1
  117. package/dist/shared/src/api/queries/entities/getEntity.cjs.js +1 -0
  118. package/dist/shared/src/api/queries/entities/getEntity.cjs.js.map +1 -1
  119. package/dist/shared/src/api/queries/entities/getEntity.es.js +1 -0
  120. package/dist/shared/src/api/queries/entities/getEntity.es.js.map +1 -1
  121. package/dist/shared/src/api/queries/entities/getEntityPanel.cjs.js +1 -0
  122. package/dist/shared/src/api/queries/entities/getEntityPanel.cjs.js.map +1 -1
  123. package/dist/shared/src/api/queries/entities/getEntityPanel.es.js +1 -0
  124. package/dist/shared/src/api/queries/entities/getEntityPanel.es.js.map +1 -1
  125. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js +2 -0
  126. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js.map +1 -1
  127. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js +2 -0
  128. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js.map +1 -1
  129. package/dist/shared/src/api/queries/entities/updateEntity.cjs.js +2 -0
  130. package/dist/shared/src/api/queries/entities/updateEntity.cjs.js.map +1 -1
  131. package/dist/shared/src/api/queries/entities/updateEntity.es.js +2 -0
  132. package/dist/shared/src/api/queries/entities/updateEntity.es.js.map +1 -1
  133. package/dist/shared/src/api/queries/entityLists/getLists.cjs.js +1 -0
  134. package/dist/shared/src/api/queries/entityLists/getLists.cjs.js.map +1 -1
  135. package/dist/shared/src/api/queries/entityLists/getLists.es.js +1 -0
  136. package/dist/shared/src/api/queries/entityLists/getLists.es.js.map +1 -1
  137. package/dist/shared/src/api/queries/entityLists/getListsAttributes.cjs.js +1 -0
  138. package/dist/shared/src/api/queries/entityLists/getListsAttributes.cjs.js.map +1 -1
  139. package/dist/shared/src/api/queries/entityLists/getListsAttributes.es.js +1 -0
  140. package/dist/shared/src/api/queries/entityLists/getListsAttributes.es.js.map +1 -1
  141. package/dist/shared/src/api/queries/entityLists/updateLists.cjs.js +1 -0
  142. package/dist/shared/src/api/queries/entityLists/updateLists.cjs.js.map +1 -1
  143. package/dist/shared/src/api/queries/entityLists/updateLists.es.js +1 -0
  144. package/dist/shared/src/api/queries/entityLists/updateLists.es.js.map +1 -1
  145. package/dist/shared/src/api/queries/folders/getFolders.cjs.js +1 -0
  146. package/dist/shared/src/api/queries/folders/getFolders.cjs.js.map +1 -1
  147. package/dist/shared/src/api/queries/folders/getFolders.es.js +1 -0
  148. package/dist/shared/src/api/queries/folders/getFolders.es.js.map +1 -1
  149. package/dist/shared/src/api/queries/grouping/getGrouping.cjs.js +47 -0
  150. package/dist/shared/src/api/queries/grouping/getGrouping.cjs.js.map +1 -0
  151. package/dist/shared/src/api/queries/grouping/getGrouping.es.js +47 -0
  152. package/dist/shared/src/api/queries/grouping/getGrouping.es.js.map +1 -0
  153. package/dist/shared/src/api/queries/overview/getOverview.cjs.js +64 -3
  154. package/dist/shared/src/api/queries/overview/getOverview.cjs.js.map +1 -1
  155. package/dist/shared/src/api/queries/overview/getOverview.es.js +64 -3
  156. package/dist/shared/src/api/queries/overview/getOverview.es.js.map +1 -1
  157. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js +2 -0
  158. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js.map +1 -1
  159. package/dist/shared/src/api/queries/overview/updateOverview.es.js +2 -0
  160. package/dist/shared/src/api/queries/overview/updateOverview.es.js.map +1 -1
  161. package/dist/shared/src/api/queries/permissions/getPermissions.cjs.js +1 -0
  162. package/dist/shared/src/api/queries/permissions/getPermissions.cjs.js.map +1 -1
  163. package/dist/shared/src/api/queries/permissions/getPermissions.es.js +1 -0
  164. package/dist/shared/src/api/queries/permissions/getPermissions.es.js.map +1 -1
  165. package/dist/shared/src/api/queries/project/getProject.cjs.js +1 -0
  166. package/dist/shared/src/api/queries/project/getProject.cjs.js.map +1 -1
  167. package/dist/shared/src/api/queries/project/getProject.es.js +1 -0
  168. package/dist/shared/src/api/queries/project/getProject.es.js.map +1 -1
  169. package/dist/shared/src/api/queries/review/getReview.cjs.js +1 -0
  170. package/dist/shared/src/api/queries/review/getReview.cjs.js.map +1 -1
  171. package/dist/shared/src/api/queries/review/getReview.es.js +1 -0
  172. package/dist/shared/src/api/queries/review/getReview.es.js.map +1 -1
  173. package/dist/shared/src/api/queries/review/updateReview.cjs.js +1 -0
  174. package/dist/shared/src/api/queries/review/updateReview.cjs.js.map +1 -1
  175. package/dist/shared/src/api/queries/review/updateReview.es.js +1 -0
  176. package/dist/shared/src/api/queries/review/updateReview.es.js.map +1 -1
  177. package/dist/shared/src/api/queries/system/getSystem.cjs.js +1 -0
  178. package/dist/shared/src/api/queries/system/getSystem.cjs.js.map +1 -1
  179. package/dist/shared/src/api/queries/system/getSystem.es.js +1 -0
  180. package/dist/shared/src/api/queries/system/getSystem.es.js.map +1 -1
  181. package/dist/shared/src/api/queries/userDashboard/getUserDashboard.cjs.js +1 -0
  182. package/dist/shared/src/api/queries/userDashboard/getUserDashboard.cjs.js.map +1 -1
  183. package/dist/shared/src/api/queries/userDashboard/getUserDashboard.es.js +1 -0
  184. package/dist/shared/src/api/queries/userDashboard/getUserDashboard.es.js.map +1 -1
  185. package/dist/shared/src/api/queries/users/getUsers.cjs.js +2 -0
  186. package/dist/shared/src/api/queries/users/getUsers.cjs.js.map +1 -1
  187. package/dist/shared/src/api/queries/users/getUsers.es.js +2 -0
  188. package/dist/shared/src/api/queries/users/getUsers.es.js.map +1 -1
  189. package/dist/shared/src/api/queries/users/updateUsers.cjs.js +1 -0
  190. package/dist/shared/src/api/queries/users/updateUsers.cjs.js.map +1 -1
  191. package/dist/shared/src/api/queries/users/updateUsers.es.js +1 -0
  192. package/dist/shared/src/api/queries/users/updateUsers.es.js.map +1 -1
  193. package/dist/shared/src/api/queries/watchers/getWatchers.cjs.js +1 -0
  194. package/dist/shared/src/api/queries/watchers/getWatchers.cjs.js.map +1 -1
  195. package/dist/shared/src/api/queries/watchers/getWatchers.es.js +1 -0
  196. package/dist/shared/src/api/queries/watchers/getWatchers.es.js.map +1 -1
  197. package/dist/shared/src/components/AttributeEditor/AttributeEditor.cjs.js +2 -2
  198. package/dist/shared/src/components/AttributeEditor/AttributeEditor.cjs.js.map +1 -1
  199. package/dist/shared/src/components/AttributeEditor/AttributeEditor.es.js +2 -2
  200. package/dist/shared/src/components/AttributeEditor/AttributeEditor.es.js.map +1 -1
  201. package/dist/shared/src/components/Badge/Badge.cjs.js +31 -0
  202. package/dist/shared/src/components/Badge/Badge.cjs.js.map +1 -0
  203. package/dist/shared/src/components/Badge/Badge.es.js +31 -0
  204. package/dist/shared/src/components/Badge/Badge.es.js.map +1 -0
  205. package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js +2 -0
  206. package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js.map +1 -1
  207. package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js +2 -0
  208. package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js.map +1 -1
  209. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js +2 -0
  210. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.cjs.js.map +1 -1
  211. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js +2 -0
  212. package/dist/shared/src/components/DetailsPanelAttributes/DetailsPanelAttributes.es.js.map +1 -1
  213. package/dist/shared/src/components/EntityPath/SegmentProvider.cjs.js +1 -0
  214. package/dist/shared/src/components/EntityPath/SegmentProvider.cjs.js.map +1 -1
  215. package/dist/shared/src/components/EntityPath/SegmentProvider.es.js +1 -0
  216. package/dist/shared/src/components/EntityPath/SegmentProvider.es.js.map +1 -1
  217. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js +10 -0
  218. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js.map +1 -1
  219. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js +10 -0
  220. package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js.map +1 -1
  221. package/dist/shared/src/components/Powerpack/PowerpackButton.cjs.js +69 -0
  222. package/dist/shared/src/components/Powerpack/PowerpackButton.cjs.js.map +1 -0
  223. package/dist/shared/src/components/Powerpack/PowerpackButton.es.js +69 -0
  224. package/dist/shared/src/components/Powerpack/PowerpackButton.es.js.map +1 -0
  225. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js +48 -0
  226. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js.map +1 -0
  227. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js +48 -0
  228. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js.map +1 -0
  229. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.cjs.js +102 -0
  230. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.cjs.js.map +1 -0
  231. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.es.js +102 -0
  232. package/dist/shared/src/components/Powerpack/PowerpackDialog.styled.es.js.map +1 -0
  233. package/dist/shared/src/components/Powerpack/PricingLink.cjs.js +13 -0
  234. package/dist/shared/src/components/Powerpack/PricingLink.cjs.js.map +1 -0
  235. package/dist/shared/src/components/Powerpack/PricingLink.es.js +13 -0
  236. package/dist/shared/src/components/Powerpack/PricingLink.es.js.map +1 -0
  237. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js +4 -10
  238. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js.map +1 -1
  239. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js +1 -7
  240. package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js.map +1 -1
  241. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +142 -3
  242. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
  243. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +142 -3
  244. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
  245. package/dist/shared/src/components/ProjectTableSettings/TableSettings.styled.cjs.js +13 -0
  246. package/dist/shared/src/components/ProjectTableSettings/TableSettings.styled.cjs.js.map +1 -0
  247. package/dist/shared/src/components/ProjectTableSettings/TableSettings.styled.es.js +13 -0
  248. package/dist/shared/src/components/ProjectTableSettings/TableSettings.styled.es.js.map +1 -0
  249. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js +50 -0
  250. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js.map +1 -0
  251. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js +50 -0
  252. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js.map +1 -0
  253. package/dist/shared/src/components/ReviewableProgressCard/ReviewableProgressCard.cjs.js +5 -1
  254. package/dist/shared/src/components/ReviewableProgressCard/ReviewableProgressCard.cjs.js.map +1 -1
  255. package/dist/shared/src/components/ReviewableProgressCard/ReviewableProgressCard.es.js +5 -1
  256. package/dist/shared/src/components/ReviewableProgressCard/ReviewableProgressCard.es.js.map +1 -1
  257. package/dist/shared/src/components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js +5 -5
  258. package/dist/shared/src/components/ReviewableProgressCard/ReviewableProgressCard.styled.cjs.js.map +1 -1
  259. package/dist/shared/src/components/ReviewableProgressCard/ReviewableProgressCard.styled.es.js +5 -5
  260. package/dist/shared/src/components/ReviewableProgressCard/ReviewableProgressCard.styled.es.js.map +1 -1
  261. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.cjs.js +2 -0
  262. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.cjs.js.map +1 -1
  263. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.es.js +2 -0
  264. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.es.js.map +1 -1
  265. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +100 -79
  266. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
  267. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +100 -79
  268. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
  269. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +94 -17
  270. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
  271. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +95 -18
  272. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
  273. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.styled.cjs.js +4 -0
  274. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.styled.cjs.js.map +1 -1
  275. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.styled.es.js +4 -0
  276. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.styled.es.js.map +1 -1
  277. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +10 -0
  278. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
  279. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +10 -0
  280. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
  281. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +8 -7
  282. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -1
  283. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +8 -7
  284. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js.map +1 -1
  285. package/dist/shared/src/components/SettingsPanel/SettingsPanel.cjs.js +6 -2
  286. package/dist/shared/src/components/SettingsPanel/SettingsPanel.cjs.js.map +1 -1
  287. package/dist/shared/src/components/SettingsPanel/SettingsPanel.es.js +6 -2
  288. package/dist/shared/src/components/SettingsPanel/SettingsPanel.es.js.map +1 -1
  289. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +223 -19
  290. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
  291. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +224 -20
  292. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
  293. package/dist/shared/src/components/Thumbnail/StackedThumbnails.cjs.js +1 -0
  294. package/dist/shared/src/components/Thumbnail/StackedThumbnails.cjs.js.map +1 -1
  295. package/dist/shared/src/components/Thumbnail/StackedThumbnails.es.js +1 -0
  296. package/dist/shared/src/components/Thumbnail/StackedThumbnails.es.js.map +1 -1
  297. package/dist/shared/src/components/Watchers/Watchers.cjs.js +2 -0
  298. package/dist/shared/src/components/Watchers/Watchers.cjs.js.map +1 -1
  299. package/dist/shared/src/components/Watchers/Watchers.es.js +2 -0
  300. package/dist/shared/src/components/Watchers/Watchers.es.js.map +1 -1
  301. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +10 -0
  302. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
  303. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +10 -0
  304. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
  305. package/dist/shared/src/containers/Actions/Actions.cjs.js +3 -0
  306. package/dist/shared/src/containers/Actions/Actions.cjs.js.map +1 -1
  307. package/dist/shared/src/containers/Actions/Actions.es.js +3 -0
  308. package/dist/shared/src/containers/Actions/Actions.es.js.map +1 -1
  309. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +10 -0
  310. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
  311. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +10 -0
  312. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
  313. package/dist/shared/src/containers/ContextMenu/ContextMenuItem.cjs.js +22 -0
  314. package/dist/shared/src/containers/ContextMenu/ContextMenuItem.cjs.js.map +1 -1
  315. package/dist/shared/src/containers/ContextMenu/ContextMenuItem.es.js +22 -0
  316. package/dist/shared/src/containers/ContextMenu/ContextMenuItem.es.js.map +1 -1
  317. package/dist/shared/src/containers/ContextMenu/useCreateContextMenu.cjs.js +26 -7
  318. package/dist/shared/src/containers/ContextMenu/useCreateContextMenu.cjs.js.map +1 -1
  319. package/dist/shared/src/containers/ContextMenu/useCreateContextMenu.es.js +26 -7
  320. package/dist/shared/src/containers/ContextMenu/useCreateContextMenu.es.js.map +1 -1
  321. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +10 -0
  322. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  323. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +10 -0
  324. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  325. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +19 -9
  326. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
  327. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +19 -9
  328. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
  329. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +10 -0
  330. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
  331. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +10 -0
  332. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
  333. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +11 -1
  334. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
  335. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +11 -1
  336. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
  337. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js +3 -0
  338. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js.map +1 -1
  339. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js +3 -0
  340. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js.map +1 -1
  341. package/dist/shared/src/containers/DetailsPanel/FeedWrapper.cjs.js +1 -0
  342. package/dist/shared/src/containers/DetailsPanel/FeedWrapper.cjs.js.map +1 -1
  343. package/dist/shared/src/containers/DetailsPanel/FeedWrapper.es.js +1 -0
  344. package/dist/shared/src/containers/DetailsPanel/FeedWrapper.es.js.map +1 -1
  345. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.cjs.js +2 -0
  346. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.cjs.js.map +1 -1
  347. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.es.js +2 -0
  348. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.es.js.map +1 -1
  349. package/dist/shared/src/containers/Feed/Feed.cjs.js +1 -0
  350. package/dist/shared/src/containers/Feed/Feed.cjs.js.map +1 -1
  351. package/dist/shared/src/containers/Feed/Feed.es.js +1 -0
  352. package/dist/shared/src/containers/Feed/Feed.es.js.map +1 -1
  353. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +1 -0
  354. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
  355. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +1 -0
  356. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
  357. package/dist/shared/src/containers/Feed/components/ActivityVersions/ActivityVersions.cjs.js +1 -0
  358. package/dist/shared/src/containers/Feed/components/ActivityVersions/ActivityVersions.cjs.js.map +1 -1
  359. package/dist/shared/src/containers/Feed/components/ActivityVersions/ActivityVersions.es.js +1 -0
  360. package/dist/shared/src/containers/Feed/components/ActivityVersions/ActivityVersions.es.js.map +1 -1
  361. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.cjs.js +1 -0
  362. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.cjs.js.map +1 -1
  363. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.es.js +1 -0
  364. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useAnnotationsSync.es.js.map +1 -1
  365. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useMentionLink.cjs.js +1 -0
  366. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useMentionLink.cjs.js.map +1 -1
  367. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useMentionLink.es.js +1 -0
  368. package/dist/shared/src/containers/Feed/components/CommentInput/hooks/useMentionLink.es.js.map +1 -1
  369. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.cjs.js +2 -1
  370. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.cjs.js.map +1 -1
  371. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.es.js +2 -1
  372. package/dist/shared/src/containers/Feed/components/FileUploadCard/FileUploadCard.es.js.map +1 -1
  373. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.cjs.js +8 -1
  374. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.cjs.js.map +1 -1
  375. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.es.js +9 -2
  376. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.es.js.map +1 -1
  377. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js +9 -0
  378. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.cjs.js.map +1 -1
  379. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.es.js +10 -1
  380. package/dist/shared/src/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.es.js.map +1 -1
  381. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js +1 -0
  382. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js.map +1 -1
  383. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js +1 -0
  384. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js.map +1 -1
  385. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js +3 -0
  386. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js.map +1 -1
  387. package/dist/shared/src/containers/Feed/context/FeedContext.es.js +3 -0
  388. package/dist/shared/src/containers/Feed/context/FeedContext.es.js.map +1 -1
  389. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.cjs.js +2 -0
  390. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.cjs.js.map +1 -1
  391. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.es.js +2 -0
  392. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.es.js.map +1 -1
  393. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +54 -26
  394. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  395. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +55 -27
  396. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  397. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js +7 -0
  398. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.cjs.js.map +1 -1
  399. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js +7 -0
  400. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.styled.es.js.map +1 -1
  401. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +53 -14
  402. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  403. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +53 -14
  404. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  405. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +205 -0
  406. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -0
  407. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +205 -0
  408. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -0
  409. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js +25 -12
  410. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.cjs.js.map +1 -1
  411. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js +25 -12
  412. package/dist/shared/src/containers/ProjectTreeTable/context/ClipboardContext.es.js.map +1 -1
  413. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.cjs.js +11 -1
  414. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.cjs.js.map +1 -1
  415. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.es.js +11 -1
  416. package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.es.js.map +1 -1
  417. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.cjs.js +2 -0
  418. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.cjs.js.map +1 -1
  419. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.es.js +2 -0
  420. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.es.js.map +1 -1
  421. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js +54 -10
  422. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js.map +1 -1
  423. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js +55 -11
  424. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js.map +1 -1
  425. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.cjs.js +137 -0
  426. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.cjs.js.map +1 -0
  427. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.es.js +137 -0
  428. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.es.js.map +1 -0
  429. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.cjs.js +1 -0
  430. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.cjs.js.map +1 -1
  431. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.es.js +1 -0
  432. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.es.js.map +1 -1
  433. package/dist/shared/src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.cjs.js +1 -1
  434. package/dist/shared/src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.cjs.js.map +1 -1
  435. package/dist/shared/src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.es.js +1 -1
  436. package/dist/shared/src/containers/ProjectTreeTable/context/clipboard/clipboardValidation.es.js.map +1 -1
  437. package/dist/shared/src/containers/ProjectTreeTable/hooks/useAttributesList.cjs.js +2 -0
  438. package/dist/shared/src/containers/ProjectTreeTable/hooks/useAttributesList.cjs.js.map +1 -1
  439. package/dist/shared/src/containers/ProjectTreeTable/hooks/useAttributesList.es.js +2 -0
  440. package/dist/shared/src/containers/ProjectTreeTable/hooks/useAttributesList.es.js.map +1 -1
  441. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +187 -0
  442. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -0
  443. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +187 -0
  444. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -0
  445. package/dist/shared/src/containers/ProjectTreeTable/hooks/{useOverviewTable.cjs.js → useBuildProjectDataTable.cjs.js} +4 -4
  446. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -0
  447. package/dist/shared/src/containers/ProjectTreeTable/hooks/{useOverviewTable.es.js → useBuildProjectDataTable.es.js} +4 -4
  448. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -0
  449. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js +64 -31
  450. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js.map +1 -1
  451. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js +64 -31
  452. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js.map +1 -1
  453. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnSorting.cjs.js +24 -0
  454. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnSorting.cjs.js.map +1 -0
  455. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnSorting.es.js +24 -0
  456. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnSorting.es.js.map +1 -0
  457. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.cjs.js +16 -9
  458. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.cjs.js.map +1 -1
  459. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.es.js +16 -9
  460. package/dist/shared/src/containers/ProjectTreeTable/hooks/useDeleteEntities.es.js.map +1 -1
  461. package/dist/shared/src/containers/ProjectTreeTable/hooks/useEntitiesMap.cjs.js +17 -0
  462. package/dist/shared/src/containers/ProjectTreeTable/hooks/useEntitiesMap.cjs.js.map +1 -0
  463. package/dist/shared/src/containers/ProjectTreeTable/hooks/useEntitiesMap.es.js +17 -0
  464. package/dist/shared/src/containers/ProjectTreeTable/hooks/useEntitiesMap.es.js.map +1 -0
  465. package/dist/shared/src/containers/ProjectTreeTable/hooks/useExpandedState.cjs.js +30 -0
  466. package/dist/shared/src/containers/ProjectTreeTable/hooks/useExpandedState.cjs.js.map +1 -0
  467. package/dist/shared/src/containers/ProjectTreeTable/hooks/useExpandedState.es.js +30 -0
  468. package/dist/shared/src/containers/ProjectTreeTable/hooks/useExpandedState.es.js.map +1 -0
  469. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +363 -0
  470. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -0
  471. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +363 -0
  472. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -0
  473. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetEntityTypeData.cjs.js +16 -12
  474. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetEntityTypeData.cjs.js.map +1 -1
  475. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetEntityTypeData.es.js +16 -13
  476. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetEntityTypeData.es.js.map +1 -1
  477. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js +239 -0
  478. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js.map +1 -0
  479. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js +239 -0
  480. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js.map +1 -0
  481. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetTaskGroups.cjs.js +82 -0
  482. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetTaskGroups.cjs.js.map +1 -0
  483. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetTaskGroups.es.js +82 -0
  484. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetTaskGroups.es.js.map +1 -0
  485. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +40 -0
  486. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -0
  487. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +40 -0
  488. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -0
  489. package/dist/shared/src/containers/ProjectTreeTable/hooks/useScopedAttributeFields.cjs.js +19 -0
  490. package/dist/shared/src/containers/ProjectTreeTable/hooks/useScopedAttributeFields.cjs.js.map +1 -0
  491. package/dist/shared/src/containers/ProjectTreeTable/hooks/useScopedAttributeFields.es.js +19 -0
  492. package/dist/shared/src/containers/ProjectTreeTable/hooks/useScopedAttributeFields.es.js.map +1 -0
  493. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSelectedFolders.cjs.js +26 -0
  494. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSelectedFolders.cjs.js.map +1 -0
  495. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSelectedFolders.es.js +26 -0
  496. package/dist/shared/src/containers/ProjectTreeTable/hooks/useSelectedFolders.es.js.map +1 -0
  497. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js +7 -4
  498. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js.map +1 -1
  499. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js +7 -4
  500. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js.map +1 -1
  501. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js +12 -1
  502. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js.map +1 -1
  503. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js +12 -1
  504. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js.map +1 -1
  505. package/dist/shared/src/containers/ProjectTreeTable/utils/clientFilterToQueryFilter.cjs.js.map +1 -1
  506. package/dist/shared/src/containers/ProjectTreeTable/utils/clientFilterToQueryFilter.es.js.map +1 -1
  507. package/dist/shared/src/containers/ProjectTreeTable/utils/errorExtraction.cjs.js +8 -0
  508. package/dist/shared/src/containers/ProjectTreeTable/utils/errorExtraction.cjs.js.map +1 -0
  509. package/dist/shared/src/containers/ProjectTreeTable/utils/errorExtraction.es.js +8 -0
  510. package/dist/shared/src/containers/ProjectTreeTable/utils/errorExtraction.es.js.map +1 -0
  511. package/dist/shared/src/containers/ProjectTreeTable/utils/localStorageKeys.cjs.js +7 -0
  512. package/dist/shared/src/containers/ProjectTreeTable/utils/localStorageKeys.cjs.js.map +1 -0
  513. package/dist/shared/src/containers/ProjectTreeTable/utils/localStorageKeys.es.js +7 -0
  514. package/dist/shared/src/containers/ProjectTreeTable/utils/localStorageKeys.es.js.map +1 -0
  515. package/dist/shared/src/containers/ProjectTreeTable/utils/validateUpdateEntities.cjs.js +0 -1
  516. package/dist/shared/src/containers/ProjectTreeTable/utils/validateUpdateEntities.cjs.js.map +1 -1
  517. package/dist/shared/src/containers/ProjectTreeTable/utils/validateUpdateEntities.es.js +0 -1
  518. package/dist/shared/src/containers/ProjectTreeTable/utils/validateUpdateEntities.es.js.map +1 -1
  519. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.cjs.js +109 -0
  520. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.cjs.js.map +1 -0
  521. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.es.js +109 -0
  522. package/dist/shared/src/containers/ProjectTreeTable/widgets/GroupHeaderWidget.es.js.map +1 -0
  523. package/dist/shared/src/containers/ProjectTreeTable/widgets/LoadMoreWidget.cjs.js +29 -0
  524. package/dist/shared/src/containers/ProjectTreeTable/widgets/LoadMoreWidget.cjs.js.map +1 -0
  525. package/dist/shared/src/containers/ProjectTreeTable/widgets/LoadMoreWidget.es.js +30 -0
  526. package/dist/shared/src/containers/ProjectTreeTable/widgets/LoadMoreWidget.es.js.map +1 -0
  527. package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.cjs.js +0 -8
  528. package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.cjs.js.map +1 -1
  529. package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.es.js +0 -8
  530. package/dist/shared/src/containers/ProjectTreeTable/widgets/ThumbnailWidget.es.js.map +1 -1
  531. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +10 -0
  532. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
  533. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +10 -0
  534. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
  535. package/dist/shared/src/context/AddonProjectContext.cjs.js +2 -0
  536. package/dist/shared/src/context/AddonProjectContext.cjs.js.map +1 -1
  537. package/dist/shared/src/context/AddonProjectContext.es.js +2 -0
  538. package/dist/shared/src/context/AddonProjectContext.es.js.map +1 -1
  539. package/dist/shared/src/context/DetailsPanelContext.cjs.js +3 -0
  540. package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
  541. package/dist/shared/src/context/DetailsPanelContext.es.js +3 -0
  542. package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
  543. package/dist/shared/src/context/PowerpackContext.cjs.js +170 -0
  544. package/dist/shared/src/context/PowerpackContext.cjs.js.map +1 -0
  545. package/dist/shared/src/context/PowerpackContext.es.js +170 -0
  546. package/dist/shared/src/context/PowerpackContext.es.js.map +1 -0
  547. package/dist/shared/src/context/RemoteModulesContext.cjs.js +7 -1
  548. package/dist/shared/src/context/RemoteModulesContext.cjs.js.map +1 -1
  549. package/dist/shared/src/context/RemoteModulesContext.es.js +8 -2
  550. package/dist/shared/src/context/RemoteModulesContext.es.js.map +1 -1
  551. package/dist/shared/src/hooks/useActionTriggers.cjs.js +2 -0
  552. package/dist/shared/src/hooks/useActionTriggers.cjs.js.map +1 -1
  553. package/dist/shared/src/hooks/useActionTriggers.es.js +2 -0
  554. package/dist/shared/src/hooks/useActionTriggers.es.js.map +1 -1
  555. package/dist/shared/src/hooks/useEntityUpdate.cjs.js +3 -0
  556. package/dist/shared/src/hooks/useEntityUpdate.cjs.js.map +1 -1
  557. package/dist/shared/src/hooks/useEntityUpdate.es.js +3 -0
  558. package/dist/shared/src/hooks/useEntityUpdate.es.js.map +1 -1
  559. package/dist/shared/src/hooks/useLoadModule.cjs.js +8 -2
  560. package/dist/shared/src/hooks/useLoadModule.cjs.js.map +1 -1
  561. package/dist/shared/src/hooks/useLoadModule.es.js +8 -2
  562. package/dist/shared/src/hooks/useLoadModule.es.js.map +1 -1
  563. package/dist/shared/src/hooks/useScopedStatuses.cjs.js +2 -0
  564. package/dist/shared/src/hooks/useScopedStatuses.cjs.js.map +1 -1
  565. package/dist/shared/src/hooks/useScopedStatuses.es.js +2 -0
  566. package/dist/shared/src/hooks/useScopedStatuses.es.js.map +1 -1
  567. package/dist/shared/src/hooks/useUserProjectConfig.cjs.js +2 -0
  568. package/dist/shared/src/hooks/useUserProjectConfig.cjs.js.map +1 -1
  569. package/dist/shared/src/hooks/useUserProjectConfig.es.js +2 -0
  570. package/dist/shared/src/hooks/useUserProjectConfig.es.js.map +1 -1
  571. package/dist/shared/src/util/getAttributeIcon.cjs.js +7 -1
  572. package/dist/shared/src/util/getAttributeIcon.cjs.js.map +1 -1
  573. package/dist/shared/src/util/getAttributeIcon.es.js +7 -1
  574. package/dist/shared/src/util/getAttributeIcon.es.js.map +1 -1
  575. package/dist/shared/src/util/getEntityTypeIcon.cjs.js +9 -0
  576. package/dist/shared/src/util/getEntityTypeIcon.cjs.js.map +1 -1
  577. package/dist/shared/src/util/getEntityTypeIcon.es.js +9 -0
  578. package/dist/shared/src/util/getEntityTypeIcon.es.js.map +1 -1
  579. package/dist/types/api/generated/actions.d.ts +2 -1
  580. package/dist/types/api/generated/addons.d.ts +8 -1
  581. package/dist/types/api/generated/anatomy.d.ts +1 -14
  582. package/dist/types/api/generated/attributes.d.ts +4 -2
  583. package/dist/types/api/generated/configuration.d.ts +6 -0
  584. package/dist/types/api/generated/entityLists.d.ts +2 -0
  585. package/dist/types/api/generated/events.d.ts +1 -1
  586. package/dist/types/api/generated/files.d.ts +11 -0
  587. package/dist/types/api/generated/graphql.d.ts +33 -38
  588. package/dist/types/api/generated/grouping.d.ts +40 -0
  589. package/dist/types/api/generated/index.d.ts +3 -1
  590. package/dist/types/api/generated/operations.d.ts +1 -1
  591. package/dist/types/api/generated/projects.d.ts +59 -0
  592. package/dist/types/api/generated/reviewables.d.ts +1 -0
  593. package/dist/types/api/generated/system.d.ts +5 -3
  594. package/dist/types/api/generated/tasks.d.ts +15 -1
  595. package/dist/types/api/generated/users.d.ts +1 -4
  596. package/dist/types/api/queries/activities/getActivities.d.ts +4 -0
  597. package/dist/types/api/queries/activities/updateActivities.d.ts +8 -0
  598. package/dist/types/api/queries/entities/getEntity.d.ts +4 -0
  599. package/dist/types/api/queries/entities/getEntityPanel.d.ts +4 -0
  600. package/dist/types/api/queries/entities/updateEntity.d.ts +4 -0
  601. package/dist/types/api/queries/entityLists/getLists.d.ts +4 -0
  602. package/dist/types/api/queries/grouping/getGrouping.d.ts +137 -0
  603. package/dist/types/api/queries/grouping/index.d.ts +1 -0
  604. package/dist/types/api/queries/index.d.ts +1 -0
  605. package/dist/types/api/queries/overview/getOverview.d.ts +222 -482
  606. package/dist/types/api/queries/project/getProject.d.ts +6 -0
  607. package/dist/types/api/queries/userDashboard/getUserDashboard.d.ts +4 -0
  608. package/dist/types/api/queries/users/getUsers.d.ts +4 -0
  609. package/dist/types/components/Badge/Badge.d.ts +10 -0
  610. package/dist/types/components/Badge/index.d.ts +1 -0
  611. package/dist/types/components/Powerpack/PowerpackButton.d.ts +7 -0
  612. package/dist/types/components/Powerpack/PowerpackDialog.d.ts +4 -0
  613. package/dist/types/components/Powerpack/PowerpackDialog.styled.d.ts +8 -0
  614. package/dist/types/components/Powerpack/PricingLink.d.ts +4 -0
  615. package/dist/types/components/Powerpack/index.d.ts +3 -0
  616. package/dist/types/components/ProjectTableSettings/ProjectTableSettings.d.ts +3 -2
  617. package/dist/types/components/ProjectTableSettings/TableSettings.styled.d.ts +1 -0
  618. package/dist/types/components/ProjectTableSettings/TableSettingsFallback.d.ts +10 -0
  619. package/dist/types/components/ProjectTableSettings/index.d.ts +1 -0
  620. package/dist/types/components/ReviewableProgressCard/ReviewableProgressCard.d.ts +1 -1
  621. package/dist/types/components/ReviewablesList/ReviewablesUpload.d.ts +19 -3
  622. package/dist/types/components/index.d.ts +2 -0
  623. package/dist/types/containers/ContextMenu/ContextMenuItem.d.ts +4 -0
  624. package/dist/types/containers/ContextMenu/useCreateContextMenu.d.ts +2 -1
  625. package/dist/types/containers/Feed/components/FileUploadPreview/FileUploadPreview.styled.d.ts +1 -0
  626. package/dist/types/containers/ProjectTreeTable/buildTreeTableColumns.d.ts +3 -1
  627. package/dist/types/containers/ProjectTreeTable/components/GroupSettingsFallback.d.ts +11 -0
  628. package/dist/types/containers/ProjectTreeTable/context/ColumnSettingsContext.d.ts +7 -0
  629. package/dist/types/containers/ProjectTreeTable/context/ProjectTableContext.d.ts +22 -5
  630. package/dist/types/containers/ProjectTreeTable/context/ProjectTableModulesContext.d.ts +32 -0
  631. package/dist/types/containers/ProjectTreeTable/context/index.d.ts +1 -0
  632. package/dist/types/containers/ProjectTreeTable/hooks/index.d.ts +13 -0
  633. package/dist/types/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.d.ts +30 -0
  634. package/dist/types/containers/ProjectTreeTable/hooks/{useOverviewTable.d.ts → useBuildProjectDataTable.d.ts} +3 -1
  635. package/dist/types/containers/ProjectTreeTable/hooks/useCellContextMenu.d.ts +15 -2
  636. package/dist/types/containers/ProjectTreeTable/hooks/useColumnSorting.d.ts +12 -0
  637. package/dist/types/containers/ProjectTreeTable/hooks/useEntitiesMap.d.ts +7 -0
  638. package/dist/types/containers/ProjectTreeTable/hooks/useExpandedState.d.ts +11 -0
  639. package/dist/types/containers/ProjectTreeTable/hooks/useFetchOverviewData.d.ts +37 -0
  640. package/dist/types/containers/ProjectTreeTable/hooks/useFolderRelationships.d.ts +1 -1
  641. package/dist/types/containers/ProjectTreeTable/hooks/useGetEntityTypeData.d.ts +2 -2
  642. package/dist/types/containers/ProjectTreeTable/hooks/useGetGroupedFields.d.ts +9 -0
  643. package/dist/types/containers/ProjectTreeTable/hooks/useGetTaskGroups.d.ts +10 -0
  644. package/dist/types/containers/ProjectTreeTable/hooks/useQueryFilters.d.ts +14 -0
  645. package/dist/types/containers/ProjectTreeTable/hooks/useScopedAttributeFields.d.ts +10 -0
  646. package/dist/types/containers/ProjectTreeTable/hooks/useSelectedFolders.d.ts +10 -0
  647. package/dist/types/containers/ProjectTreeTable/index.d.ts +1 -4
  648. package/dist/types/containers/ProjectTreeTable/types/index.d.ts +1 -0
  649. package/dist/types/containers/ProjectTreeTable/types/overviewContext.d.ts +46 -0
  650. package/dist/types/containers/ProjectTreeTable/types/table.d.ts +13 -5
  651. package/dist/types/containers/ProjectTreeTable/utils/errorExtraction.d.ts +4 -0
  652. package/dist/types/containers/ProjectTreeTable/utils/index.d.ts +2 -0
  653. package/dist/types/containers/ProjectTreeTable/utils/localStorageKeys.d.ts +4 -0
  654. package/dist/types/containers/ProjectTreeTable/widgets/GroupHeaderWidget.d.ts +14 -0
  655. package/dist/types/containers/ProjectTreeTable/widgets/LoadMoreWidget.d.ts +8 -0
  656. package/dist/types/containers/ProjectTreeTable/widgets/index.d.ts +1 -0
  657. package/dist/types/context/PowerpackContext.d.ts +21 -0
  658. package/dist/types/context/index.d.ts +1 -0
  659. package/dist/types/hooks/useLoadModule.d.ts +2 -1
  660. package/dist/types/util/getAttributeIcon.d.ts +1 -1
  661. package/dist/types/util/getEntityTypeIcon.d.ts +1 -0
  662. package/dist/types/utils/extractVersionFromFilename.d.ts +5 -0
  663. package/dist/util.cjs.js +1 -0
  664. package/dist/util.cjs.js.map +1 -1
  665. package/dist/util.es.js +2 -1
  666. package/package.json +1 -1
  667. package/dist/shared/src/containers/ProjectTreeTable/hooks/useOverviewTable.cjs.js.map +0 -1
  668. package/dist/shared/src/containers/ProjectTreeTable/hooks/useOverviewTable.es.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AttributeEditor.cjs.js","sources":["../../../../../src/components/AttributeEditor/AttributeEditor.tsx"],"sourcesContent":["import { FC, useEffect, useState } from 'react'\nimport {\n SaveButton,\n Spacer,\n FormLayout,\n FormRow,\n InputText,\n InputSwitch,\n LockedInput,\n Dropdown,\n Dialog,\n Button,\n} from '@ynput/ayon-react-components'\nimport { camelCase, upperFirst } from 'lodash'\nimport { MinMaxField } from './components'\nimport { EnumEditor } from '@shared/components/EnumEditor'\nimport { AttributeData, AttributeModel, AttributeEnumItem } from '@shared/api'\n\nconst SCOPE_OPTIONS = [\n { value: 'project', label: 'Project' },\n { value: 'folder', label: 'Folder' },\n { value: 'task', label: 'Task' },\n { value: 'product', label: 'Product' },\n { value: 'version', label: 'Version' },\n { value: 'representation', label: 'Representation' },\n { value: 'user', label: 'User' },\n]\n\n// Define types for constants\ninterface GlobalFieldEntry {\n value: keyof AttributeData\n scope: (AttributeModel['scope'] | '')[] | null\n}\n\nconst GLOBAL_FIELDS: GlobalFieldEntry[] = [\n { value: 'description', scope: null },\n { value: 'example', scope: null },\n // @ts-expect-error - project is not a scope?\n { value: 'default', scope: ['project'] },\n { value: 'inherit', scope: null },\n]\n\ninterface TypeOptionDef {\n value: AttributeData['type']\n label: string\n fields: (keyof AttributeData)[]\n exclude?: (keyof AttributeData)[]\n}\n\ninterface TypeOptionsMap {\n [key: string]: TypeOptionDef\n}\n\nconst TYPE_OPTIONS: TypeOptionsMap = {\n string: {\n value: 'string',\n label: 'String',\n fields: ['minLength', 'maxLength', 'enum', 'regex'],\n },\n integer: {\n value: 'integer',\n label: 'Integer',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n float: {\n value: 'float',\n label: 'Decimal number',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n list_of_strings: {\n value: 'list_of_strings',\n label: 'List Of Strings',\n fields: ['minItems', 'maxItems', 'enum'],\n },\n boolean: {\n value: 'boolean',\n label: 'Boolean',\n fields: [],\n exclude: ['example'],\n },\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\nexport type AttributeForm = PartialBy<AttributeModel, 'scope' | 'position'>\ntype Excludes = (keyof Omit<AttributeModel, 'data'> | keyof AttributeData)[]\n\nconst initFormData: AttributeForm = {\n name: '',\n scope: ['folder', 'task'],\n builtin: false,\n position: 0,\n data: {\n type: 'string',\n title: '',\n description: '',\n example: '',\n default: undefined,\n enum: [],\n minLength: undefined,\n maxLength: undefined,\n regex: '',\n minItems: undefined,\n maxItems: undefined,\n ge: undefined,\n gt: undefined,\n le: undefined,\n lt: undefined,\n },\n}\n\n// build the form data based on excludes and to update any data\nconst buildInitFormData = (excludes: Excludes, data?: Partial<AttributeForm>) => {\n // Create a deep clone of init form data\n const formData = JSON.parse(JSON.stringify(initFormData)) as AttributeForm\n\n // Filter out top-level excludes if not in required\n const required = ['name']\n Object.keys(formData).forEach((key) => {\n if (\n !required.includes(key) &&\n excludes.includes(key as keyof Omit<AttributeModel, 'data'>) &&\n key !== 'data'\n ) {\n delete formData[key as keyof AttributeForm]\n }\n })\n\n // Filter out data field excludes if not in in required\n const requiredData = ['title']\n if (formData.data) {\n Object.keys(formData.data).forEach((key) => {\n if (!requiredData.includes(key) && excludes.includes(key as keyof AttributeData)) {\n delete formData.data[key as keyof AttributeData]\n }\n })\n }\n\n // Merge with provided data if any\n if (data) {\n // Merge top-level fields\n Object.keys(data).forEach((key) => {\n const typedKey = key as keyof AttributeForm\n if (typedKey !== 'data' && excludes.includes(typedKey)) return\n\n if (typedKey === 'data' && data.data && formData.data) {\n // Deep merge of data fields\n formData.data = { ...formData.data, ...data.data }\n } else if (data[typedKey] !== undefined) {\n // @ts-ignore - We know these properties exist\n formData[typedKey] = data[typedKey]\n }\n })\n }\n\n return formData\n}\n\nexport interface AttributeEditorProps {\n attribute: AttributeForm | null\n existingNames: string[]\n error?: string\n isUpdating?: boolean\n excludes?: Excludes\n onHide: () => void\n onEdit: (attribute: AttributeForm) => void\n onDelete?: () => void\n}\n\nexport const AttributeEditor: FC<AttributeEditorProps> = ({\n attribute,\n existingNames,\n error = '',\n isUpdating,\n excludes = [],\n onHide,\n onEdit,\n onDelete,\n}) => {\n const initForm = buildInitFormData(excludes, { position: existingNames.length })\n const [formData, setFormData] = useState<AttributeForm | null>(attribute || initForm)\n\n useEffect(() => {\n if (!!attribute) setFormData(attribute)\n }, [attribute])\n\n const isNew = !attribute\n\n // const setTopLevelData = (key: string, value: string) => {\n const setTopLevelData = <K extends keyof Omit<AttributeModel, 'data'>>(\n key: K,\n value: AttributeModel[K],\n ) => {\n setFormData((d) => {\n if (!d) {\n return d\n }\n return { ...d, [key]: value }\n })\n }\n\n // const setData = (key, value) => {\n const setData = <K extends keyof AttributeData>(key: K, value: AttributeData[K]) => {\n setFormData((d) => {\n // Add a check for d and d.data\n if (!d || !d.data) {\n return d\n }\n const dt = { ...d.data, [key]: value }\n return { ...d, data: dt }\n })\n }\n\n let internalError = ''\n if (formData) {\n if (isNew) {\n if (existingNames.includes(formData.name)) internalError = 'This attribute already exists'\n else if (!formData.name.match('^[a-zA-Z_]{2,64}$')) error = 'Invalid attribute name'\n } // name validation\n }\n\n const handleSubmit = () => {\n if (formData) {\n onEdit(formData)\n }\n }\n\n const footer = (\n <div style={{ display: 'flex', width: '100%', flexDirection: 'row' }}>\n {onDelete && attribute && (\n <Button\n variant=\"danger\"\n label={'Delete attribute'}\n icon={'delete'}\n disabled={isUpdating}\n onClick={onDelete}\n />\n )}\n <Spacer />\n <SaveButton\n label={isNew ? 'Create Attribute' : 'Save Attribute'}\n icon={'check'}\n disabled={!!internalError || !formData}\n active={!internalError && !!formData}\n saving={isUpdating}\n onClick={handleSubmit}\n />\n </div>\n )\n\n let dataFields: (keyof AttributeData)[] = []\n\n // add global fields, only if scope are null (all) or the scope is included\n GLOBAL_FIELDS.forEach((globalField) => {\n // @ts-expect-error - project scope will never be found here?\n if (!globalField?.scope || globalField?.scope?.some((s) => formData?.scope?.includes(s))) {\n dataFields.push(globalField.value)\n }\n })\n\n if (formData?.data.type && TYPE_OPTIONS[formData.data.type]) {\n const typeOpt = TYPE_OPTIONS[formData.data.type]\n dataFields = [...dataFields, ...typeOpt.fields].filter((f) => !typeOpt.exclude?.includes(f))\n }\n\n type CustomFieldRenderer = (value: any, onChange: (newValue: any) => void) => JSX.Element | null\n const customFields: {\n enum: CustomFieldRenderer\n inherit: CustomFieldRenderer\n booleanDefault: CustomFieldRenderer\n } = {\n enum: (value = [], onChange) => (\n <EnumEditor\n values={value as AttributeEnumItem[]}\n onChange={(val) => {\n onChange(val)\n }}\n />\n ),\n inherit: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n booleanDefault: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n }\n\n const handleTitleChange = (e: React.ChangeEvent) => {\n const v = (e.target as HTMLInputElement).value\n setData('title', v)\n\n if (isNew) {\n setTopLevelData('name', camelCase(v))\n }\n }\n\n return (\n <Dialog\n header={formData?.data?.title || formData?.name || 'New attribute'}\n footer={footer}\n onClose={onHide}\n isOpen={true}\n style={{ width: 700, zIndex: 999 }}\n size=\"full\"\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handleSubmit()\n }\n }}\n >\n {formData && (\n <FormLayout>\n {!excludes.includes('title') && (\n <FormRow label={'Title'} key={'title'}>\n <InputText value={formData?.data['title']} onChange={handleTitleChange} autoFocus />\n </FormRow>\n )}\n {!excludes.includes('name') && (\n <FormRow label={'Name'} key={'name'}>\n <LockedInput\n value={formData.name}\n disabled={!isNew}\n onSubmit={(v) => setTopLevelData('name', v)}\n label=\"name\"\n />\n </FormRow>\n )}\n {!excludes.includes('scope') && (\n <FormRow label=\"Scope\">\n <Dropdown\n options={SCOPE_OPTIONS}\n disabled={formData.builtin}\n value={formData.scope || []}\n onChange={(v) => setTopLevelData('scope', v as AttributeModel['scope'])}\n multiSelect\n widthExpand\n />\n </FormRow>\n )}\n {!excludes.includes('type') && (\n <FormRow label=\"Type\">\n <Dropdown\n value={[formData?.data?.type]}\n disabled={formData.builtin}\n options={Object.values(TYPE_OPTIONS)}\n onChange={(v) => setData('type', v[0] as AttributeData['type'])}\n minSelected={1}\n widthExpand\n />\n </FormRow>\n )}\n {dataFields.map((field) => {\n // skip if field is excluded\n if (excludes.includes(field)) return null\n\n let fieldComp = null\n let fieldLabel = upperFirst(field)\n\n if (field === 'enum' || field === 'inherit') {\n const renderer = customFields[field as 'enum' | 'inherit']\n fieldComp = renderer(formData?.data[field], (value) => setData(field, value))\n } else if (field === 'default' && formData?.data?.type === 'boolean') {\n fieldComp = customFields['booleanDefault'](\n formData?.data[field] as boolean,\n (value) => setData(field, value as AttributeData['default']),\n )\n } else if (['ge', 'gt', 'le', 'lt'].includes(field)) {\n // ignore gt and lt\n if (['gt', 'lt'].includes(field)) return null\n fieldComp = (\n <MinMaxField\n value={formData?.data}\n isMin={field === 'ge'}\n isFloat={formData?.data?.type === 'float'}\n onChange={(v) => {\n const geValue = v.ge !== undefined ? Number(v.ge) : undefined\n const leValue = v.le !== undefined ? Number(v.le) : undefined\n\n if (\n // @ts-expect-error\n (v.ge !== undefined && isNaN(geValue)) ||\n // @ts-expect-error\n (v.le !== undefined && isNaN(leValue))\n ) {\n // Do not update the form if the value is not a valid number\n return\n }\n\n setFormData((d) => {\n if (!d || !d.data) return d\n const dt = { ...d.data, ...v }\n return { ...d, data: dt }\n })\n }}\n />\n )\n\n // rewrite field to min or max for display label\n fieldLabel = field === 'ge' ? 'Min' : 'Max'\n } else {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const strValue = e.target.value\n switch (field) {\n case 'minLength':\n case 'maxLength':\n case 'minItems':\n case 'maxItems': {\n const num = parseInt(strValue, 10)\n setData(field, isNaN(num) ? undefined : num)\n break\n }\n default:\n // For string fields ('description', 'regex') or 'any' type fields ('example', 'default')\n setData(field, strValue as AttributeData[typeof field])\n break\n }\n }\n\n fieldComp = (\n <InputText\n value={String(formData?.data[field] ?? '')}\n onChange={handleInputChange}\n />\n )\n }\n\n return (\n <FormRow\n label={fieldLabel}\n key={field}\n style={{\n alignItems: 'flex-start',\n }}\n >\n {fieldComp}\n </FormRow>\n )\n })}\n <span>\n {(internalError || error) && (\n <span className=\"form-error-text\">{internalError || error}</span>\n )}\n </span>\n </FormLayout>\n )}\n </Dialog>\n )\n}\n"],"names":["useState","useEffect","jsxs","jsx","Button","Spacer","SaveButton","_a","EnumEditor","InputSwitch","camelCase","Dialog","FormLayout","FormRow","InputText","LockedInput","Dropdown","upperFirst","MinMaxField","_b"],"mappings":"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"}
1
+ {"version":3,"file":"AttributeEditor.cjs.js","sources":["../../../../../src/components/AttributeEditor/AttributeEditor.tsx"],"sourcesContent":["import { FC, useEffect, useState } from 'react'\nimport {\n SaveButton,\n Spacer,\n FormLayout,\n FormRow,\n InputText,\n InputSwitch,\n LockedInput,\n Dropdown,\n Dialog,\n Button,\n} from '@ynput/ayon-react-components'\nimport { camelCase, upperFirst } from 'lodash'\nimport { MinMaxField } from './components'\nimport { EnumEditor } from '@shared/components/EnumEditor'\nimport { AttributeData, AttributeModel, AttributeEnumItem } from '@shared/api'\n\nconst SCOPE_OPTIONS = [\n { value: 'project', label: 'Project' },\n { value: 'folder', label: 'Folder' },\n { value: 'task', label: 'Task' },\n { value: 'product', label: 'Product' },\n { value: 'version', label: 'Version' },\n { value: 'representation', label: 'Representation' },\n { value: 'user', label: 'User' },\n]\n\n// Define types for constants\ninterface GlobalFieldEntry {\n value: keyof AttributeData\n scope: (AttributeModel['scope'] | '')[] | null\n}\n\nconst GLOBAL_FIELDS: GlobalFieldEntry[] = [\n { value: 'description', scope: null },\n { value: 'example', scope: null },\n // @ts-expect-error - project is not a scope?\n { value: 'default', scope: ['project'] },\n { value: 'inherit', scope: null },\n]\n\ninterface TypeOptionDef {\n value: AttributeData['type']\n label: string\n fields: (keyof AttributeData)[]\n exclude?: (keyof AttributeData)[]\n}\n\ninterface TypeOptionsMap {\n [key: string]: TypeOptionDef\n}\n\nconst TYPE_OPTIONS: TypeOptionsMap = {\n string: {\n value: 'string',\n label: 'String',\n fields: ['minLength', 'maxLength', 'enum', 'regex'],\n },\n integer: {\n value: 'integer',\n label: 'Integer',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n float: {\n value: 'float',\n label: 'Decimal number',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n list_of_strings: {\n value: 'list_of_strings',\n label: 'List Of Strings',\n fields: ['minItems', 'maxItems', 'enum'],\n },\n boolean: {\n value: 'boolean',\n label: 'Boolean',\n fields: [],\n exclude: ['example'],\n },\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\nexport type AttributeForm = PartialBy<AttributeModel, 'scope' | 'position'>\ntype Excludes = (keyof Omit<AttributeModel, 'data'> | keyof AttributeData)[]\n\nconst initFormData: AttributeForm = {\n name: '',\n scope: ['folder', 'task'],\n builtin: false,\n position: 0,\n data: {\n type: 'string',\n title: '',\n description: '',\n example: '',\n default: undefined,\n enum: undefined,\n minLength: undefined,\n maxLength: undefined,\n regex: '',\n minItems: undefined,\n maxItems: undefined,\n ge: undefined,\n gt: undefined,\n le: undefined,\n lt: undefined,\n },\n}\n\n// build the form data based on excludes and to update any data\nconst buildInitFormData = (excludes: Excludes, data?: Partial<AttributeForm>) => {\n // Create a deep clone of init form data\n const formData = JSON.parse(JSON.stringify(initFormData)) as AttributeForm\n\n // Filter out top-level excludes if not in required\n const required = ['name']\n Object.keys(formData).forEach((key) => {\n if (\n !required.includes(key) &&\n excludes.includes(key as keyof Omit<AttributeModel, 'data'>) &&\n key !== 'data'\n ) {\n delete formData[key as keyof AttributeForm]\n }\n })\n\n // Filter out data field excludes if not in in required\n const requiredData = ['title']\n if (formData.data) {\n Object.keys(formData.data).forEach((key) => {\n if (!requiredData.includes(key) && excludes.includes(key as keyof AttributeData)) {\n delete formData.data[key as keyof AttributeData]\n }\n })\n }\n\n // Merge with provided data if any\n if (data) {\n // Merge top-level fields\n Object.keys(data).forEach((key) => {\n const typedKey = key as keyof AttributeForm\n if (typedKey !== 'data' && excludes.includes(typedKey)) return\n\n if (typedKey === 'data' && data.data && formData.data) {\n // Deep merge of data fields\n formData.data = { ...formData.data, ...data.data }\n } else if (data[typedKey] !== undefined) {\n // @ts-ignore - We know these properties exist\n formData[typedKey] = data[typedKey]\n }\n })\n }\n\n return formData\n}\n\nexport interface AttributeEditorProps {\n attribute: AttributeForm | null\n existingNames: string[]\n error?: string\n isUpdating?: boolean\n excludes?: Excludes\n onHide: () => void\n onEdit: (attribute: AttributeForm) => void\n onDelete?: () => void\n}\n\nexport const AttributeEditor: FC<AttributeEditorProps> = ({\n attribute,\n existingNames,\n error = '',\n isUpdating,\n excludes = [],\n onHide,\n onEdit,\n onDelete,\n}) => {\n const initForm = buildInitFormData(excludes, { position: existingNames.length })\n const [formData, setFormData] = useState<AttributeForm | null>(attribute || initForm)\n\n useEffect(() => {\n if (!!attribute) setFormData(attribute)\n }, [attribute])\n\n const isNew = !attribute\n\n // const setTopLevelData = (key: string, value: string) => {\n const setTopLevelData = <K extends keyof Omit<AttributeModel, 'data'>>(\n key: K,\n value: AttributeModel[K],\n ) => {\n setFormData((d) => {\n if (!d) {\n return d\n }\n return { ...d, [key]: value }\n })\n }\n\n // const setData = (key, value) => {\n const setData = <K extends keyof AttributeData>(key: K, value: AttributeData[K]) => {\n setFormData((d) => {\n // Add a check for d and d.data\n if (!d || !d.data) {\n return d\n }\n const dt = { ...d.data, [key]: value }\n return { ...d, data: dt }\n })\n }\n\n let internalError = ''\n if (formData) {\n if (isNew) {\n if (existingNames.includes(formData.name)) internalError = 'This attribute already exists'\n else if (!formData.name.match('^[a-zA-Z_]{2,64}$')) error = 'Invalid attribute name'\n } // name validation\n }\n\n const handleSubmit = () => {\n if (formData) {\n onEdit(formData)\n }\n }\n\n const footer = (\n <div style={{ display: 'flex', width: '100%', flexDirection: 'row' }}>\n {onDelete && attribute && (\n <Button\n variant=\"danger\"\n label={'Delete attribute'}\n icon={'delete'}\n disabled={isUpdating}\n onClick={onDelete}\n />\n )}\n <Spacer />\n <SaveButton\n label={isNew ? 'Create Attribute' : 'Save Attribute'}\n icon={'check'}\n disabled={!!internalError || !formData}\n active={!internalError && !!formData}\n saving={isUpdating}\n onClick={handleSubmit}\n />\n </div>\n )\n\n let dataFields: (keyof AttributeData)[] = []\n\n // add global fields, only if scope are null (all) or the scope is included\n GLOBAL_FIELDS.forEach((globalField) => {\n // @ts-expect-error - project scope will never be found here?\n if (!globalField?.scope || globalField?.scope?.some((s) => formData?.scope?.includes(s))) {\n dataFields.push(globalField.value)\n }\n })\n\n if (formData?.data.type && TYPE_OPTIONS[formData.data.type]) {\n const typeOpt = TYPE_OPTIONS[formData.data.type]\n dataFields = [...dataFields, ...typeOpt.fields].filter((f) => !typeOpt.exclude?.includes(f))\n }\n\n type CustomFieldRenderer = (value: any, onChange: (newValue: any) => void) => JSX.Element | null\n const customFields: {\n enum: CustomFieldRenderer\n inherit: CustomFieldRenderer\n booleanDefault: CustomFieldRenderer\n } = {\n enum: (value = [], onChange) => (\n <EnumEditor\n values={value as AttributeEnumItem[]}\n onChange={(val) => {\n onChange(val?.length ? val : undefined)\n }}\n />\n ),\n inherit: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n booleanDefault: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n }\n\n const handleTitleChange = (e: React.ChangeEvent) => {\n const v = (e.target as HTMLInputElement).value\n setData('title', v)\n\n if (isNew) {\n setTopLevelData('name', camelCase(v))\n }\n }\n\n return (\n <Dialog\n header={formData?.data?.title || formData?.name || 'New attribute'}\n footer={footer}\n onClose={onHide}\n isOpen={true}\n style={{ width: 700, zIndex: 999 }}\n size=\"full\"\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handleSubmit()\n }\n }}\n >\n {formData && (\n <FormLayout>\n {!excludes.includes('title') && (\n <FormRow label={'Title'} key={'title'}>\n <InputText value={formData?.data['title']} onChange={handleTitleChange} autoFocus />\n </FormRow>\n )}\n {!excludes.includes('name') && (\n <FormRow label={'Name'} key={'name'}>\n <LockedInput\n value={formData.name}\n disabled={!isNew}\n onSubmit={(v) => setTopLevelData('name', v)}\n label=\"name\"\n />\n </FormRow>\n )}\n {!excludes.includes('scope') && (\n <FormRow label=\"Scope\">\n <Dropdown\n options={SCOPE_OPTIONS}\n disabled={formData.builtin}\n value={formData.scope || []}\n onChange={(v) => setTopLevelData('scope', v as AttributeModel['scope'])}\n multiSelect\n widthExpand\n />\n </FormRow>\n )}\n {!excludes.includes('type') && (\n <FormRow label=\"Type\">\n <Dropdown\n value={[formData?.data?.type]}\n disabled={formData.builtin}\n options={Object.values(TYPE_OPTIONS)}\n onChange={(v) => setData('type', v[0] as AttributeData['type'])}\n minSelected={1}\n widthExpand\n />\n </FormRow>\n )}\n {dataFields.map((field) => {\n // skip if field is excluded\n if (excludes.includes(field)) return null\n\n let fieldComp = null\n let fieldLabel = upperFirst(field)\n\n if (field === 'enum' || field === 'inherit') {\n const renderer = customFields[field as 'enum' | 'inherit']\n fieldComp = renderer(formData?.data[field], (value) => setData(field, value))\n } else if (field === 'default' && formData?.data?.type === 'boolean') {\n fieldComp = customFields['booleanDefault'](\n formData?.data[field] as boolean,\n (value) => setData(field, value as AttributeData['default']),\n )\n } else if (['ge', 'gt', 'le', 'lt'].includes(field)) {\n // ignore gt and lt\n if (['gt', 'lt'].includes(field)) return null\n fieldComp = (\n <MinMaxField\n value={formData?.data}\n isMin={field === 'ge'}\n isFloat={formData?.data?.type === 'float'}\n onChange={(v) => {\n const geValue = v.ge !== undefined ? Number(v.ge) : undefined\n const leValue = v.le !== undefined ? Number(v.le) : undefined\n\n if (\n // @ts-expect-error\n (v.ge !== undefined && isNaN(geValue)) ||\n // @ts-expect-error\n (v.le !== undefined && isNaN(leValue))\n ) {\n // Do not update the form if the value is not a valid number\n return\n }\n\n setFormData((d) => {\n if (!d || !d.data) return d\n const dt = { ...d.data, ...v }\n return { ...d, data: dt }\n })\n }}\n />\n )\n\n // rewrite field to min or max for display label\n fieldLabel = field === 'ge' ? 'Min' : 'Max'\n } else {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const strValue = e.target.value\n switch (field) {\n case 'minLength':\n case 'maxLength':\n case 'minItems':\n case 'maxItems': {\n const num = parseInt(strValue, 10)\n setData(field, isNaN(num) ? undefined : num)\n break\n }\n default:\n // For string fields ('description', 'regex') or 'any' type fields ('example', 'default')\n setData(field, strValue as AttributeData[typeof field])\n break\n }\n }\n\n fieldComp = (\n <InputText\n value={String(formData?.data[field] ?? '')}\n onChange={handleInputChange}\n />\n )\n }\n\n return (\n <FormRow\n label={fieldLabel}\n key={field}\n style={{\n alignItems: 'flex-start',\n }}\n >\n {fieldComp}\n </FormRow>\n )\n })}\n <span>\n {(internalError || error) && (\n <span className=\"form-error-text\">{internalError || error}</span>\n )}\n </span>\n </FormLayout>\n )}\n </Dialog>\n )\n}\n"],"names":["useState","useEffect","jsxs","jsx","Button","Spacer","SaveButton","_a","EnumEditor","InputSwitch","camelCase","Dialog","FormLayout","FormRow","InputText","LockedInput","Dropdown","upperFirst","MinMaxField","_b"],"mappings":"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"}
@@ -59,7 +59,7 @@ const initFormData = {
59
59
  description: "",
60
60
  example: "",
61
61
  default: void 0,
62
- enum: [],
62
+ enum: void 0,
63
63
  minLength: void 0,
64
64
  maxLength: void 0,
65
65
  regex: "",
@@ -193,7 +193,7 @@ const AttributeEditor = ({
193
193
  {
194
194
  values: value,
195
195
  onChange: (val) => {
196
- onChange(val);
196
+ onChange((val == null ? void 0 : val.length) ? val : void 0);
197
197
  }
198
198
  }
199
199
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"AttributeEditor.es.js","sources":["../../../../../src/components/AttributeEditor/AttributeEditor.tsx"],"sourcesContent":["import { FC, useEffect, useState } from 'react'\nimport {\n SaveButton,\n Spacer,\n FormLayout,\n FormRow,\n InputText,\n InputSwitch,\n LockedInput,\n Dropdown,\n Dialog,\n Button,\n} from '@ynput/ayon-react-components'\nimport { camelCase, upperFirst } from 'lodash'\nimport { MinMaxField } from './components'\nimport { EnumEditor } from '@shared/components/EnumEditor'\nimport { AttributeData, AttributeModel, AttributeEnumItem } from '@shared/api'\n\nconst SCOPE_OPTIONS = [\n { value: 'project', label: 'Project' },\n { value: 'folder', label: 'Folder' },\n { value: 'task', label: 'Task' },\n { value: 'product', label: 'Product' },\n { value: 'version', label: 'Version' },\n { value: 'representation', label: 'Representation' },\n { value: 'user', label: 'User' },\n]\n\n// Define types for constants\ninterface GlobalFieldEntry {\n value: keyof AttributeData\n scope: (AttributeModel['scope'] | '')[] | null\n}\n\nconst GLOBAL_FIELDS: GlobalFieldEntry[] = [\n { value: 'description', scope: null },\n { value: 'example', scope: null },\n // @ts-expect-error - project is not a scope?\n { value: 'default', scope: ['project'] },\n { value: 'inherit', scope: null },\n]\n\ninterface TypeOptionDef {\n value: AttributeData['type']\n label: string\n fields: (keyof AttributeData)[]\n exclude?: (keyof AttributeData)[]\n}\n\ninterface TypeOptionsMap {\n [key: string]: TypeOptionDef\n}\n\nconst TYPE_OPTIONS: TypeOptionsMap = {\n string: {\n value: 'string',\n label: 'String',\n fields: ['minLength', 'maxLength', 'enum', 'regex'],\n },\n integer: {\n value: 'integer',\n label: 'Integer',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n float: {\n value: 'float',\n label: 'Decimal number',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n list_of_strings: {\n value: 'list_of_strings',\n label: 'List Of Strings',\n fields: ['minItems', 'maxItems', 'enum'],\n },\n boolean: {\n value: 'boolean',\n label: 'Boolean',\n fields: [],\n exclude: ['example'],\n },\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\nexport type AttributeForm = PartialBy<AttributeModel, 'scope' | 'position'>\ntype Excludes = (keyof Omit<AttributeModel, 'data'> | keyof AttributeData)[]\n\nconst initFormData: AttributeForm = {\n name: '',\n scope: ['folder', 'task'],\n builtin: false,\n position: 0,\n data: {\n type: 'string',\n title: '',\n description: '',\n example: '',\n default: undefined,\n enum: [],\n minLength: undefined,\n maxLength: undefined,\n regex: '',\n minItems: undefined,\n maxItems: undefined,\n ge: undefined,\n gt: undefined,\n le: undefined,\n lt: undefined,\n },\n}\n\n// build the form data based on excludes and to update any data\nconst buildInitFormData = (excludes: Excludes, data?: Partial<AttributeForm>) => {\n // Create a deep clone of init form data\n const formData = JSON.parse(JSON.stringify(initFormData)) as AttributeForm\n\n // Filter out top-level excludes if not in required\n const required = ['name']\n Object.keys(formData).forEach((key) => {\n if (\n !required.includes(key) &&\n excludes.includes(key as keyof Omit<AttributeModel, 'data'>) &&\n key !== 'data'\n ) {\n delete formData[key as keyof AttributeForm]\n }\n })\n\n // Filter out data field excludes if not in in required\n const requiredData = ['title']\n if (formData.data) {\n Object.keys(formData.data).forEach((key) => {\n if (!requiredData.includes(key) && excludes.includes(key as keyof AttributeData)) {\n delete formData.data[key as keyof AttributeData]\n }\n })\n }\n\n // Merge with provided data if any\n if (data) {\n // Merge top-level fields\n Object.keys(data).forEach((key) => {\n const typedKey = key as keyof AttributeForm\n if (typedKey !== 'data' && excludes.includes(typedKey)) return\n\n if (typedKey === 'data' && data.data && formData.data) {\n // Deep merge of data fields\n formData.data = { ...formData.data, ...data.data }\n } else if (data[typedKey] !== undefined) {\n // @ts-ignore - We know these properties exist\n formData[typedKey] = data[typedKey]\n }\n })\n }\n\n return formData\n}\n\nexport interface AttributeEditorProps {\n attribute: AttributeForm | null\n existingNames: string[]\n error?: string\n isUpdating?: boolean\n excludes?: Excludes\n onHide: () => void\n onEdit: (attribute: AttributeForm) => void\n onDelete?: () => void\n}\n\nexport const AttributeEditor: FC<AttributeEditorProps> = ({\n attribute,\n existingNames,\n error = '',\n isUpdating,\n excludes = [],\n onHide,\n onEdit,\n onDelete,\n}) => {\n const initForm = buildInitFormData(excludes, { position: existingNames.length })\n const [formData, setFormData] = useState<AttributeForm | null>(attribute || initForm)\n\n useEffect(() => {\n if (!!attribute) setFormData(attribute)\n }, [attribute])\n\n const isNew = !attribute\n\n // const setTopLevelData = (key: string, value: string) => {\n const setTopLevelData = <K extends keyof Omit<AttributeModel, 'data'>>(\n key: K,\n value: AttributeModel[K],\n ) => {\n setFormData((d) => {\n if (!d) {\n return d\n }\n return { ...d, [key]: value }\n })\n }\n\n // const setData = (key, value) => {\n const setData = <K extends keyof AttributeData>(key: K, value: AttributeData[K]) => {\n setFormData((d) => {\n // Add a check for d and d.data\n if (!d || !d.data) {\n return d\n }\n const dt = { ...d.data, [key]: value }\n return { ...d, data: dt }\n })\n }\n\n let internalError = ''\n if (formData) {\n if (isNew) {\n if (existingNames.includes(formData.name)) internalError = 'This attribute already exists'\n else if (!formData.name.match('^[a-zA-Z_]{2,64}$')) error = 'Invalid attribute name'\n } // name validation\n }\n\n const handleSubmit = () => {\n if (formData) {\n onEdit(formData)\n }\n }\n\n const footer = (\n <div style={{ display: 'flex', width: '100%', flexDirection: 'row' }}>\n {onDelete && attribute && (\n <Button\n variant=\"danger\"\n label={'Delete attribute'}\n icon={'delete'}\n disabled={isUpdating}\n onClick={onDelete}\n />\n )}\n <Spacer />\n <SaveButton\n label={isNew ? 'Create Attribute' : 'Save Attribute'}\n icon={'check'}\n disabled={!!internalError || !formData}\n active={!internalError && !!formData}\n saving={isUpdating}\n onClick={handleSubmit}\n />\n </div>\n )\n\n let dataFields: (keyof AttributeData)[] = []\n\n // add global fields, only if scope are null (all) or the scope is included\n GLOBAL_FIELDS.forEach((globalField) => {\n // @ts-expect-error - project scope will never be found here?\n if (!globalField?.scope || globalField?.scope?.some((s) => formData?.scope?.includes(s))) {\n dataFields.push(globalField.value)\n }\n })\n\n if (formData?.data.type && TYPE_OPTIONS[formData.data.type]) {\n const typeOpt = TYPE_OPTIONS[formData.data.type]\n dataFields = [...dataFields, ...typeOpt.fields].filter((f) => !typeOpt.exclude?.includes(f))\n }\n\n type CustomFieldRenderer = (value: any, onChange: (newValue: any) => void) => JSX.Element | null\n const customFields: {\n enum: CustomFieldRenderer\n inherit: CustomFieldRenderer\n booleanDefault: CustomFieldRenderer\n } = {\n enum: (value = [], onChange) => (\n <EnumEditor\n values={value as AttributeEnumItem[]}\n onChange={(val) => {\n onChange(val)\n }}\n />\n ),\n inherit: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n booleanDefault: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n }\n\n const handleTitleChange = (e: React.ChangeEvent) => {\n const v = (e.target as HTMLInputElement).value\n setData('title', v)\n\n if (isNew) {\n setTopLevelData('name', camelCase(v))\n }\n }\n\n return (\n <Dialog\n header={formData?.data?.title || formData?.name || 'New attribute'}\n footer={footer}\n onClose={onHide}\n isOpen={true}\n style={{ width: 700, zIndex: 999 }}\n size=\"full\"\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handleSubmit()\n }\n }}\n >\n {formData && (\n <FormLayout>\n {!excludes.includes('title') && (\n <FormRow label={'Title'} key={'title'}>\n <InputText value={formData?.data['title']} onChange={handleTitleChange} autoFocus />\n </FormRow>\n )}\n {!excludes.includes('name') && (\n <FormRow label={'Name'} key={'name'}>\n <LockedInput\n value={formData.name}\n disabled={!isNew}\n onSubmit={(v) => setTopLevelData('name', v)}\n label=\"name\"\n />\n </FormRow>\n )}\n {!excludes.includes('scope') && (\n <FormRow label=\"Scope\">\n <Dropdown\n options={SCOPE_OPTIONS}\n disabled={formData.builtin}\n value={formData.scope || []}\n onChange={(v) => setTopLevelData('scope', v as AttributeModel['scope'])}\n multiSelect\n widthExpand\n />\n </FormRow>\n )}\n {!excludes.includes('type') && (\n <FormRow label=\"Type\">\n <Dropdown\n value={[formData?.data?.type]}\n disabled={formData.builtin}\n options={Object.values(TYPE_OPTIONS)}\n onChange={(v) => setData('type', v[0] as AttributeData['type'])}\n minSelected={1}\n widthExpand\n />\n </FormRow>\n )}\n {dataFields.map((field) => {\n // skip if field is excluded\n if (excludes.includes(field)) return null\n\n let fieldComp = null\n let fieldLabel = upperFirst(field)\n\n if (field === 'enum' || field === 'inherit') {\n const renderer = customFields[field as 'enum' | 'inherit']\n fieldComp = renderer(formData?.data[field], (value) => setData(field, value))\n } else if (field === 'default' && formData?.data?.type === 'boolean') {\n fieldComp = customFields['booleanDefault'](\n formData?.data[field] as boolean,\n (value) => setData(field, value as AttributeData['default']),\n )\n } else if (['ge', 'gt', 'le', 'lt'].includes(field)) {\n // ignore gt and lt\n if (['gt', 'lt'].includes(field)) return null\n fieldComp = (\n <MinMaxField\n value={formData?.data}\n isMin={field === 'ge'}\n isFloat={formData?.data?.type === 'float'}\n onChange={(v) => {\n const geValue = v.ge !== undefined ? Number(v.ge) : undefined\n const leValue = v.le !== undefined ? Number(v.le) : undefined\n\n if (\n // @ts-expect-error\n (v.ge !== undefined && isNaN(geValue)) ||\n // @ts-expect-error\n (v.le !== undefined && isNaN(leValue))\n ) {\n // Do not update the form if the value is not a valid number\n return\n }\n\n setFormData((d) => {\n if (!d || !d.data) return d\n const dt = { ...d.data, ...v }\n return { ...d, data: dt }\n })\n }}\n />\n )\n\n // rewrite field to min or max for display label\n fieldLabel = field === 'ge' ? 'Min' : 'Max'\n } else {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const strValue = e.target.value\n switch (field) {\n case 'minLength':\n case 'maxLength':\n case 'minItems':\n case 'maxItems': {\n const num = parseInt(strValue, 10)\n setData(field, isNaN(num) ? undefined : num)\n break\n }\n default:\n // For string fields ('description', 'regex') or 'any' type fields ('example', 'default')\n setData(field, strValue as AttributeData[typeof field])\n break\n }\n }\n\n fieldComp = (\n <InputText\n value={String(formData?.data[field] ?? '')}\n onChange={handleInputChange}\n />\n )\n }\n\n return (\n <FormRow\n label={fieldLabel}\n key={field}\n style={{\n alignItems: 'flex-start',\n }}\n >\n {fieldComp}\n </FormRow>\n )\n })}\n <span>\n {(internalError || error) && (\n <span className=\"form-error-text\">{internalError || error}</span>\n )}\n </span>\n </FormLayout>\n )}\n </Dialog>\n )\n}\n"],"names":["jsxs","jsx","_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"AttributeEditor.es.js","sources":["../../../../../src/components/AttributeEditor/AttributeEditor.tsx"],"sourcesContent":["import { FC, useEffect, useState } from 'react'\nimport {\n SaveButton,\n Spacer,\n FormLayout,\n FormRow,\n InputText,\n InputSwitch,\n LockedInput,\n Dropdown,\n Dialog,\n Button,\n} from '@ynput/ayon-react-components'\nimport { camelCase, upperFirst } from 'lodash'\nimport { MinMaxField } from './components'\nimport { EnumEditor } from '@shared/components/EnumEditor'\nimport { AttributeData, AttributeModel, AttributeEnumItem } from '@shared/api'\n\nconst SCOPE_OPTIONS = [\n { value: 'project', label: 'Project' },\n { value: 'folder', label: 'Folder' },\n { value: 'task', label: 'Task' },\n { value: 'product', label: 'Product' },\n { value: 'version', label: 'Version' },\n { value: 'representation', label: 'Representation' },\n { value: 'user', label: 'User' },\n]\n\n// Define types for constants\ninterface GlobalFieldEntry {\n value: keyof AttributeData\n scope: (AttributeModel['scope'] | '')[] | null\n}\n\nconst GLOBAL_FIELDS: GlobalFieldEntry[] = [\n { value: 'description', scope: null },\n { value: 'example', scope: null },\n // @ts-expect-error - project is not a scope?\n { value: 'default', scope: ['project'] },\n { value: 'inherit', scope: null },\n]\n\ninterface TypeOptionDef {\n value: AttributeData['type']\n label: string\n fields: (keyof AttributeData)[]\n exclude?: (keyof AttributeData)[]\n}\n\ninterface TypeOptionsMap {\n [key: string]: TypeOptionDef\n}\n\nconst TYPE_OPTIONS: TypeOptionsMap = {\n string: {\n value: 'string',\n label: 'String',\n fields: ['minLength', 'maxLength', 'enum', 'regex'],\n },\n integer: {\n value: 'integer',\n label: 'Integer',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n float: {\n value: 'float',\n label: 'Decimal number',\n fields: ['ge', 'gt', 'le', 'lt'],\n },\n list_of_strings: {\n value: 'list_of_strings',\n label: 'List Of Strings',\n fields: ['minItems', 'maxItems', 'enum'],\n },\n boolean: {\n value: 'boolean',\n label: 'Boolean',\n fields: [],\n exclude: ['example'],\n },\n}\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\nexport type AttributeForm = PartialBy<AttributeModel, 'scope' | 'position'>\ntype Excludes = (keyof Omit<AttributeModel, 'data'> | keyof AttributeData)[]\n\nconst initFormData: AttributeForm = {\n name: '',\n scope: ['folder', 'task'],\n builtin: false,\n position: 0,\n data: {\n type: 'string',\n title: '',\n description: '',\n example: '',\n default: undefined,\n enum: undefined,\n minLength: undefined,\n maxLength: undefined,\n regex: '',\n minItems: undefined,\n maxItems: undefined,\n ge: undefined,\n gt: undefined,\n le: undefined,\n lt: undefined,\n },\n}\n\n// build the form data based on excludes and to update any data\nconst buildInitFormData = (excludes: Excludes, data?: Partial<AttributeForm>) => {\n // Create a deep clone of init form data\n const formData = JSON.parse(JSON.stringify(initFormData)) as AttributeForm\n\n // Filter out top-level excludes if not in required\n const required = ['name']\n Object.keys(formData).forEach((key) => {\n if (\n !required.includes(key) &&\n excludes.includes(key as keyof Omit<AttributeModel, 'data'>) &&\n key !== 'data'\n ) {\n delete formData[key as keyof AttributeForm]\n }\n })\n\n // Filter out data field excludes if not in in required\n const requiredData = ['title']\n if (formData.data) {\n Object.keys(formData.data).forEach((key) => {\n if (!requiredData.includes(key) && excludes.includes(key as keyof AttributeData)) {\n delete formData.data[key as keyof AttributeData]\n }\n })\n }\n\n // Merge with provided data if any\n if (data) {\n // Merge top-level fields\n Object.keys(data).forEach((key) => {\n const typedKey = key as keyof AttributeForm\n if (typedKey !== 'data' && excludes.includes(typedKey)) return\n\n if (typedKey === 'data' && data.data && formData.data) {\n // Deep merge of data fields\n formData.data = { ...formData.data, ...data.data }\n } else if (data[typedKey] !== undefined) {\n // @ts-ignore - We know these properties exist\n formData[typedKey] = data[typedKey]\n }\n })\n }\n\n return formData\n}\n\nexport interface AttributeEditorProps {\n attribute: AttributeForm | null\n existingNames: string[]\n error?: string\n isUpdating?: boolean\n excludes?: Excludes\n onHide: () => void\n onEdit: (attribute: AttributeForm) => void\n onDelete?: () => void\n}\n\nexport const AttributeEditor: FC<AttributeEditorProps> = ({\n attribute,\n existingNames,\n error = '',\n isUpdating,\n excludes = [],\n onHide,\n onEdit,\n onDelete,\n}) => {\n const initForm = buildInitFormData(excludes, { position: existingNames.length })\n const [formData, setFormData] = useState<AttributeForm | null>(attribute || initForm)\n\n useEffect(() => {\n if (!!attribute) setFormData(attribute)\n }, [attribute])\n\n const isNew = !attribute\n\n // const setTopLevelData = (key: string, value: string) => {\n const setTopLevelData = <K extends keyof Omit<AttributeModel, 'data'>>(\n key: K,\n value: AttributeModel[K],\n ) => {\n setFormData((d) => {\n if (!d) {\n return d\n }\n return { ...d, [key]: value }\n })\n }\n\n // const setData = (key, value) => {\n const setData = <K extends keyof AttributeData>(key: K, value: AttributeData[K]) => {\n setFormData((d) => {\n // Add a check for d and d.data\n if (!d || !d.data) {\n return d\n }\n const dt = { ...d.data, [key]: value }\n return { ...d, data: dt }\n })\n }\n\n let internalError = ''\n if (formData) {\n if (isNew) {\n if (existingNames.includes(formData.name)) internalError = 'This attribute already exists'\n else if (!formData.name.match('^[a-zA-Z_]{2,64}$')) error = 'Invalid attribute name'\n } // name validation\n }\n\n const handleSubmit = () => {\n if (formData) {\n onEdit(formData)\n }\n }\n\n const footer = (\n <div style={{ display: 'flex', width: '100%', flexDirection: 'row' }}>\n {onDelete && attribute && (\n <Button\n variant=\"danger\"\n label={'Delete attribute'}\n icon={'delete'}\n disabled={isUpdating}\n onClick={onDelete}\n />\n )}\n <Spacer />\n <SaveButton\n label={isNew ? 'Create Attribute' : 'Save Attribute'}\n icon={'check'}\n disabled={!!internalError || !formData}\n active={!internalError && !!formData}\n saving={isUpdating}\n onClick={handleSubmit}\n />\n </div>\n )\n\n let dataFields: (keyof AttributeData)[] = []\n\n // add global fields, only if scope are null (all) or the scope is included\n GLOBAL_FIELDS.forEach((globalField) => {\n // @ts-expect-error - project scope will never be found here?\n if (!globalField?.scope || globalField?.scope?.some((s) => formData?.scope?.includes(s))) {\n dataFields.push(globalField.value)\n }\n })\n\n if (formData?.data.type && TYPE_OPTIONS[formData.data.type]) {\n const typeOpt = TYPE_OPTIONS[formData.data.type]\n dataFields = [...dataFields, ...typeOpt.fields].filter((f) => !typeOpt.exclude?.includes(f))\n }\n\n type CustomFieldRenderer = (value: any, onChange: (newValue: any) => void) => JSX.Element | null\n const customFields: {\n enum: CustomFieldRenderer\n inherit: CustomFieldRenderer\n booleanDefault: CustomFieldRenderer\n } = {\n enum: (value = [], onChange) => (\n <EnumEditor\n values={value as AttributeEnumItem[]}\n onChange={(val) => {\n onChange(val?.length ? val : undefined)\n }}\n />\n ),\n inherit: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n booleanDefault: (value, onChange) => (\n <InputSwitch\n checked={value}\n onChange={(e) => onChange((e.target as HTMLInputElement).checked)}\n />\n ),\n }\n\n const handleTitleChange = (e: React.ChangeEvent) => {\n const v = (e.target as HTMLInputElement).value\n setData('title', v)\n\n if (isNew) {\n setTopLevelData('name', camelCase(v))\n }\n }\n\n return (\n <Dialog\n header={formData?.data?.title || formData?.name || 'New attribute'}\n footer={footer}\n onClose={onHide}\n isOpen={true}\n style={{ width: 700, zIndex: 999 }}\n size=\"full\"\n onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n handleSubmit()\n }\n }}\n >\n {formData && (\n <FormLayout>\n {!excludes.includes('title') && (\n <FormRow label={'Title'} key={'title'}>\n <InputText value={formData?.data['title']} onChange={handleTitleChange} autoFocus />\n </FormRow>\n )}\n {!excludes.includes('name') && (\n <FormRow label={'Name'} key={'name'}>\n <LockedInput\n value={formData.name}\n disabled={!isNew}\n onSubmit={(v) => setTopLevelData('name', v)}\n label=\"name\"\n />\n </FormRow>\n )}\n {!excludes.includes('scope') && (\n <FormRow label=\"Scope\">\n <Dropdown\n options={SCOPE_OPTIONS}\n disabled={formData.builtin}\n value={formData.scope || []}\n onChange={(v) => setTopLevelData('scope', v as AttributeModel['scope'])}\n multiSelect\n widthExpand\n />\n </FormRow>\n )}\n {!excludes.includes('type') && (\n <FormRow label=\"Type\">\n <Dropdown\n value={[formData?.data?.type]}\n disabled={formData.builtin}\n options={Object.values(TYPE_OPTIONS)}\n onChange={(v) => setData('type', v[0] as AttributeData['type'])}\n minSelected={1}\n widthExpand\n />\n </FormRow>\n )}\n {dataFields.map((field) => {\n // skip if field is excluded\n if (excludes.includes(field)) return null\n\n let fieldComp = null\n let fieldLabel = upperFirst(field)\n\n if (field === 'enum' || field === 'inherit') {\n const renderer = customFields[field as 'enum' | 'inherit']\n fieldComp = renderer(formData?.data[field], (value) => setData(field, value))\n } else if (field === 'default' && formData?.data?.type === 'boolean') {\n fieldComp = customFields['booleanDefault'](\n formData?.data[field] as boolean,\n (value) => setData(field, value as AttributeData['default']),\n )\n } else if (['ge', 'gt', 'le', 'lt'].includes(field)) {\n // ignore gt and lt\n if (['gt', 'lt'].includes(field)) return null\n fieldComp = (\n <MinMaxField\n value={formData?.data}\n isMin={field === 'ge'}\n isFloat={formData?.data?.type === 'float'}\n onChange={(v) => {\n const geValue = v.ge !== undefined ? Number(v.ge) : undefined\n const leValue = v.le !== undefined ? Number(v.le) : undefined\n\n if (\n // @ts-expect-error\n (v.ge !== undefined && isNaN(geValue)) ||\n // @ts-expect-error\n (v.le !== undefined && isNaN(leValue))\n ) {\n // Do not update the form if the value is not a valid number\n return\n }\n\n setFormData((d) => {\n if (!d || !d.data) return d\n const dt = { ...d.data, ...v }\n return { ...d, data: dt }\n })\n }}\n />\n )\n\n // rewrite field to min or max for display label\n fieldLabel = field === 'ge' ? 'Min' : 'Max'\n } else {\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const strValue = e.target.value\n switch (field) {\n case 'minLength':\n case 'maxLength':\n case 'minItems':\n case 'maxItems': {\n const num = parseInt(strValue, 10)\n setData(field, isNaN(num) ? undefined : num)\n break\n }\n default:\n // For string fields ('description', 'regex') or 'any' type fields ('example', 'default')\n setData(field, strValue as AttributeData[typeof field])\n break\n }\n }\n\n fieldComp = (\n <InputText\n value={String(formData?.data[field] ?? '')}\n onChange={handleInputChange}\n />\n )\n }\n\n return (\n <FormRow\n label={fieldLabel}\n key={field}\n style={{\n alignItems: 'flex-start',\n }}\n >\n {fieldComp}\n </FormRow>\n )\n })}\n <span>\n {(internalError || error) && (\n <span className=\"form-error-text\">{internalError || error}</span>\n )}\n </span>\n </FormLayout>\n )}\n </Dialog>\n )\n}\n"],"names":["jsxs","jsx","_a","_b"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("../../../../_virtual/jsx-runtime.cjs.js");
4
+ const styled = require("styled-components");
5
+ const BadgeWrapper = styled.div`
6
+ display: flex;
7
+ align-items: center;
8
+ justify-content: center;
9
+ gap: var(--base-gap-small);
10
+ padding: 0 4px;
11
+ margin-left: 12px;
12
+ `;
13
+ const BaseBadge = styled.span`
14
+ font-size: 0.8rem;
15
+ border-radius: 4px;
16
+ color: #161616;
17
+ padding: 0 4px;
18
+ `;
19
+ const WELL_KNOWN_BADGES = ["studio", "project", "producttion", "staging", "development"];
20
+ const Badge = ({ children, hl, style, ...props }) => {
21
+ const nstyle = { ...style };
22
+ if (hl) {
23
+ nstyle.backgroundColor = `var(--color-hl-${hl})`;
24
+ } else if (children && typeof children === "string" && WELL_KNOWN_BADGES.includes(children.toLowerCase())) {
25
+ nstyle.backgroundColor = `var(--color-hl-${children.toLowerCase()})`;
26
+ }
27
+ return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(BaseBadge, { style: nstyle, ...props, children });
28
+ };
29
+ exports.Badge = Badge;
30
+ exports.BadgeWrapper = BadgeWrapper;
31
+ //# sourceMappingURL=Badge.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.cjs.js","sources":["../../../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import styled from 'styled-components'\nimport { ReactNode, CSSProperties } from 'react'\n\nexport const BadgeWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--base-gap-small);\n padding: 0 4px;\n margin-left: 12px;\n`\n\nconst BaseBadge = styled.span`\n font-size: 0.8rem;\n border-radius: 4px;\n color: #161616;\n padding: 0 4px;\n`\n\nconst WELL_KNOWN_BADGES = ['studio', 'project', 'producttion', 'staging', 'development']\n\ninterface BadgeProps {\n children?: ReactNode\n hl?: string\n style?: CSSProperties\n [key: string]: any\n}\n\nexport const Badge = ({ children, hl, style, ...props }: BadgeProps) => {\n const nstyle: CSSProperties = { ...style }\n if (hl) {\n nstyle.backgroundColor = `var(--color-hl-${hl})`\n } else if (\n children &&\n typeof children === 'string' &&\n WELL_KNOWN_BADGES.includes(children.toLowerCase())\n ) {\n nstyle.backgroundColor = `var(--color-hl-${children.toLowerCase()})`\n }\n\n return (\n <BaseBadge style={nstyle} {...props}>\n {children}\n </BaseBadge>\n )\n}\n"],"names":[],"mappings":";;;;AAGO,MAAM,eAAe,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASnC,MAAM,YAAY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAOzB,MAAM,oBAAoB,CAAC,UAAU,WAAW,eAAe,WAAW,aAAa;AAS1E,MAAA,QAAQ,CAAC,EAAE,UAAU,IAAI,OAAO,GAAG,YAAwB;AAChE,QAAA,SAAwB,EAAE,GAAG,MAAM;AACzC,MAAI,IAAI;AACC,WAAA,kBAAkB,kBAAkB,EAAE;AAAA,EAAA,WAE7C,YACA,OAAO,aAAa,YACpB,kBAAkB,SAAS,SAAS,YAAY,CAAC,GACjD;AACA,WAAO,kBAAkB,kBAAkB,SAAS,YAAa,CAAA;AAAA,EAAA;AAGnE,0DACG,WAAU,EAAA,OAAO,QAAS,GAAG,OAC3B,UACH;AAEJ;;;"}
@@ -0,0 +1,31 @@
1
+ import { j as jsxRuntimeExports } from "../../../../_virtual/jsx-runtime.es.js";
2
+ import styled from "styled-components";
3
+ const BadgeWrapper = styled.div`
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ gap: var(--base-gap-small);
8
+ padding: 0 4px;
9
+ margin-left: 12px;
10
+ `;
11
+ const BaseBadge = styled.span`
12
+ font-size: 0.8rem;
13
+ border-radius: 4px;
14
+ color: #161616;
15
+ padding: 0 4px;
16
+ `;
17
+ const WELL_KNOWN_BADGES = ["studio", "project", "producttion", "staging", "development"];
18
+ const Badge = ({ children, hl, style, ...props }) => {
19
+ const nstyle = { ...style };
20
+ if (hl) {
21
+ nstyle.backgroundColor = `var(--color-hl-${hl})`;
22
+ } else if (children && typeof children === "string" && WELL_KNOWN_BADGES.includes(children.toLowerCase())) {
23
+ nstyle.backgroundColor = `var(--color-hl-${children.toLowerCase()})`;
24
+ }
25
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(BaseBadge, { style: nstyle, ...props, children });
26
+ };
27
+ export {
28
+ Badge,
29
+ BadgeWrapper
30
+ };
31
+ //# sourceMappingURL=Badge.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.es.js","sources":["../../../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import styled from 'styled-components'\nimport { ReactNode, CSSProperties } from 'react'\n\nexport const BadgeWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--base-gap-small);\n padding: 0 4px;\n margin-left: 12px;\n`\n\nconst BaseBadge = styled.span`\n font-size: 0.8rem;\n border-radius: 4px;\n color: #161616;\n padding: 0 4px;\n`\n\nconst WELL_KNOWN_BADGES = ['studio', 'project', 'producttion', 'staging', 'development']\n\ninterface BadgeProps {\n children?: ReactNode\n hl?: string\n style?: CSSProperties\n [key: string]: any\n}\n\nexport const Badge = ({ children, hl, style, ...props }: BadgeProps) => {\n const nstyle: CSSProperties = { ...style }\n if (hl) {\n nstyle.backgroundColor = `var(--color-hl-${hl})`\n } else if (\n children &&\n typeof children === 'string' &&\n WELL_KNOWN_BADGES.includes(children.toLowerCase())\n ) {\n nstyle.backgroundColor = `var(--color-hl-${children.toLowerCase()})`\n }\n\n return (\n <BaseBadge style={nstyle} {...props}>\n {children}\n </BaseBadge>\n )\n}\n"],"names":[],"mappings":";;AAGO,MAAM,eAAe,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASnC,MAAM,YAAY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAOzB,MAAM,oBAAoB,CAAC,UAAU,WAAW,eAAe,WAAW,aAAa;AAS1E,MAAA,QAAQ,CAAC,EAAE,UAAU,IAAI,OAAO,GAAG,YAAwB;AAChE,QAAA,SAAwB,EAAE,GAAG,MAAM;AACzC,MAAI,IAAI;AACC,WAAA,kBAAkB,kBAAkB,EAAE;AAAA,EAAA,WAE7C,YACA,OAAO,aAAa,YACpB,kBAAkB,SAAS,SAAS,YAAY,CAAC,GACjD;AACA,WAAO,kBAAkB,kBAAkB,SAAS,YAAa,CAAA;AAAA,EAAA;AAGnE,+CACG,WAAU,EAAA,OAAO,QAAS,GAAG,OAC3B,UACH;AAEJ;"}
@@ -37,6 +37,7 @@ require("../../api/generated/users.cjs.js");
37
37
  require("../../api/generated/versions.cjs.js");
38
38
  require("../../api/generated/workfiles.cjs.js");
39
39
  require("../../api/generated/ynputCloud.cjs.js");
40
+ require("../../api/generated/grouping.cjs.js");
40
41
  require("../../api/queries/actions/getActions.cjs.js");
41
42
  require("../../api/queries/activities/getActivities.cjs.js");
42
43
  require("../../api/queries/activities/updateActivities.cjs.js");
@@ -67,6 +68,7 @@ require("../../api/queries/users/getUsers.cjs.js");
67
68
  require("../../api/queries/users/updateUsers.cjs.js");
68
69
  require("../../api/queries/watchers/getWatchers.cjs.js");
69
70
  require("../../api/queries/permissions/getPermissions.cjs.js");
71
+ require("../../api/queries/grouping/getGrouping.cjs.js");
70
72
  const ayonReactComponents = require("@ynput/ayon-react-components");
71
73
  const DetailsDialog = ({
72
74
  projectName,
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsDialog.cjs.js","sources":["../../../../../src/components/DetailsDialog/DetailsDialog.tsx"],"sourcesContent":["import { toast } from 'react-toastify'\nimport { useGetEntityQuery } from '@shared/api'\nimport { Dialog } from '@ynput/ayon-react-components'\n\nexport interface DetailsDialogProps {\n projectName?: string\n entityType: string\n entityIds: string[]\n visible: boolean\n onHide: () => void\n}\n\nexport const DetailsDialog = ({\n projectName,\n entityType,\n entityIds,\n visible,\n onHide,\n}: DetailsDialogProps) => {\n const {\n data = {},\n isLoading,\n isError,\n error,\n } = useGetEntityQuery(\n { projectName, entityType: entityType, entityId: entityIds[0] },\n { skip: !visible },\n )\n\n if (isLoading)\n if (isError) {\n toast.error(`Unable to load detail. ${error}`)\n }\n\n if (!visible || data.length < 1) return null\n\n return (\n <Dialog\n isOpen={true}\n onClose={onHide}\n size=\"lg\"\n style={{ width: '50vw' }}\n header={`${entityType} detail`}\n >\n <pre>\n {!isLoading && !isError && JSON.stringify(data, null, 2)}\n {isLoading && 'loading...'}\n {isError && 'error...'}\n </pre>\n </Dialog>\n )\n}\n"],"names":["useGetEntityQuery","toast","jsx","Dialog"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AAClB,QAAA;AAAA,IACJ,OAAO,CAAC;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACEA,UAAA;AAAA,IACF,EAAE,aAAa,YAAwB,UAAU,UAAU,CAAC,EAAE;AAAA,IAC9D,EAAE,MAAM,CAAC,QAAQ;AAAA,EACnB;AAEI,MAAA,WAAA;AACF,QAAI,SAAS;AACLC,oBAAAA,MAAA,MAAM,0BAA0B,KAAK,EAAE;AAAA,IAAA;AAAA,EAC/C;AAEF,MAAI,CAAC,WAAW,KAAK,SAAS,EAAU,QAAA;AAGtC,SAAAC,2BAAA,kBAAA;AAAA,IAACC,oBAAA;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAK;AAAA,MACL,OAAO,EAAE,OAAO,OAAO;AAAA,MACvB,QAAQ,GAAG,UAAU;AAAA,MAErB,4DAAC,OACE,EAAA,UAAA;AAAA,QAAA,CAAC,aAAa,CAAC,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,QACtD,aAAa;AAAA,QACb,WAAW;AAAA,MAAA,EACd,CAAA;AAAA,IAAA;AAAA,EACF;AAEJ;;"}
1
+ {"version":3,"file":"DetailsDialog.cjs.js","sources":["../../../../../src/components/DetailsDialog/DetailsDialog.tsx"],"sourcesContent":["import { toast } from 'react-toastify'\nimport { useGetEntityQuery } from '@shared/api'\nimport { Dialog } from '@ynput/ayon-react-components'\n\nexport interface DetailsDialogProps {\n projectName?: string\n entityType: string\n entityIds: string[]\n visible: boolean\n onHide: () => void\n}\n\nexport const DetailsDialog = ({\n projectName,\n entityType,\n entityIds,\n visible,\n onHide,\n}: DetailsDialogProps) => {\n const {\n data = {},\n isLoading,\n isError,\n error,\n } = useGetEntityQuery(\n { projectName, entityType: entityType, entityId: entityIds[0] },\n { skip: !visible },\n )\n\n if (isLoading)\n if (isError) {\n toast.error(`Unable to load detail. ${error}`)\n }\n\n if (!visible || data.length < 1) return null\n\n return (\n <Dialog\n isOpen={true}\n onClose={onHide}\n size=\"lg\"\n style={{ width: '50vw' }}\n header={`${entityType} detail`}\n >\n <pre>\n {!isLoading && !isError && JSON.stringify(data, null, 2)}\n {isLoading && 'loading...'}\n {isError && 'error...'}\n </pre>\n </Dialog>\n )\n}\n"],"names":["useGetEntityQuery","toast","jsx","Dialog"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AAClB,QAAA;AAAA,IACJ,OAAO,CAAC;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACEA,UAAA;AAAA,IACF,EAAE,aAAa,YAAwB,UAAU,UAAU,CAAC,EAAE;AAAA,IAC9D,EAAE,MAAM,CAAC,QAAQ;AAAA,EACnB;AAEI,MAAA,WAAA;AACF,QAAI,SAAS;AACLC,oBAAAA,MAAA,MAAM,0BAA0B,KAAK,EAAE;AAAA,IAAA;AAAA,EAC/C;AAEF,MAAI,CAAC,WAAW,KAAK,SAAS,EAAU,QAAA;AAGtC,SAAAC,2BAAA,kBAAA;AAAA,IAACC,oBAAA;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAK;AAAA,MACL,OAAO,EAAE,OAAO,OAAO;AAAA,MACvB,QAAQ,GAAG,UAAU;AAAA,MAErB,4DAAC,OACE,EAAA,UAAA;AAAA,QAAA,CAAC,aAAa,CAAC,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,QACtD,aAAa;AAAA,QACb,WAAW;AAAA,MAAA,EACd,CAAA;AAAA,IAAA;AAAA,EACF;AAEJ;;"}
@@ -35,6 +35,7 @@ import "../../api/generated/users.es.js";
35
35
  import "../../api/generated/versions.es.js";
36
36
  import "../../api/generated/workfiles.es.js";
37
37
  import "../../api/generated/ynputCloud.es.js";
38
+ import "../../api/generated/grouping.es.js";
38
39
  import "../../api/queries/actions/getActions.es.js";
39
40
  import "../../api/queries/activities/getActivities.es.js";
40
41
  import "../../api/queries/activities/updateActivities.es.js";
@@ -65,6 +66,7 @@ import "../../api/queries/users/getUsers.es.js";
65
66
  import "../../api/queries/users/updateUsers.es.js";
66
67
  import "../../api/queries/watchers/getWatchers.es.js";
67
68
  import "../../api/queries/permissions/getPermissions.es.js";
69
+ import "../../api/queries/grouping/getGrouping.es.js";
68
70
  import { Dialog } from "@ynput/ayon-react-components";
69
71
  const DetailsDialog = ({
70
72
  projectName,
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsDialog.es.js","sources":["../../../../../src/components/DetailsDialog/DetailsDialog.tsx"],"sourcesContent":["import { toast } from 'react-toastify'\nimport { useGetEntityQuery } from '@shared/api'\nimport { Dialog } from '@ynput/ayon-react-components'\n\nexport interface DetailsDialogProps {\n projectName?: string\n entityType: string\n entityIds: string[]\n visible: boolean\n onHide: () => void\n}\n\nexport const DetailsDialog = ({\n projectName,\n entityType,\n entityIds,\n visible,\n onHide,\n}: DetailsDialogProps) => {\n const {\n data = {},\n isLoading,\n isError,\n error,\n } = useGetEntityQuery(\n { projectName, entityType: entityType, entityId: entityIds[0] },\n { skip: !visible },\n )\n\n if (isLoading)\n if (isError) {\n toast.error(`Unable to load detail. ${error}`)\n }\n\n if (!visible || data.length < 1) return null\n\n return (\n <Dialog\n isOpen={true}\n onClose={onHide}\n size=\"lg\"\n style={{ width: '50vw' }}\n header={`${entityType} detail`}\n >\n <pre>\n {!isLoading && !isError && JSON.stringify(data, null, 2)}\n {isLoading && 'loading...'}\n {isError && 'error...'}\n </pre>\n </Dialog>\n )\n}\n"],"names":["jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AAClB,QAAA;AAAA,IACJ,OAAO,CAAC;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAAA,IACF,EAAE,aAAa,YAAwB,UAAU,UAAU,CAAC,EAAE;AAAA,IAC9D,EAAE,MAAM,CAAC,QAAQ;AAAA,EACnB;AAEI,MAAA,WAAA;AACF,QAAI,SAAS;AACL,YAAA,MAAM,0BAA0B,KAAK,EAAE;AAAA,IAAA;AAAA,EAC/C;AAEF,MAAI,CAAC,WAAW,KAAK,SAAS,EAAU,QAAA;AAGtC,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAK;AAAA,MACL,OAAO,EAAE,OAAO,OAAO;AAAA,MACvB,QAAQ,GAAG,UAAU;AAAA,MAErB,iDAAC,OACE,EAAA,UAAA;AAAA,QAAA,CAAC,aAAa,CAAC,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,QACtD,aAAa;AAAA,QACb,WAAW;AAAA,MAAA,EACd,CAAA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
1
+ {"version":3,"file":"DetailsDialog.es.js","sources":["../../../../../src/components/DetailsDialog/DetailsDialog.tsx"],"sourcesContent":["import { toast } from 'react-toastify'\nimport { useGetEntityQuery } from '@shared/api'\nimport { Dialog } from '@ynput/ayon-react-components'\n\nexport interface DetailsDialogProps {\n projectName?: string\n entityType: string\n entityIds: string[]\n visible: boolean\n onHide: () => void\n}\n\nexport const DetailsDialog = ({\n projectName,\n entityType,\n entityIds,\n visible,\n onHide,\n}: DetailsDialogProps) => {\n const {\n data = {},\n isLoading,\n isError,\n error,\n } = useGetEntityQuery(\n { projectName, entityType: entityType, entityId: entityIds[0] },\n { skip: !visible },\n )\n\n if (isLoading)\n if (isError) {\n toast.error(`Unable to load detail. ${error}`)\n }\n\n if (!visible || data.length < 1) return null\n\n return (\n <Dialog\n isOpen={true}\n onClose={onHide}\n size=\"lg\"\n style={{ width: '50vw' }}\n header={`${entityType} detail`}\n >\n <pre>\n {!isLoading && !isError && JSON.stringify(data, null, 2)}\n {isLoading && 'loading...'}\n {isError && 'error...'}\n </pre>\n </Dialog>\n )\n}\n"],"names":["jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA0B;AAClB,QAAA;AAAA,IACJ,OAAO,CAAC;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAAA,IACF,EAAE,aAAa,YAAwB,UAAU,UAAU,CAAC,EAAE;AAAA,IAC9D,EAAE,MAAM,CAAC,QAAQ;AAAA,EACnB;AAEI,MAAA,WAAA;AACF,QAAI,SAAS;AACL,YAAA,MAAM,0BAA0B,KAAK,EAAE;AAAA,IAAA;AAAA,EAC/C;AAEF,MAAI,CAAC,WAAW,KAAK,SAAS,EAAU,QAAA;AAGtC,SAAAA,kCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAK;AAAA,MACL,OAAO,EAAE,OAAO,OAAO;AAAA,MACvB,QAAQ,GAAG,UAAU;AAAA,MAErB,iDAAC,OACE,EAAA,UAAA;AAAA,QAAA,CAAC,aAAa,CAAC,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,QACtD,aAAa;AAAA,QACb,WAAW;AAAA,MAAA,EACd,CAAA;AAAA,IAAA;AAAA,EACF;AAEJ;"}
@@ -42,6 +42,7 @@ require("../../api/generated/users.cjs.js");
42
42
  require("../../api/generated/versions.cjs.js");
43
43
  require("../../api/generated/workfiles.cjs.js");
44
44
  require("../../api/generated/ynputCloud.cjs.js");
45
+ require("../../api/generated/grouping.cjs.js");
45
46
  require("../../api/queries/actions/getActions.cjs.js");
46
47
  require("../../api/queries/activities/getActivities.cjs.js");
47
48
  require("../../api/queries/activities/updateActivities.cjs.js");
@@ -72,6 +73,7 @@ require("../../api/queries/users/getUsers.cjs.js");
72
73
  require("../../api/queries/users/updateUsers.cjs.js");
73
74
  require("../../api/queries/watchers/getWatchers.cjs.js");
74
75
  require("../../api/queries/permissions/getPermissions.cjs.js");
76
+ require("../../api/queries/grouping/getGrouping.cjs.js");
75
77
  const DetailsPanelAttributesEditor = require("./DetailsPanelAttributesEditor.cjs.js");
76
78
  require("../../context/RemoteModulesContext.cjs.js");
77
79
  require("../../../../_virtual/runtime.cjs.js");
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsPanelAttributes.cjs.js","sources":["../../../../../src/components/DetailsPanelAttributes/DetailsPanelAttributes.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { Section } from '@ynput/ayon-react-components'\nimport { getMixedState } from '@shared/util'\nimport { useGetSiteInfoQuery, useGetProjectQuery } from '@shared/api'\nimport {\n DetailsPanelAttributesEditor,\n AttributeField,\n DetailsPanelAttributesEditorProps,\n} from './DetailsPanelAttributesEditor'\nimport { useEntityUpdate } from '@shared/hooks'\nimport { upperFirst } from 'lodash'\nimport type { DetailsPanelEntityData } from '@shared/api'\n\ntype EntityForm = {\n id: string\n name: string\n label: string | null | undefined\n entityType: 'folder' | 'task' | 'product' | 'version'\n taskType?: string\n folderType?: string\n productType?: string\n tags: string[]\n status: string\n updatedAt: string\n createdAt: string\n projectName: string\n path: string\n // attribs\n [key: string]: string | number | boolean | Date | any[] | Record<string, any> | undefined | null\n}\n\n// all fields in entity form are visible\nconst visibleFields: Array<keyof EntityForm> = [\n 'id',\n 'name',\n 'label',\n 'entityType',\n 'taskType',\n 'folderType',\n 'productType',\n 'tags',\n 'status',\n 'updatedAt',\n 'createdAt',\n 'projectName',\n 'path',\n]\n\nconst readOnlyFields: Array<keyof EntityForm> = [\n 'id',\n 'entityType',\n 'projectName',\n 'path',\n 'name',\n 'createdAt',\n 'updatedAt',\n]\n\nexport type DetailsPanelAttributesProps = {\n entities: DetailsPanelEntityData[]\n isLoading: boolean\n}\n\nexport const DetailsPanelAttributes = ({\n entities = [],\n isLoading,\n}: DetailsPanelAttributesProps) => {\n // form for project data\n const [mixedFields, setMixedFields] = useState<string[]>([])\n const [formData, setFormData] = useState<EntityForm | null>(null)\n\n const buildInitialForm = () => {\n // Group entity values by field name\n const valuesByField: Record<string, any[]> = {}\n // Track which fields have mixed values\n const mixedFieldsSet = new Set<string>()\n\n entities.forEach((entity) => {\n const mappedEntity: EntityForm = {\n id: entity.id,\n name: entity.name,\n label: entity.label,\n entityType: entity.entityType as 'folder' | 'task' | 'product' | 'version',\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n projectName: entity.projectName,\n status: entity.status,\n tags: entity.tags || [],\n path: entity.folder?.path || '',\n folderType: entity.folder?.folderType,\n productType: entity.product?.productType,\n taskType: entity.task?.taskType,\n }\n\n // Process regular fields\n Object.keys(mappedEntity).forEach((key) => {\n if (visibleFields.includes(key as keyof EntityForm)) {\n valuesByField[key] = valuesByField[key] || []\n valuesByField[key].push((mappedEntity as any)[key])\n }\n })\n\n // Process attrib fields\n if (entity.attrib) {\n Object.keys(entity.attrib).forEach((key) => {\n const attribKey = `attrib.${key}`\n valuesByField[attribKey] = valuesByField[attribKey] || []\n valuesByField[attribKey].push(entity.attrib?.[key])\n })\n }\n })\n\n // Apply getMixedState to each field\n const formData = Object.entries(valuesByField).reduce((result, [key, values]) => {\n const { value, isMixed } = getMixedState(values)\n result[key] = value\n\n // Add to mixedFields if this field has mixed values\n if (isMixed) {\n mixedFieldsSet.add(key)\n }\n\n return result\n }, {} as Record<string, any>)\n\n setFormData(formData as EntityForm)\n // Update the mixedFields state with all fields that have mixed values\n setMixedFields(Array.from(mixedFieldsSet))\n }\n\n useEffect(() => {\n if (isLoading || entities.length === 0) return\n buildInitialForm()\n }, [entities, isLoading])\n\n const { data: projectData } = useGetProjectQuery(\n { projectName: formData?.projectName || '' },\n { skip: !formData?.projectName || mixedFields.includes('projectName') },\n )\n const { folderTypes = [], taskTypes = [], statuses = [], tags = [] } = projectData || {}\n\n const { data: info } = useGetSiteInfoQuery({ full: true })\n const { attributes = [] } = info || {}\n\n // build the fields array for defining the schema\n const fields: AttributeField[] = useMemo(() => {\n // Create custom fields as proper AttributeModel objects\n const customFieldsData: AttributeField[] = [\n {\n name: 'label',\n data: {\n type: 'string',\n title: 'Label',\n description: 'Used as a nice visual label only',\n },\n },\n {\n name: 'folderType',\n hidden: formData?.entityType !== 'folder',\n data: {\n type: 'string',\n title: 'Folder Type',\n description: 'Type of the folder',\n enum: folderTypes.map((type) => ({\n value: type.name,\n label: type.name,\n icon: type.icon,\n })),\n },\n },\n {\n name: 'taskType',\n hidden: formData?.entityType !== 'task',\n data: {\n type: 'string',\n title: 'Task Type',\n description: 'Type of the task',\n enum: taskTypes.map((type) => ({\n value: type.name,\n label: type.name,\n icon: type.icon,\n })),\n },\n },\n {\n name: 'status',\n data: {\n type: 'string',\n title: 'Status',\n description: 'The state the entity is in, is it approved or in progress etc.',\n enum: statuses.map((status) => ({\n value: status.name,\n label: status.name,\n icon: status.icon,\n color: status.color,\n })),\n },\n },\n {\n name: 'tags',\n data: {\n type: 'list_of_strings',\n title: 'Tags',\n enum: tags.map((tag) => ({\n value: tag.name,\n label: tag.name,\n color: tag.color,\n })),\n },\n },\n ]\n\n // Filter API attributes based on entity type\n const apiAttributesData: AttributeField[] = formData?.entityType\n ? attributes\n .filter((attr) => attr.scope?.includes(formData.entityType))\n .map((attr) => ({\n name: 'attrib.' + attr.name,\n data: attr.data,\n }))\n : []\n\n const readOnlyFieldsData: AttributeField[] = readOnlyFields.map((field) => ({\n name: field as string,\n readonly: true,\n data: {\n type: 'string',\n title: upperFirst(field as string),\n },\n }))\n\n // Combine custom fields with API attributes\n const allFieldsData = [...customFieldsData, ...apiAttributesData, ...readOnlyFieldsData]\n const sortToTop = ['path', 'name']\n const sortedFieldsData = [...allFieldsData].sort((a, b) => {\n const aIndex = sortToTop.indexOf(a.name)\n const bIndex = sortToTop.indexOf(b.name)\n if (aIndex === -1 && bIndex === -1) return 0\n if (aIndex === -1) return 1\n if (bIndex === -1) return -1\n return aIndex - bIndex\n })\n\n return sortedFieldsData\n }, [attributes, folderTypes, taskTypes, statuses, tags, formData?.entityType])\n\n //\n let enableEditing = false\n if (\n ['task', 'folder'].includes(formData?.entityType || '') &&\n !mixedFields.includes('projectName')\n ) {\n enableEditing = true\n }\n\n const entityType = formData?.entityType || 'task'\n const projectName = formData?.projectName || ''\n\n // Setup entity update functionality\n const { updateEntity } = useEntityUpdate({\n entities: entities.map((entity) => ({\n id: entity.id,\n projectName: entity.projectName || '',\n folderId: entity.folder?.id,\n users: entity.task?.assignees || [],\n })),\n entityType,\n })\n\n const handleChange: DetailsPanelAttributesEditorProps['onChange'] = (key, value) => {\n if (key.startsWith('attrib.')) {\n value = {\n [key.replace('attrib.', '')]: value,\n }\n key = 'attrib'\n }\n\n console.log('handleChange', key, value)\n\n // update the form data\n // @ts-ignore\n setFormData((prev) => ({\n ...prev,\n [key]: value,\n }))\n\n // update the entity in database\n updateEntity(key, value)\n }\n\n return (\n <Section style={{ padding: 8, overflow: 'hidden' }}>\n <DetailsPanelAttributesEditor\n fields={fields}\n form={formData || {}}\n mixedFields={mixedFields}\n isLoading={isLoading}\n enableEditing={enableEditing}\n onChange={handleChange}\n />\n </Section>\n )\n}\n"],"names":["useState","_a","formData","getMixedState","useEffect","useGetProjectQuery","useGetSiteInfoQuery","useMemo","upperFirst","useEntityUpdate","jsx","Section","DetailsPanelAttributesEditor"],"mappings":"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"}
1
+ {"version":3,"file":"DetailsPanelAttributes.cjs.js","sources":["../../../../../src/components/DetailsPanelAttributes/DetailsPanelAttributes.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { Section } from '@ynput/ayon-react-components'\nimport { getMixedState } from '@shared/util'\nimport { useGetSiteInfoQuery, useGetProjectQuery } from '@shared/api'\nimport {\n DetailsPanelAttributesEditor,\n AttributeField,\n DetailsPanelAttributesEditorProps,\n} from './DetailsPanelAttributesEditor'\nimport { useEntityUpdate } from '@shared/hooks'\nimport { upperFirst } from 'lodash'\nimport type { DetailsPanelEntityData } from '@shared/api'\n\ntype EntityForm = {\n id: string\n name: string\n label: string | null | undefined\n entityType: 'folder' | 'task' | 'product' | 'version'\n taskType?: string\n folderType?: string\n productType?: string\n tags: string[]\n status: string\n updatedAt: string\n createdAt: string\n projectName: string\n path: string\n // attribs\n [key: string]: string | number | boolean | Date | any[] | Record<string, any> | undefined | null\n}\n\n// all fields in entity form are visible\nconst visibleFields: Array<keyof EntityForm> = [\n 'id',\n 'name',\n 'label',\n 'entityType',\n 'taskType',\n 'folderType',\n 'productType',\n 'tags',\n 'status',\n 'updatedAt',\n 'createdAt',\n 'projectName',\n 'path',\n]\n\nconst readOnlyFields: Array<keyof EntityForm> = [\n 'id',\n 'entityType',\n 'projectName',\n 'path',\n 'name',\n 'createdAt',\n 'updatedAt',\n]\n\nexport type DetailsPanelAttributesProps = {\n entities: DetailsPanelEntityData[]\n isLoading: boolean\n}\n\nexport const DetailsPanelAttributes = ({\n entities = [],\n isLoading,\n}: DetailsPanelAttributesProps) => {\n // form for project data\n const [mixedFields, setMixedFields] = useState<string[]>([])\n const [formData, setFormData] = useState<EntityForm | null>(null)\n\n const buildInitialForm = () => {\n // Group entity values by field name\n const valuesByField: Record<string, any[]> = {}\n // Track which fields have mixed values\n const mixedFieldsSet = new Set<string>()\n\n entities.forEach((entity) => {\n const mappedEntity: EntityForm = {\n id: entity.id,\n name: entity.name,\n label: entity.label,\n entityType: entity.entityType as 'folder' | 'task' | 'product' | 'version',\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n projectName: entity.projectName,\n status: entity.status,\n tags: entity.tags || [],\n path: entity.folder?.path || '',\n folderType: entity.folder?.folderType,\n productType: entity.product?.productType,\n taskType: entity.task?.taskType,\n }\n\n // Process regular fields\n Object.keys(mappedEntity).forEach((key) => {\n if (visibleFields.includes(key as keyof EntityForm)) {\n valuesByField[key] = valuesByField[key] || []\n valuesByField[key].push((mappedEntity as any)[key])\n }\n })\n\n // Process attrib fields\n if (entity.attrib) {\n Object.keys(entity.attrib).forEach((key) => {\n const attribKey = `attrib.${key}`\n valuesByField[attribKey] = valuesByField[attribKey] || []\n valuesByField[attribKey].push(entity.attrib?.[key])\n })\n }\n })\n\n // Apply getMixedState to each field\n const formData = Object.entries(valuesByField).reduce((result, [key, values]) => {\n const { value, isMixed } = getMixedState(values)\n result[key] = value\n\n // Add to mixedFields if this field has mixed values\n if (isMixed) {\n mixedFieldsSet.add(key)\n }\n\n return result\n }, {} as Record<string, any>)\n\n setFormData(formData as EntityForm)\n // Update the mixedFields state with all fields that have mixed values\n setMixedFields(Array.from(mixedFieldsSet))\n }\n\n useEffect(() => {\n if (isLoading || entities.length === 0) return\n buildInitialForm()\n }, [entities, isLoading])\n\n const { data: projectData } = useGetProjectQuery(\n { projectName: formData?.projectName || '' },\n { skip: !formData?.projectName || mixedFields.includes('projectName') },\n )\n const { folderTypes = [], taskTypes = [], statuses = [], tags = [] } = projectData || {}\n\n const { data: info } = useGetSiteInfoQuery({ full: true })\n const { attributes = [] } = info || {}\n\n // build the fields array for defining the schema\n const fields: AttributeField[] = useMemo(() => {\n // Create custom fields as proper AttributeModel objects\n const customFieldsData: AttributeField[] = [\n {\n name: 'label',\n data: {\n type: 'string',\n title: 'Label',\n description: 'Used as a nice visual label only',\n },\n },\n {\n name: 'folderType',\n hidden: formData?.entityType !== 'folder',\n data: {\n type: 'string',\n title: 'Folder Type',\n description: 'Type of the folder',\n enum: folderTypes.map((type) => ({\n value: type.name,\n label: type.name,\n icon: type.icon,\n })),\n },\n },\n {\n name: 'taskType',\n hidden: formData?.entityType !== 'task',\n data: {\n type: 'string',\n title: 'Task Type',\n description: 'Type of the task',\n enum: taskTypes.map((type) => ({\n value: type.name,\n label: type.name,\n icon: type.icon,\n })),\n },\n },\n {\n name: 'status',\n data: {\n type: 'string',\n title: 'Status',\n description: 'The state the entity is in, is it approved or in progress etc.',\n enum: statuses.map((status) => ({\n value: status.name,\n label: status.name,\n icon: status.icon,\n color: status.color,\n })),\n },\n },\n {\n name: 'tags',\n data: {\n type: 'list_of_strings',\n title: 'Tags',\n enum: tags.map((tag) => ({\n value: tag.name,\n label: tag.name,\n color: tag.color,\n })),\n },\n },\n ]\n\n // Filter API attributes based on entity type\n const apiAttributesData: AttributeField[] = formData?.entityType\n ? attributes\n .filter((attr) => attr.scope?.includes(formData.entityType))\n .map((attr) => ({\n name: 'attrib.' + attr.name,\n data: attr.data,\n }))\n : []\n\n const readOnlyFieldsData: AttributeField[] = readOnlyFields.map((field) => ({\n name: field as string,\n readonly: true,\n data: {\n type: 'string',\n title: upperFirst(field as string),\n },\n }))\n\n // Combine custom fields with API attributes\n const allFieldsData = [...customFieldsData, ...apiAttributesData, ...readOnlyFieldsData]\n const sortToTop = ['path', 'name']\n const sortedFieldsData = [...allFieldsData].sort((a, b) => {\n const aIndex = sortToTop.indexOf(a.name)\n const bIndex = sortToTop.indexOf(b.name)\n if (aIndex === -1 && bIndex === -1) return 0\n if (aIndex === -1) return 1\n if (bIndex === -1) return -1\n return aIndex - bIndex\n })\n\n return sortedFieldsData\n }, [attributes, folderTypes, taskTypes, statuses, tags, formData?.entityType])\n\n //\n let enableEditing = false\n if (\n ['task', 'folder'].includes(formData?.entityType || '') &&\n !mixedFields.includes('projectName')\n ) {\n enableEditing = true\n }\n\n const entityType = formData?.entityType || 'task'\n const projectName = formData?.projectName || ''\n\n // Setup entity update functionality\n const { updateEntity } = useEntityUpdate({\n entities: entities.map((entity) => ({\n id: entity.id,\n projectName: entity.projectName || '',\n folderId: entity.folder?.id,\n users: entity.task?.assignees || [],\n })),\n entityType,\n })\n\n const handleChange: DetailsPanelAttributesEditorProps['onChange'] = (key, value) => {\n if (key.startsWith('attrib.')) {\n value = {\n [key.replace('attrib.', '')]: value,\n }\n key = 'attrib'\n }\n\n console.log('handleChange', key, value)\n\n // update the form data\n // @ts-ignore\n setFormData((prev) => ({\n ...prev,\n [key]: value,\n }))\n\n // update the entity in database\n updateEntity(key, value)\n }\n\n return (\n <Section style={{ padding: 8, overflow: 'hidden' }}>\n <DetailsPanelAttributesEditor\n fields={fields}\n form={formData || {}}\n mixedFields={mixedFields}\n isLoading={isLoading}\n enableEditing={enableEditing}\n onChange={handleChange}\n />\n </Section>\n )\n}\n"],"names":["useState","_a","formData","getMixedState","useEffect","useGetProjectQuery","useGetSiteInfoQuery","useMemo","upperFirst","useEntityUpdate","jsx","Section","DetailsPanelAttributesEditor"],"mappings":"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"}
@@ -40,6 +40,7 @@ import "../../api/generated/users.es.js";
40
40
  import "../../api/generated/versions.es.js";
41
41
  import "../../api/generated/workfiles.es.js";
42
42
  import "../../api/generated/ynputCloud.es.js";
43
+ import "../../api/generated/grouping.es.js";
43
44
  import "../../api/queries/actions/getActions.es.js";
44
45
  import "../../api/queries/activities/getActivities.es.js";
45
46
  import "../../api/queries/activities/updateActivities.es.js";
@@ -70,6 +71,7 @@ import "../../api/queries/users/getUsers.es.js";
70
71
  import "../../api/queries/users/updateUsers.es.js";
71
72
  import "../../api/queries/watchers/getWatchers.es.js";
72
73
  import "../../api/queries/permissions/getPermissions.es.js";
74
+ import "../../api/queries/grouping/getGrouping.es.js";
73
75
  import { DetailsPanelAttributesEditor } from "./DetailsPanelAttributesEditor.es.js";
74
76
  import "../../context/RemoteModulesContext.es.js";
75
77
  import "../../../../_virtual/runtime.es.js";
@@ -1 +1 @@
1
- {"version":3,"file":"DetailsPanelAttributes.es.js","sources":["../../../../../src/components/DetailsPanelAttributes/DetailsPanelAttributes.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { Section } from '@ynput/ayon-react-components'\nimport { getMixedState } from '@shared/util'\nimport { useGetSiteInfoQuery, useGetProjectQuery } from '@shared/api'\nimport {\n DetailsPanelAttributesEditor,\n AttributeField,\n DetailsPanelAttributesEditorProps,\n} from './DetailsPanelAttributesEditor'\nimport { useEntityUpdate } from '@shared/hooks'\nimport { upperFirst } from 'lodash'\nimport type { DetailsPanelEntityData } from '@shared/api'\n\ntype EntityForm = {\n id: string\n name: string\n label: string | null | undefined\n entityType: 'folder' | 'task' | 'product' | 'version'\n taskType?: string\n folderType?: string\n productType?: string\n tags: string[]\n status: string\n updatedAt: string\n createdAt: string\n projectName: string\n path: string\n // attribs\n [key: string]: string | number | boolean | Date | any[] | Record<string, any> | undefined | null\n}\n\n// all fields in entity form are visible\nconst visibleFields: Array<keyof EntityForm> = [\n 'id',\n 'name',\n 'label',\n 'entityType',\n 'taskType',\n 'folderType',\n 'productType',\n 'tags',\n 'status',\n 'updatedAt',\n 'createdAt',\n 'projectName',\n 'path',\n]\n\nconst readOnlyFields: Array<keyof EntityForm> = [\n 'id',\n 'entityType',\n 'projectName',\n 'path',\n 'name',\n 'createdAt',\n 'updatedAt',\n]\n\nexport type DetailsPanelAttributesProps = {\n entities: DetailsPanelEntityData[]\n isLoading: boolean\n}\n\nexport const DetailsPanelAttributes = ({\n entities = [],\n isLoading,\n}: DetailsPanelAttributesProps) => {\n // form for project data\n const [mixedFields, setMixedFields] = useState<string[]>([])\n const [formData, setFormData] = useState<EntityForm | null>(null)\n\n const buildInitialForm = () => {\n // Group entity values by field name\n const valuesByField: Record<string, any[]> = {}\n // Track which fields have mixed values\n const mixedFieldsSet = new Set<string>()\n\n entities.forEach((entity) => {\n const mappedEntity: EntityForm = {\n id: entity.id,\n name: entity.name,\n label: entity.label,\n entityType: entity.entityType as 'folder' | 'task' | 'product' | 'version',\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n projectName: entity.projectName,\n status: entity.status,\n tags: entity.tags || [],\n path: entity.folder?.path || '',\n folderType: entity.folder?.folderType,\n productType: entity.product?.productType,\n taskType: entity.task?.taskType,\n }\n\n // Process regular fields\n Object.keys(mappedEntity).forEach((key) => {\n if (visibleFields.includes(key as keyof EntityForm)) {\n valuesByField[key] = valuesByField[key] || []\n valuesByField[key].push((mappedEntity as any)[key])\n }\n })\n\n // Process attrib fields\n if (entity.attrib) {\n Object.keys(entity.attrib).forEach((key) => {\n const attribKey = `attrib.${key}`\n valuesByField[attribKey] = valuesByField[attribKey] || []\n valuesByField[attribKey].push(entity.attrib?.[key])\n })\n }\n })\n\n // Apply getMixedState to each field\n const formData = Object.entries(valuesByField).reduce((result, [key, values]) => {\n const { value, isMixed } = getMixedState(values)\n result[key] = value\n\n // Add to mixedFields if this field has mixed values\n if (isMixed) {\n mixedFieldsSet.add(key)\n }\n\n return result\n }, {} as Record<string, any>)\n\n setFormData(formData as EntityForm)\n // Update the mixedFields state with all fields that have mixed values\n setMixedFields(Array.from(mixedFieldsSet))\n }\n\n useEffect(() => {\n if (isLoading || entities.length === 0) return\n buildInitialForm()\n }, [entities, isLoading])\n\n const { data: projectData } = useGetProjectQuery(\n { projectName: formData?.projectName || '' },\n { skip: !formData?.projectName || mixedFields.includes('projectName') },\n )\n const { folderTypes = [], taskTypes = [], statuses = [], tags = [] } = projectData || {}\n\n const { data: info } = useGetSiteInfoQuery({ full: true })\n const { attributes = [] } = info || {}\n\n // build the fields array for defining the schema\n const fields: AttributeField[] = useMemo(() => {\n // Create custom fields as proper AttributeModel objects\n const customFieldsData: AttributeField[] = [\n {\n name: 'label',\n data: {\n type: 'string',\n title: 'Label',\n description: 'Used as a nice visual label only',\n },\n },\n {\n name: 'folderType',\n hidden: formData?.entityType !== 'folder',\n data: {\n type: 'string',\n title: 'Folder Type',\n description: 'Type of the folder',\n enum: folderTypes.map((type) => ({\n value: type.name,\n label: type.name,\n icon: type.icon,\n })),\n },\n },\n {\n name: 'taskType',\n hidden: formData?.entityType !== 'task',\n data: {\n type: 'string',\n title: 'Task Type',\n description: 'Type of the task',\n enum: taskTypes.map((type) => ({\n value: type.name,\n label: type.name,\n icon: type.icon,\n })),\n },\n },\n {\n name: 'status',\n data: {\n type: 'string',\n title: 'Status',\n description: 'The state the entity is in, is it approved or in progress etc.',\n enum: statuses.map((status) => ({\n value: status.name,\n label: status.name,\n icon: status.icon,\n color: status.color,\n })),\n },\n },\n {\n name: 'tags',\n data: {\n type: 'list_of_strings',\n title: 'Tags',\n enum: tags.map((tag) => ({\n value: tag.name,\n label: tag.name,\n color: tag.color,\n })),\n },\n },\n ]\n\n // Filter API attributes based on entity type\n const apiAttributesData: AttributeField[] = formData?.entityType\n ? attributes\n .filter((attr) => attr.scope?.includes(formData.entityType))\n .map((attr) => ({\n name: 'attrib.' + attr.name,\n data: attr.data,\n }))\n : []\n\n const readOnlyFieldsData: AttributeField[] = readOnlyFields.map((field) => ({\n name: field as string,\n readonly: true,\n data: {\n type: 'string',\n title: upperFirst(field as string),\n },\n }))\n\n // Combine custom fields with API attributes\n const allFieldsData = [...customFieldsData, ...apiAttributesData, ...readOnlyFieldsData]\n const sortToTop = ['path', 'name']\n const sortedFieldsData = [...allFieldsData].sort((a, b) => {\n const aIndex = sortToTop.indexOf(a.name)\n const bIndex = sortToTop.indexOf(b.name)\n if (aIndex === -1 && bIndex === -1) return 0\n if (aIndex === -1) return 1\n if (bIndex === -1) return -1\n return aIndex - bIndex\n })\n\n return sortedFieldsData\n }, [attributes, folderTypes, taskTypes, statuses, tags, formData?.entityType])\n\n //\n let enableEditing = false\n if (\n ['task', 'folder'].includes(formData?.entityType || '') &&\n !mixedFields.includes('projectName')\n ) {\n enableEditing = true\n }\n\n const entityType = formData?.entityType || 'task'\n const projectName = formData?.projectName || ''\n\n // Setup entity update functionality\n const { updateEntity } = useEntityUpdate({\n entities: entities.map((entity) => ({\n id: entity.id,\n projectName: entity.projectName || '',\n folderId: entity.folder?.id,\n users: entity.task?.assignees || [],\n })),\n entityType,\n })\n\n const handleChange: DetailsPanelAttributesEditorProps['onChange'] = (key, value) => {\n if (key.startsWith('attrib.')) {\n value = {\n [key.replace('attrib.', '')]: value,\n }\n key = 'attrib'\n }\n\n console.log('handleChange', key, value)\n\n // update the form data\n // @ts-ignore\n setFormData((prev) => ({\n ...prev,\n [key]: value,\n }))\n\n // update the entity in database\n updateEntity(key, value)\n }\n\n return (\n <Section style={{ padding: 8, overflow: 'hidden' }}>\n <DetailsPanelAttributesEditor\n fields={fields}\n form={formData || {}}\n mixedFields={mixedFields}\n isLoading={isLoading}\n enableEditing={enableEditing}\n onChange={handleChange}\n />\n </Section>\n )\n}\n"],"names":["_a","formData","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"DetailsPanelAttributes.es.js","sources":["../../../../../src/components/DetailsPanelAttributes/DetailsPanelAttributes.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react'\nimport { Section } from '@ynput/ayon-react-components'\nimport { getMixedState } from '@shared/util'\nimport { useGetSiteInfoQuery, useGetProjectQuery } from '@shared/api'\nimport {\n DetailsPanelAttributesEditor,\n AttributeField,\n DetailsPanelAttributesEditorProps,\n} from './DetailsPanelAttributesEditor'\nimport { useEntityUpdate } from '@shared/hooks'\nimport { upperFirst } from 'lodash'\nimport type { DetailsPanelEntityData } from '@shared/api'\n\ntype EntityForm = {\n id: string\n name: string\n label: string | null | undefined\n entityType: 'folder' | 'task' | 'product' | 'version'\n taskType?: string\n folderType?: string\n productType?: string\n tags: string[]\n status: string\n updatedAt: string\n createdAt: string\n projectName: string\n path: string\n // attribs\n [key: string]: string | number | boolean | Date | any[] | Record<string, any> | undefined | null\n}\n\n// all fields in entity form are visible\nconst visibleFields: Array<keyof EntityForm> = [\n 'id',\n 'name',\n 'label',\n 'entityType',\n 'taskType',\n 'folderType',\n 'productType',\n 'tags',\n 'status',\n 'updatedAt',\n 'createdAt',\n 'projectName',\n 'path',\n]\n\nconst readOnlyFields: Array<keyof EntityForm> = [\n 'id',\n 'entityType',\n 'projectName',\n 'path',\n 'name',\n 'createdAt',\n 'updatedAt',\n]\n\nexport type DetailsPanelAttributesProps = {\n entities: DetailsPanelEntityData[]\n isLoading: boolean\n}\n\nexport const DetailsPanelAttributes = ({\n entities = [],\n isLoading,\n}: DetailsPanelAttributesProps) => {\n // form for project data\n const [mixedFields, setMixedFields] = useState<string[]>([])\n const [formData, setFormData] = useState<EntityForm | null>(null)\n\n const buildInitialForm = () => {\n // Group entity values by field name\n const valuesByField: Record<string, any[]> = {}\n // Track which fields have mixed values\n const mixedFieldsSet = new Set<string>()\n\n entities.forEach((entity) => {\n const mappedEntity: EntityForm = {\n id: entity.id,\n name: entity.name,\n label: entity.label,\n entityType: entity.entityType as 'folder' | 'task' | 'product' | 'version',\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n projectName: entity.projectName,\n status: entity.status,\n tags: entity.tags || [],\n path: entity.folder?.path || '',\n folderType: entity.folder?.folderType,\n productType: entity.product?.productType,\n taskType: entity.task?.taskType,\n }\n\n // Process regular fields\n Object.keys(mappedEntity).forEach((key) => {\n if (visibleFields.includes(key as keyof EntityForm)) {\n valuesByField[key] = valuesByField[key] || []\n valuesByField[key].push((mappedEntity as any)[key])\n }\n })\n\n // Process attrib fields\n if (entity.attrib) {\n Object.keys(entity.attrib).forEach((key) => {\n const attribKey = `attrib.${key}`\n valuesByField[attribKey] = valuesByField[attribKey] || []\n valuesByField[attribKey].push(entity.attrib?.[key])\n })\n }\n })\n\n // Apply getMixedState to each field\n const formData = Object.entries(valuesByField).reduce((result, [key, values]) => {\n const { value, isMixed } = getMixedState(values)\n result[key] = value\n\n // Add to mixedFields if this field has mixed values\n if (isMixed) {\n mixedFieldsSet.add(key)\n }\n\n return result\n }, {} as Record<string, any>)\n\n setFormData(formData as EntityForm)\n // Update the mixedFields state with all fields that have mixed values\n setMixedFields(Array.from(mixedFieldsSet))\n }\n\n useEffect(() => {\n if (isLoading || entities.length === 0) return\n buildInitialForm()\n }, [entities, isLoading])\n\n const { data: projectData } = useGetProjectQuery(\n { projectName: formData?.projectName || '' },\n { skip: !formData?.projectName || mixedFields.includes('projectName') },\n )\n const { folderTypes = [], taskTypes = [], statuses = [], tags = [] } = projectData || {}\n\n const { data: info } = useGetSiteInfoQuery({ full: true })\n const { attributes = [] } = info || {}\n\n // build the fields array for defining the schema\n const fields: AttributeField[] = useMemo(() => {\n // Create custom fields as proper AttributeModel objects\n const customFieldsData: AttributeField[] = [\n {\n name: 'label',\n data: {\n type: 'string',\n title: 'Label',\n description: 'Used as a nice visual label only',\n },\n },\n {\n name: 'folderType',\n hidden: formData?.entityType !== 'folder',\n data: {\n type: 'string',\n title: 'Folder Type',\n description: 'Type of the folder',\n enum: folderTypes.map((type) => ({\n value: type.name,\n label: type.name,\n icon: type.icon,\n })),\n },\n },\n {\n name: 'taskType',\n hidden: formData?.entityType !== 'task',\n data: {\n type: 'string',\n title: 'Task Type',\n description: 'Type of the task',\n enum: taskTypes.map((type) => ({\n value: type.name,\n label: type.name,\n icon: type.icon,\n })),\n },\n },\n {\n name: 'status',\n data: {\n type: 'string',\n title: 'Status',\n description: 'The state the entity is in, is it approved or in progress etc.',\n enum: statuses.map((status) => ({\n value: status.name,\n label: status.name,\n icon: status.icon,\n color: status.color,\n })),\n },\n },\n {\n name: 'tags',\n data: {\n type: 'list_of_strings',\n title: 'Tags',\n enum: tags.map((tag) => ({\n value: tag.name,\n label: tag.name,\n color: tag.color,\n })),\n },\n },\n ]\n\n // Filter API attributes based on entity type\n const apiAttributesData: AttributeField[] = formData?.entityType\n ? attributes\n .filter((attr) => attr.scope?.includes(formData.entityType))\n .map((attr) => ({\n name: 'attrib.' + attr.name,\n data: attr.data,\n }))\n : []\n\n const readOnlyFieldsData: AttributeField[] = readOnlyFields.map((field) => ({\n name: field as string,\n readonly: true,\n data: {\n type: 'string',\n title: upperFirst(field as string),\n },\n }))\n\n // Combine custom fields with API attributes\n const allFieldsData = [...customFieldsData, ...apiAttributesData, ...readOnlyFieldsData]\n const sortToTop = ['path', 'name']\n const sortedFieldsData = [...allFieldsData].sort((a, b) => {\n const aIndex = sortToTop.indexOf(a.name)\n const bIndex = sortToTop.indexOf(b.name)\n if (aIndex === -1 && bIndex === -1) return 0\n if (aIndex === -1) return 1\n if (bIndex === -1) return -1\n return aIndex - bIndex\n })\n\n return sortedFieldsData\n }, [attributes, folderTypes, taskTypes, statuses, tags, formData?.entityType])\n\n //\n let enableEditing = false\n if (\n ['task', 'folder'].includes(formData?.entityType || '') &&\n !mixedFields.includes('projectName')\n ) {\n enableEditing = true\n }\n\n const entityType = formData?.entityType || 'task'\n const projectName = formData?.projectName || ''\n\n // Setup entity update functionality\n const { updateEntity } = useEntityUpdate({\n entities: entities.map((entity) => ({\n id: entity.id,\n projectName: entity.projectName || '',\n folderId: entity.folder?.id,\n users: entity.task?.assignees || [],\n })),\n entityType,\n })\n\n const handleChange: DetailsPanelAttributesEditorProps['onChange'] = (key, value) => {\n if (key.startsWith('attrib.')) {\n value = {\n [key.replace('attrib.', '')]: value,\n }\n key = 'attrib'\n }\n\n console.log('handleChange', key, value)\n\n // update the form data\n // @ts-ignore\n setFormData((prev) => ({\n ...prev,\n [key]: value,\n }))\n\n // update the entity in database\n updateEntity(key, value)\n }\n\n return (\n <Section style={{ padding: 8, overflow: 'hidden' }}>\n <DetailsPanelAttributesEditor\n fields={fields}\n form={formData || {}}\n mixedFields={mixedFields}\n isLoading={isLoading}\n enableEditing={enableEditing}\n onChange={handleChange}\n />\n </Section>\n )\n}\n"],"names":["_a","formData","jsx"],"mappings":"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"}
@@ -21,6 +21,7 @@ require("react-dom");
21
21
  require("../../context/pip/PiPWrapper.cjs.js");
22
22
  require("../../context/AddonProjectContext.cjs.js");
23
23
  require("../../context/AddonContext.cjs.js");
24
+ require("../../context/PowerpackContext.cjs.js");
24
25
  const SegmentProvider = React.forwardRef(
25
26
  ({ children, segment, isOpen, scope, projectName, ...props }, ref) => {
26
27
  const { openSlideOut } = DetailsPanelContext.useDetailsPanelContext();