@strapi/admin 4.10.0-beta.0 → 4.10.0-beta.1

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 (193) hide show
  1. package/.eslintignore +4 -0
  2. package/.eslintrc.js +14 -0
  3. package/admin/src/components/LanguageProvider/index.js +1 -1
  4. package/admin/src/components/LocalesProvider/__mocks__/useLocalesProvider.js +7 -0
  5. package/admin/src/components/LocalesProvider/index.js +2 -3
  6. package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +3 -6
  7. package/admin/src/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/getTableColumn.js +2 -0
  8. package/admin/src/content-manager/components/DynamicTable/index.js +11 -29
  9. package/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +12 -6
  10. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/findAllAndReplace.js +10 -3
  11. package/admin/src/content-manager/components/InputUID/endActionStyle.js +4 -13
  12. package/admin/src/content-manager/components/InputUID/index.js +95 -72
  13. package/admin/src/content-manager/components/SingleTypeFormWrapper/index.js +4 -8
  14. package/admin/src/content-manager/pages/App/LeftMenu/index.js +56 -35
  15. package/admin/src/content-manager/pages/App/actions.js +19 -7
  16. package/admin/src/content-manager/pages/App/constants.js +3 -3
  17. package/admin/src/content-manager/pages/App/index.js +5 -4
  18. package/admin/src/content-manager/pages/App/reducer.js +7 -6
  19. package/admin/src/content-manager/pages/App/selectors.js +3 -0
  20. package/admin/src/content-manager/pages/App/{useModels.js → useContentManagerInitData.js} +29 -28
  21. package/admin/src/content-manager/pages/App/utils/generateModelsLinks.js +2 -2
  22. package/admin/src/content-manager/pages/App/utils/getContentTypeLinks.js +17 -15
  23. package/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js +4 -5
  24. package/admin/src/content-manager/pages/EditSettingsView/index.js +4 -0
  25. package/admin/src/content-manager/pages/EditSettingsView/reducer.js +6 -7
  26. package/admin/src/content-manager/pages/EditSettingsView/utils/layout.js +1 -30
  27. package/admin/src/content-manager/pages/EditView/DeleteLink/index.js +5 -11
  28. package/admin/src/content-manager/pages/EditView/index.js +2 -7
  29. package/admin/src/content-manager/pages/ListSettingsView/index.js +1 -0
  30. package/admin/src/content-manager/sharedReducers/crudReducer/actions.js +6 -0
  31. package/admin/src/content-manager/sharedReducers/crudReducer/constants.js +1 -0
  32. package/admin/src/content-manager/sharedReducers/crudReducer/reducer.js +5 -0
  33. package/admin/src/hooks/useConfigurations/__mocks__/index.js +7 -0
  34. package/admin/src/hooks/useFetchMarketplacePlugins/utils/api.js +7 -8
  35. package/admin/src/hooks/useFetchMarketplaceProviders/utils/api.js +5 -0
  36. package/admin/src/hooks/useRegenerate/index.js +12 -7
  37. package/admin/src/pages/AuthPage/components/Register/index.js +46 -38
  38. package/admin/src/pages/HomePage/SocialLinks.js +1 -1
  39. package/admin/src/pages/MarketplacePage/components/EmptyNpmPackageSearch/index.js +3 -3
  40. package/admin/src/pages/MarketplacePage/components/NpmPackagesGrid/index.js +42 -9
  41. package/admin/src/pages/MarketplacePage/components/NpmPackagesPagination/index.js +26 -0
  42. package/admin/src/pages/MarketplacePage/components/OfflineLayout/index.js +45 -0
  43. package/admin/src/pages/MarketplacePage/index.js +80 -175
  44. package/admin/src/pages/MarketplacePage/utils/useMarketplaceData.js +85 -0
  45. package/admin/src/pages/SettingsPage/components/Tokens/FormHead/index.js +4 -0
  46. package/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js +5 -3
  47. package/admin/src/pages/SettingsPage/components/Tokens/TokenTypeSelect/index.js +7 -5
  48. package/admin/src/pages/SettingsPage/pages/Roles/ListPage/components/RoleRow/index.js +12 -4
  49. package/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js +21 -2
  50. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/components/FormTransferTokenContainer/index.js +41 -0
  51. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js +53 -9
  52. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/utils/schema.js +1 -0
  53. package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js +27 -5
  54. package/admin/src/translations/en.json +51 -49
  55. package/admin/src/translations/ru.json +51 -19
  56. package/build/1387.84b454d3.chunk.js +1 -0
  57. package/build/1657.45231968.chunk.js +168 -0
  58. package/build/3081.bcf9a12f.chunk.js +108 -0
  59. package/build/462.8fff7f3b.chunk.js +71 -0
  60. package/build/4628.20631dd1.chunk.js +1 -0
  61. package/build/5542.b8240e3f.chunk.js +70 -0
  62. package/build/5563.905daa13.chunk.js +79 -0
  63. package/build/6404.68405699.chunk.js +100 -0
  64. package/build/7259.b7d00cea.chunk.js +1 -0
  65. package/build/8694.6522968d.chunk.js +247 -0
  66. package/build/Admin-authenticatedApp.52c88751.chunk.js +79 -0
  67. package/build/Admin_InternalErrorPage.15c6bf07.chunk.js +1 -0
  68. package/build/Admin_homePage.f9309c6d.chunk.js +73 -0
  69. package/build/Admin_marketplace.56bc1008.chunk.js +31 -0
  70. package/build/Admin_pluginsPage.f6b52ee9.chunk.js +6 -0
  71. package/build/Admin_profilePage.9112cffc.chunk.js +15 -0
  72. package/build/Admin_settingsPage.257b3477.chunk.js +79 -0
  73. package/build/Upload_ConfigureTheView.eaaec495.chunk.js +1 -0
  74. package/build/admin-app.dfaeea5d.chunk.js +110 -0
  75. package/build/admin-edit-roles-page.4f1858e9.chunk.js +280 -0
  76. package/build/admin-edit-users.7e14d85f.chunk.js +10 -0
  77. package/build/admin-roles-list.329c1f63.chunk.js +31 -0
  78. package/build/admin-users.d02de059.chunk.js +34 -0
  79. package/build/api-tokens-create-page.97595e12.chunk.js +1 -0
  80. package/build/api-tokens-edit-page.cd36e30e.chunk.js +1 -0
  81. package/build/api-tokens-list-page.6757c7b9.chunk.js +16 -0
  82. package/build/audit-logs-settings-page.19d90bda.chunk.js +76 -0
  83. package/build/content-manager.def692c2.chunk.js +1130 -0
  84. package/build/content-type-builder-list-view.9c2c020c.chunk.js +214 -0
  85. package/build/content-type-builder-translation-en-json.510e88ca.chunk.js +1 -0
  86. package/build/content-type-builder.5e1f4afc.chunk.js +126 -0
  87. package/build/email-settings-page.1095e1ab.chunk.js +10 -0
  88. package/build/en-json.08303b37.chunk.js +1 -0
  89. package/build/{highlight.js.26ef649f.chunk.js → highlight.js.28a1547e.chunk.js} +2 -2
  90. package/build/i18n-settings-page.7d80aae0.chunk.js +60 -0
  91. package/build/index.html +1 -1
  92. package/build/main.120be100.js +2280 -0
  93. package/build/review-workflows-settings.9092ed72.chunk.js +106 -0
  94. package/build/ru-json.e0662702.chunk.js +1 -0
  95. package/build/{runtime~main.5a95bee6.js → runtime~main.112b3101.js} +2 -2
  96. package/build/sso-settings-page.1dd4886e.chunk.js +1 -0
  97. package/build/transfer-tokens-create-page.ec2ca215.chunk.js +1 -0
  98. package/build/transfer-tokens-edit-page.22bf28e5.chunk.js +1 -0
  99. package/build/transfer-tokens-list-page.cf8c77f2.chunk.js +16 -0
  100. package/build/upload-settings.945fdcfa.chunk.js +13 -0
  101. package/build/{upload-translation-th-json.3847dae0.chunk.js → upload-translation-th-json.98d35574.chunk.js} +1 -1
  102. package/build/upload.a86b1054.chunk.js +33 -0
  103. package/build/users-advanced-settings-page.5b5a9baa.chunk.js +8 -0
  104. package/build/users-email-settings-page.e5506eb4.chunk.js +23 -0
  105. package/build/users-providers-settings-page.e32089c2.chunk.js +28 -0
  106. package/build/users-roles-settings-page.2f85dcec.chunk.js +30 -0
  107. package/build/webhook-edit-page.213f0075.chunk.js +75 -0
  108. package/build/webhook-list-page.5beb2a5c.chunk.js +71 -0
  109. package/{admin/src/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/ReviewWorkflowsStage.js → ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/ReviewWorkflowsStageEE.js} +2 -2
  110. package/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/getTableColumn.js +45 -0
  111. package/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/index.js +3 -0
  112. package/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js +61 -18
  113. package/ee/admin/hooks/useLicenseLimitNotification/index.js +1 -1
  114. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useAuditLogsData.js +6 -3
  115. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/index.js +15 -5
  116. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/utils/getDisplayedFilters.js +52 -45
  117. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/ReviewWorkflows.js +8 -4
  118. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/Stage.js +2 -2
  119. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.js +2 -2
  120. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/reducer/index.js +2 -1
  121. package/ee/server/content-types/workflow/index.js +0 -3
  122. package/ee/server/content-types/workflow-stage/index.js +0 -5
  123. package/ee/server/controllers/workflows/stages/index.js +8 -1
  124. package/ee/server/register.js +3 -1
  125. package/ee/server/services/audit-logs.js +75 -16
  126. package/ee/server/services/review-workflows/entity-service-decorator.js +17 -5
  127. package/ee/server/services/review-workflows/review-workflows.js +27 -91
  128. package/ee/server/services/review-workflows/stages.js +108 -7
  129. package/ee/server/utils/persisted-tables.js +114 -22
  130. package/ee/server/utils/review-workflows.js +9 -0
  131. package/jest.config.front.js +1 -6
  132. package/package.json +24 -22
  133. package/server/controllers/transfer/runner.js +4 -2
  134. package/server/middlewares/data-transfer.js +4 -1
  135. package/server/routes/transfer.js +13 -4
  136. package/server/services/constants.js +4 -0
  137. package/server/services/transfer/permission.js +1 -1
  138. package/server/services/transfer/token.js +33 -31
  139. package/server/validation/transfer/token.js +10 -2
  140. package/webpack.config.js +6 -2
  141. package/admin/src/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/index.js +0 -1
  142. package/admin/src/content-manager/pages/App/LeftMenu/utils/index.js +0 -1
  143. package/admin/src/content-manager/pages/App/LeftMenu/utils/matchByTitle.js +0 -24
  144. package/build/2263.4c5916f9.chunk.js +0 -98
  145. package/build/4049.64715f20.chunk.js +0 -1
  146. package/build/4649.213b8a3b.chunk.js +0 -30
  147. package/build/6985.66cca29c.chunk.js +0 -1
  148. package/build/7259.aefb51e8.chunk.js +0 -1
  149. package/build/8469.853c822b.chunk.js +0 -1
  150. package/build/9505.dbe702ab.chunk.js +0 -14
  151. package/build/9816.01ee964f.chunk.js +0 -2
  152. package/build/Admin-authenticatedApp.f50ad423.chunk.js +0 -79
  153. package/build/Admin_InternalErrorPage.4ad8b0df.chunk.js +0 -1
  154. package/build/Admin_homePage.1411fb7c.chunk.js +0 -68
  155. package/build/Admin_marketplace.02608d56.chunk.js +0 -22
  156. package/build/Admin_pluginsPage.15e3b0fd.chunk.js +0 -1
  157. package/build/Admin_profilePage.76afeca0.chunk.js +0 -15
  158. package/build/Admin_settingsPage.147755cd.chunk.js +0 -9
  159. package/build/Upload_ConfigureTheView.34dde278.chunk.js +0 -1
  160. package/build/admin-app.55dd7921.chunk.js +0 -112
  161. package/build/admin-edit-roles-page.cf543488.chunk.js +0 -216
  162. package/build/admin-edit-users.31c20712.chunk.js +0 -10
  163. package/build/admin-roles-list.489c501f.chunk.js +0 -2
  164. package/build/admin-users.3e111a7d.chunk.js +0 -11
  165. package/build/api-tokens-create-page.4328b852.chunk.js +0 -1
  166. package/build/api-tokens-edit-page.bce5050f.chunk.js +0 -1
  167. package/build/api-tokens-list-page.93f24348.chunk.js +0 -16
  168. package/build/audit-logs-settings-page.7be97e82.chunk.js +0 -1
  169. package/build/content-manager.4480ae88.chunk.js +0 -1137
  170. package/build/content-type-builder-list-view.cf38fe2f.chunk.js +0 -191
  171. package/build/content-type-builder-translation-en-json.7961593e.chunk.js +0 -1
  172. package/build/content-type-builder.af9abf1e.chunk.js +0 -126
  173. package/build/email-settings-page.4bdbef9a.chunk.js +0 -3
  174. package/build/en-json.697b4bcf.chunk.js +0 -1
  175. package/build/i18n-settings-page.2bb5be96.chunk.js +0 -1
  176. package/build/main.af8c0f31.js +0 -3790
  177. package/build/review-workflows-settings.7a7dc773.chunk.js +0 -57
  178. package/build/ru-json.6a01cea6.chunk.js +0 -1
  179. package/build/sso-settings-page.272b87c8.chunk.js +0 -1
  180. package/build/transfer-tokens-create-page.a1f14bb1.chunk.js +0 -1
  181. package/build/transfer-tokens-edit-page.00ee1c74.chunk.js +0 -1
  182. package/build/transfer-tokens-list-page.ce37354b.chunk.js +0 -16
  183. package/build/upload-settings.0875e973.chunk.js +0 -1
  184. package/build/upload.c7da1611.chunk.js +0 -13
  185. package/build/users-advanced-settings-page.1d3c14c7.chunk.js +0 -1
  186. package/build/users-email-settings-page.e8db68c4.chunk.js +0 -1
  187. package/build/users-providers-settings-page.14cac425.chunk.js +0 -1
  188. package/build/users-roles-settings-page.2ea4de84.chunk.js +0 -30
  189. package/build/webhook-edit-page.329141a5.chunk.js +0 -23
  190. package/build/webhook-list-page.029957a4.chunk.js +0 -1
  191. package/ee/server/migrations/review-workflows.js +0 -39
  192. package/ee/server/utils/test.js +0 -11
  193. /package/admin/src/{content-manager/components/InputUID/useDebounce.js → hooks/useDebounce/index.js} +0 -0
@@ -0,0 +1,75 @@
1
+ "use strict";(self.webpackChunk_strapi_admin=self.webpackChunk_strapi_admin||[]).push([[5162],{47272:function(te,O,t){t.d(O,{Z:function(){return Ie}});var e=t(32735),l=t(43383),T=t(27649),o=t(20108),k=t(53038),Z=t(67927),Y=t(60216),s=t.n(Y),g=t(2438),p=t(66456),N=t(29439),Se=t(82055),y=t(87933),fe=t(41415),Oe=t(17e3),ne=t(72850),se=t(15335),V=t(5803),le=t(10369),$=t(92802),j=t(67879),he=t(28847),w=t(49372),ie=t(8471),Ee=t(8284),ke=t(44426),Q=t(23940),de=t.n(Q);const d=({disabledEvents:n,name:r,events:a,inputValue:i,handleChange:m,handleChangeAll:x})=>{const u=a.filter(b=>!n.includes(b)),f=i.length===u.length,M=i.length>0,v=({target:{name:b}})=>{x({target:{name:b,value:!f}})};return e.createElement("tr",null,e.createElement("td",null,e.createElement(Ee.X,{indeterminate:M&&!f,"aria-label":"Select all entries",name:r,onChange:v,value:f},de()(r))),a.map(b=>e.createElement("td",{key:b},e.createElement(ke.C,{disabled:n.includes(b),"aria-label":b,name:b,value:i.includes(b),onValueChange:I=>m({target:{name:b,value:I}})}))))};d.defaultProps={disabledEvents:[],events:[],inputValue:[],handleChange(){},handleChangeAll(){}},d.propTypes={disabledEvents:s().array,events:s().array,inputValue:s().array,handleChange:s().func,handleChangeAll:s().func,name:s().string.isRequired};var D=d,X=n=>n.reduce((r,a)=>{const i=a.split(".")[0];return r[i]||(r[i]=[]),r[i].push(a),r},{});const R=ie.ZP.table`
2
+ td {
3
+ height: ${52/16}rem;
4
+ width: 10%;
5
+ vertical-align: middle;
6
+ text-align: center;
7
+ }
8
+
9
+ tbody tr:nth-child(odd) {
10
+ background: ${({theme:n})=>n.colors.neutral100};
11
+ }
12
+
13
+ tbody tr td:first-child {
14
+ padding-left: ${({theme:n})=>n.spaces[7]};
15
+ }
16
+ `,H={headers:{default:[{id:"Settings.webhooks.events.create",defaultMessage:"Create"},{id:"Settings.webhooks.events.update",defaultMessage:"Update"},{id:"app.utils.delete",defaultMessage:"Delete"}],draftAndPublish:[{id:"Settings.webhooks.events.create",defaultMessage:"Create"},{id:"Settings.webhooks.events.update",defaultMessage:"Update"},{id:"app.utils.delete",defaultMessage:"Delete"},{id:"app.utils.publish",defaultMessage:"Publish"},{id:"app.utils.unpublish",defaultMessage:"Unpublish"}]},events:{default:{entry:["entry.create","entry.update","entry.delete"],media:["media.create","media.update","media.delete"]},draftAndPublish:{entry:["entry.create","entry.update","entry.delete","entry.publish","entry.unpublish"],media:["media.create","media.update","media.delete"]}}},ve=({isDraftAndPublish:n})=>{const r=n?H.headers.draftAndPublish:H.headers.default,a=n?H.events.draftAndPublish:H.events.default,{formatMessage:i}=(0,j.Z)(),{values:m,handleChange:x}=(0,$.u6)(),u="events",f=m.events,M=[],v=X(f),b=({target:{name:h,value:A}})=>{let K=new Set(f);A?K.add(h):K.delete(h),x({target:{name:u,value:Array.from(K)}})},I=({target:{name:h,value:A}})=>{let K=new Set(f);A?a[h].forEach(G=>{M.includes(G)||K.add(G)}):a[h].forEach(G=>K.delete(G)),x({target:{name:u,value:Array.from(K)}})};return e.createElement(y.k,{direction:"column",alignItems:"stretch",gap:1},e.createElement(he.Q,null,i({id:"Settings.webhooks.form.events",defaultMessage:"Events"})),e.createElement(R,null,e.createElement("thead",null,e.createElement("tr",null,e.createElement("td",null),r.map(h=>h==="app.utils.publish"||h==="app.utils.unpublish"?e.createElement("td",{key:h.id,title:i({id:"Settings.webhooks.event.publish-tooltip",defaultMessage:"This event only exists for content with draft & publish enabled"})},e.createElement(w.Z,{variant:"sigma",textColor:"neutral600"},i(h))):e.createElement("td",{key:h.id},e.createElement(w.Z,{variant:"sigma",textColor:"neutral600"},i(h)))))),e.createElement("tbody",null,Object.keys(a).map(h=>e.createElement(D,{disabledEvents:M,key:h,name:h,events:a[h],inputValue:v[h],handleChange:b,handleChangeAll:I})))))};ve.propTypes={isDraftAndPublish:s().bool.isRequired};var ce=ve,Le=t(19406),J=t(7563),Te=t(42623),ue=t(90333),be=["A-IM","Accept","Accept-Charset","Accept-Encoding","Accept-Language","Accept-Datetime","Access-Control-Request-Method","Access-Control-Request-Headers","Authorization","Cache-Control","Connection","Content-Length","Content-Type","Cookie","Date","Expect","Forwarded","From","Host","If-Match","If-Modified-Since","If-None-Match","If-Range","If-Unmodified-Since","Max-Forwards","Origin","Pragma","Proxy-Authorization","Range","Referer","TE","User-Agent","Upgrade","Via","Warning"];const ae=({name:n,onChange:r,value:a,...i})=>{const[m,x]=(0,e.useState)(a?[...be,a]:be),u=M=>{r({target:{name:n,value:M}})},f=M=>{x(v=>[...v,M]),r({target:{name:n,value:M}})};return e.createElement(Te.X,{...i,onChange:u,onCreateOption:f,placeholder:"",value:a},m.map(M=>e.createElement(ue.O,{value:M,key:M},M)))};ae.defaultProps={value:void 0},ae.propTypes={name:s().string.isRequired,onChange:s().func.isRequired,value:s().string};var Ce=ae,ye=()=>{const{formatMessage:n}=(0,j.Z)(),{values:r,errors:a}=(0,$.u6)();return e.createElement(y.k,{direction:"column",alignItems:"stretch",gap:1},e.createElement(he.Q,null,n({id:"Settings.webhooks.form.headers",defaultMessage:"Headers"})),e.createElement(ne.x,{padding:8,background:"neutral100",hasRadius:!0},e.createElement($.F2,{validateOnChange:!1,name:"headers",render:({push:i,remove:m})=>e.createElement(se.r,{gap:4},r.headers?.map((x,u)=>e.createElement(e.Fragment,{key:u},e.createElement(V.P,{col:6},e.createElement($.gN,{as:Ce,name:`headers.${u}.key`,"aria-label":`row ${u+1} key`,label:n({id:"Settings.webhooks.key",defaultMessage:"Key"}),error:a.headers?.[u]?.key&&n({id:a.headers[u]?.key,defaultMessage:a.headers[u]?.key})})),e.createElement(V.P,{col:6},e.createElement(y.k,{alignItems:"flex-end"},e.createElement(ne.x,{style:{flex:1}},e.createElement($.gN,{as:le.o,"aria-label":`row ${u+1} value`,label:n({id:"Settings.webhooks.value",defaultMessage:"Value"}),name:`headers.${u}.value`,error:a.headers?.[u]?.value&&n({id:a.headers[u]?.value,defaultMessage:a.headers[u]?.value})})),e.createElement(y.k,{paddingLeft:2,style:{alignSelf:"center"},paddingTop:a.headers?.[u]?.value?0:5},e.createElement(l.fG,{onClick:()=>r.headers.length!==1&&m(u),label:n({id:"Settings.webhooks.headers.remove",defaultMessage:"Remove header row {number}"},{number:u+1})})))))),e.createElement(V.P,{col:12},e.createElement(J.A,{type:"button",onClick:()=>{i({key:"",value:""})},startIcon:e.createElement(Le.Z,null)},n({id:"Settings.webhooks.create.header",defaultMessage:"Create new header"}))))})))},Re=t(27169),Me=t(35331);const q=ie.ZP.svg(({theme:n,color:r})=>`
17
+ width: ${12/16}rem;
18
+ height: ${12/16}rem;
19
+
20
+ path {
21
+ fill: ${n.colors[r]};
22
+ }
23
+ `),W=({isPending:n,statusCode:r})=>{const{formatMessage:a}=(0,j.Z)();return n?e.createElement(y.k,{gap:2,alignItems:"center"},e.createElement(q,{as:Re.Z}),e.createElement(w.Z,null,a({id:"Settings.webhooks.trigger.pending",defaultMessage:"pending"}))):r>=200&&r<300?e.createElement(y.k,{gap:2,alignItems:"center"},e.createElement(q,{as:p.Z,color:"success700"}),e.createElement(w.Z,null,a({id:"Settings.webhooks.trigger.success",defaultMessage:"success"}))):r>=300?e.createElement(y.k,{gap:2,alignItems:"center"},e.createElement(q,{as:Me.Z,color:"danger700"}),e.createElement(w.Z,null,a({id:"Settings.error",defaultMessage:"error"})," ",r)):null};W.propTypes={isPending:s().bool.isRequired,statusCode:s().number},W.defaultProps={statusCode:void 0};const ge=({statusCode:n,message:r})=>{const{formatMessage:a}=(0,j.Z)();return n>=200&&n<300?e.createElement(y.k,{justifyContent:"flex-end"},e.createElement(w.Z,{textColor:"neutral600",ellipsis:!0},a({id:"Settings.webhooks.trigger.success.label",defaultMessage:"Trigger succeeded"}))):n>=300?e.createElement(y.k,{justifyContent:"flex-end"},e.createElement(y.k,{maxWidth:(0,l.Q1)(250),justifyContent:"flex-end",title:r},e.createElement(w.Z,{ellipsis:!0,textColor:"neutral600"},r))):null};ge.propTypes={statusCode:s().number,message:s().string},ge.defaultProps={statusCode:void 0,message:void 0};const Pe=({onCancel:n})=>{const{formatMessage:r}=(0,j.Z)();return e.createElement(y.k,{justifyContent:"flex-end"},e.createElement("button",{onClick:n,type:"button"},e.createElement(y.k,{gap:2,alignItems:"center"},e.createElement(w.Z,{textColor:"neutral400"},r({id:"Settings.webhooks.trigger.cancel",defaultMessage:"cancel"})),e.createElement(q,{as:Me.Z,color:"neutral400"}))))};Pe.propTypes={onCancel:s().func.isRequired};const P=({isPending:n,onCancel:r,response:a})=>{const{statusCode:i,message:m}=a,{formatMessage:x}=(0,j.Z)();return e.createElement(ne.x,{background:"neutral0",padding:5,shadow:"filterShadow",hasRadius:!0},e.createElement(se.r,{gap:4,style:{alignItems:"center"}},e.createElement(V.P,{col:3},e.createElement(w.Z,null,x({id:"Settings.webhooks.trigger.test",defaultMessage:"Test-trigger"}))),e.createElement(V.P,{col:3},e.createElement(W,{isPending:n,statusCode:i})),e.createElement(V.P,{col:6},n?e.createElement(Pe,{onCancel:r}):e.createElement(ge,{statusCode:i,message:m}))))};P.defaultProps={isPending:!1,onCancel(){},response:{}},P.propTypes={isPending:s().bool,onCancel:s().func,response:s().object};var xe=P,F=t(24346);const Ae=/(^$)|(^[A-Za-z][_0-9A-Za-z ]*$)/,U=/(^$)|((https?:\/\/.*)(d*)\/?(.*))/;var z=F.Ry().shape({name:F.Z_(l.I0.string).required(l.I0.required).matches(Ae,l.I0.regex),url:F.Z_(l.I0.string).required(l.I0.required).matches(U,l.I0.regex),headers:F.Vo(n=>{let r=F.IX();if(n.length===1){const{key:a,value:i}=n[0];if(!a&&!i)return r}return r.of(F.Ry().shape({key:F.Z_().required(l.I0.required),value:F.Z_().required(l.I0.required)}))}),events:F.IX()});const me=({handleSubmit:n,data:r,triggerWebhook:a,isCreating:i,isTriggering:m,triggerResponse:x,isDraftAndPublishEvents:u})=>{const{formatMessage:f}=(0,j.Z)(),[M,v]=(0,e.useState)(!1);return e.createElement($.J9,{onSubmit:n,initialValues:{name:r?.name||"",url:r?.url||"",headers:Object.keys(r?.headers||[]).length?Object.entries(r.headers).map(([b,I])=>({key:b,value:I})):[{key:"",value:""}],events:r?.events||[]},validationSchema:z,validateOnChange:!1,validateOnBlur:!1},({handleSubmit:b,errors:I})=>e.createElement(l.l0,{noValidate:!0},e.createElement(Se.T,{primaryAction:e.createElement(y.k,{gap:2},e.createElement(fe.z,{onClick:()=>{a(),v(!0)},variant:"tertiary",startIcon:e.createElement(g.Z,null),disabled:i||m,size:"L"},f({id:"Settings.webhooks.trigger",defaultMessage:"Trigger"})),e.createElement(fe.z,{startIcon:e.createElement(p.Z,null),onClick:b,type:"submit",size:"L"},f({id:"global.save",defaultMessage:"Save"}))),title:i?f({id:"Settings.webhooks.create",defaultMessage:"Create a webhook"}):r?.name,navigationAction:e.createElement(l.rU,{startIcon:e.createElement(N.Z,null),to:"/settings/webhooks"},f({id:"global.back",defaultMessage:"Back"}))}),e.createElement(Oe.D,null,e.createElement(y.k,{direction:"column",alignItems:"stretch",gap:4},M&&e.createElement("div",{className:"trigger-wrapper"},e.createElement(xe,{isPending:m,response:x,onCancel:()=>v(!1)})),e.createElement(ne.x,{background:"neutral0",padding:8,shadow:"filterShadow",hasRadius:!0},e.createElement(y.k,{direction:"column",alignItems:"stretch",gap:6},e.createElement(se.r,{gap:6},e.createElement(V.P,{col:6},e.createElement($.gN,{as:le.o,name:"name",error:I.name&&f({id:I.name}),label:f({id:"global.name",defaultMessage:"Name"}),required:!0})),e.createElement(V.P,{col:12},e.createElement($.gN,{as:le.o,name:"url",error:I.url&&f({id:I.url}),label:f({id:"Settings.roles.form.input.url",defaultMessage:"Url"}),required:!0}))),e.createElement(ye,null),e.createElement(ce,{isDraftAndPublish:u})))))))};me.propTypes={data:s().object,handleSubmit:s().func.isRequired,triggerWebhook:s().func.isRequired,isCreating:s().bool.isRequired,isDraftAndPublishEvents:s().bool.isRequired,isTriggering:s().bool.isRequired,triggerResponse:s().object},me.defaultProps={data:void 0,triggerResponse:void 0};var L=me;const re=n=>({...n,headers:_(n.headers)}),_=n=>n.reduce((r,a)=>{const{key:i,value:m}=a;return i!==""?{...r,[i]:m}:r},{});var ee=re,Ie=()=>{const{params:{id:n}}=(0,k.$B)("/settings/webhooks/:id"),{replace:r}=(0,k.k6)(),{lockApp:a,unlockApp:i}=(0,l.o1)(),m=(0,l.lm)(),x=(0,o.useQueryClient)(),{isLoading:u,collectionTypes:f}=(0,Z.bP)(),{post:M}=(0,l.kY)(),v=n==="create",b=(0,e.useCallback)(async C=>{const[S,{data:we}]=await(0,l.to)((0,l.WY)(`/admin/webhooks/${C}`,{method:"GET"}));return S?(m({type:"warning",message:{id:"notification.error"}}),null):we},[m]),{isLoading:I,data:h}=(0,o.useQuery)(["get-webhook",n],()=>b(n),{enabled:!v}),{isLoading:A,data:K,isIdle:G,mutate:Ze}=(0,o.useMutation)(()=>M(`/admin/webhooks/${n}/trigger`)),$e=()=>Ze(null,{onError(){m({type:"warning",message:{id:"notification.error"}})}}),Be=(0,o.useMutation)(C=>(0,l.WY)("/admin/webhooks",{method:"POST",body:C})),pe=(0,o.useMutation)(({id:C,body:S})=>(0,l.WY)(`/admin/webhooks/${C}`,{method:"PUT",body:S})),c=async C=>{v?(a(),Be.mutate(ee(C),{onSuccess(S){m({type:"success",message:{id:"Settings.webhooks.created"}}),r(`/settings/webhooks/${S.data.id}`),i()},onError(S){m({type:"warning",message:{id:"notification.error"}}),console.log(S),i()}})):(a(),pe.mutate({id:n,body:ee(C)},{onSuccess(){x.invalidateQueries(["get-webhook",n]),m({type:"success",message:{id:"notification.form.success.fields"}}),i()},onError(S){m({type:"warning",message:{id:"notification.error"}}),console.log(S),i()}}))},E=(0,e.useMemo)(()=>f.some(C=>C.options.draftAndPublish===!0),[f]);return I||u?e.createElement(l.dO,null):e.createElement(T.o,null,e.createElement(l.SL,{name:"Webhooks"}),e.createElement(L,{handleSubmit:c,data:h,triggerWebhook:$e,isCreating:v,isTriggering:A,isTriggerIdle:G,triggerResponse:K?.data.data,isDraftAndPublishEvents:E}))}},33238:function(te,O,t){t.r(O);var e=t(32735),l=t(43383),T=t(83983),o=t(47272);const k=()=>e.createElement(l.O4,{permissions:T.Z.settings.webhooks.create},e.createElement(o.Z,null));O.default=k},59021:function(te,O,t){t.r(O);var e=t(32735),l=t(43383),T=t(83983),o=t(47272);const k=()=>e.createElement(l.O4,{permissions:T.Z.settings.webhooks.update},e.createElement(o.Z,null));O.default=k},42623:function(te,O,t){t.d(O,{h:function(){return Q},X:function(){return de}});var e=t(32735),l=t(35331),T=t(16899),o=t(60216),k=t(90333),Z=t(91225),Y=t(17289),s=t(94486);const g={Close:"Close",CloseSelect:"CloseSelect",First:"First",Last:"Last",Next:"Next",Open:"Open",PageDown:"PageDown",PageUp:"PageUp",Previous:"Previous",Select:"Select",Space:"Space",Type:"Type"},p={Close:"Close",First:"First",Last:"Last",Next:"Next",Open:"Open",Previous:"Previous",Select:"Select",UpLevel:"UpLevel"};function N(d=[],D=null,B=[]){const X=String(D??"").toLowerCase();return X?d.filter(R=>R.props.children.toString().toLowerCase().includes(X)&&B.indexOf(R)<0):d}function Se(d,D){if(!D&&d===s.y.DOWN)return g.Open;if(d===s.y.DOWN)return g.Next;if(d===s.y.UP)return g.Previous;if(d===s.y.HOME)return g.First;if(d===s.y.END)return g.Last;if(d===s.y.ESCAPE)return g.Close;if(d===s.y.ENTER)return g.CloseSelect;if(d===s.y.BACKSPACE||d===s.y.CLEAR||d.length===1)return g.Type}function y(d,D,B){switch(B){case g.First:return 0;case g.Last:return D;case g.Previous:return Math.max(0,d-1);case g.Next:return Math.min(D,d+1);default:return d}}function fe(d){(0,Y.Z)(d,{scrollMode:"if-needed",block:"nearest",inline:"nearest"}).forEach(({el:D,top:B,left:X})=>{D.scrollTop=B,D.scrollLeft=X})}var Oe=t(72850),ne=t(87107),se=t(28847),V=t(67014),le=t(47851),$=t(87933),j=t(74971),he=t(97405),w=t(4101),ie=t(93958),Ee=t(49372),ke=t(3685);const Q=({children:d,clearLabel:D,creatable:B,createMessage:X,disabled:R,error:H,hasMoreItems:ve,hint:ce,id:Le,label:J,labelAction:Te,loading:ue,loadingMessage:We,noOptionsMessage:be,onChange:ae,onClear:Ce,onCreateOption:Ue,onInputChange:ye,onLoadMore:Re,placeholder:Me,required:q,value:W,...ge})=>{const Pe=()=>d.find(c=>c.props?.value.toLowerCase()===W.toLowerCase()).props?.children,[P,xe]=(0,e.useState)(0),[F,Ae]=(0,e.useState)(null),[U,De]=(0,e.useState)(d),[z,me]=(0,e.useState)(!1),[L,re]=(0,e.useState)(""),_=(0,e.useRef)(),ee=(0,e.useRef)(!1),oe=(0,e.useRef)(),Ie=(0,e.useRef)(),n=(0,e.useRef)(),r=(0,e.useRef)(!0),a=(0,j.M)(Le),i=`${a}-label`;if(!J&&!ge["aria-label"])throw new Error('The Combobox component needs a "label" or an "aria-label" props');(0,e.useEffect)(()=>{De(N(d,L))},[L,d]),(0,e.useEffect)(()=>{z&&_.current&&fe(_.current)},[P,z]),(0,e.useLayoutEffect)(()=>{r.current&&(r.current=!1)},[W]);const m=z?`${a}-${P}`:"",x=()=>{ae(null),re("")},u=c=>{ye&&ye(c);const E=oe.current.value;De(N(d,E)),xe(0),Ae(null),L!==E&&re(E),z||A(!0,!1)},f=c=>{const{key:E}=c,C=B&&L?U.length:U.length-1,S=Se(E,z);switch(W&&!L&&E===s.y.BACKSPACE&&x(),S){case g.Next:{if(P===C){v(0);break}v(y(P,C,S));break}case g.Previous:{if(P===0){v(C);break}v(y(P,C,S));break}case g.Last:case g.First:{if(P===C){v(0);break}v(y(P,C,S));break}case g.CloseSelect:c.preventDefault(),h(P);break;case g.Close:c.preventDefault(),A(!1);break;case g.Open:A(!0);break}},M=c=>{if(c.preventDefault(),W&&!ee.current&&re(""),ee.current){ee.current=!1;return}A(!1,!1)},v=c=>{xe(c)},b=c=>{v(c),h(c)},I=()=>{ee.current=!0},h=c=>{const E=U[c];if(re(""),E){ae(E.props.value),A(!1);return}B&&(Ue(L),A(!1))},A=(c,E=!0)=>{me(c),E&&oe.current.focus()},K=e.Children.toArray(U).map((c,E)=>{const C=P===E;return(0,e.cloneElement)(c,{id:`${a}-${E}`,"aria-selected":F===E,"aria-posinset":E+1,"aria-setsize":e.Children.toArray(U).length,ref(S){C&&(_.current=S)},onClick:()=>b(E),onMouseDown:I,isSelected:C})}),G=()=>{oe.current.focus(),Ce&&Ce(),x()},Ze=()=>{oe.current.focus(),A(!0)},$e=()=>{const c=U.findIndex(E=>E.props?.children===L);return L&&c===-1},Be=c=>{c.preventDefault(),A(c,!0)};let pe;return H?pe=`${a}-error`:ce&&(pe=`${a}-hint`),e.createElement(ne.g,{hint:ce,error:H,id:a,required:q},e.createElement(ke.T,{"aria-live":"polite","aria-atomic":"false","aria-relevant":"additions text"},W),e.createElement($.k,{direction:"column",alignItems:"stretch",gap:J||ce||H?1:0},J&&e.createElement(se.Q,{action:Te},J),e.createElement(Z.d8,{ref:Ie,$disabled:R,hasError:H},e.createElement(Z.fv,{wrap:"wrap"},!L&&W&&e.createElement(Z.K7,{id:`${a}-selected-value`},e.createElement(Ee.Z,null,Pe())),e.createElement(Z.II,{"aria-activedescendant":m,"aria-autocomplete":"list","aria-controls":`${a}-listbox`,"aria-disabled":R,"aria-expanded":z,"aria-haspopup":"listbox","aria-describedby":pe,autoComplete:"off",autoCorrect:"off",id:a,onBlur:R?void 0:M,onClick:R?void 0:Be,onInput:R?void 0:u,onKeyDown:R?void 0:f,placeholder:W?"":Me,readOnly:R,ref:oe,required:q,role:"combobox",spellCheck:"off",type:"text",value:L})),e.createElement($.k,null,(W||L)&&e.createElement(ie.zb,{id:`${a}-clear`,"aria-label":D,disabled:R,paddingLeft:3,as:"button",onClick:G,type:"button"},e.createElement(l.Z,null)),e.createElement(ie.AV,{disabled:R,paddingLeft:3,"aria-hidden":!0,as:"button",onClick:Ze,tabIndex:-1,type:"button"},e.createElement(T.Z,null)))),e.createElement(V.J,null),e.createElement(le.c,null)),z&&e.createElement(w.J2,{id:`${a}-popover`,source:Ie,spacing:4,fullWidth:!0,intersectionId:`${a}-listbox-popover-intersection`,onReachEnd:ve&&!ue?Re:void 0},e.createElement("div",{role:"listbox",ref:n,id:`${a}-listbox`,"aria-labelledby":J?i:void 0},(Boolean(U.length)||B)&&e.createElement(e.Fragment,null,K,$e()&&B&&e.createElement(k.O,{isSelected:P===U.length,ref:c=>{P===U.length&&(_.current=c)},onMouseDown:I,onClick:()=>h(),taindex:0},X(L))),!U.length&&!B&&!ue&&e.createElement(Oe.x,{paddingLeft:4,paddingRight:4,paddingTop:2,paddingBottom:2,ref:_},e.createElement(Ee.Z,{textColor:"neutral800"},be(L))),ue&&e.createElement($.k,{justifyContent:"center",alignItems:"center",paddingTop:2,paddingBottom:2},e.createElement(he.a,{small:!0},We)))))},de=d=>e.createElement(Q,{...d,creatable:!0});Q.defaultProps={"aria-label":void 0,clearLabel:"clear",creatable:!1,createMessage:d=>`Create "${d}"`,disabled:!1,error:void 0,hasMoreItems:!1,hint:void 0,id:void 0,label:void 0,loading:!1,loadingMessage:"Loading content...",noOptionsMessage:()=>"No results found",onClear:void 0,onCreateOption:void 0,onInputChange:void 0,onLoadMore:void 0,placeholder:"Select or enter a value",value:void 0},de.defaultProps=Q.defaultProps,Q.propTypes={"aria-label":o.string,children:o.oneOfType([o.arrayOf(o.node),o.node]),clearLabel:o.string,creatable:o.bool,createMessage:o.func,disabled:o.bool,error:o.string,hasMoreItems:o.bool,id:o.string,hint:o.oneOfType([o.string,o.node,o.arrayOf(o.node)]),label:o.string,labelAction:o.element,loading:o.bool,loadingMessage:o.string,noOptionsMessage:o.func,onChange:o.func.isRequired,onClear:o.func,onCreateOption:o.func,onInputChange:o.func,onLoadMore:o.func,placeholder:o.string,value:o.string},de.propTypes={...Q.propTypes,onCreateOption:o.func.isRequired}},90333:function(te,O,t){t.d(O,{O:function(){return k}});var e=t(32735),l=t(60216),T=t(91225),o=t(49372);const k=(0,e.forwardRef)(({isSelected:Z,children:Y,...s},g)=>e.createElement(T.Zq,{hasRadius:!0,paddingLeft:4,paddingRight:4,paddingTop:2,paddingBottom:2,role:"option",background:"neutral0",isSelected:Z,ref:g,...s},e.createElement(o.Z,{textColor:Z?"primary600":"neutral800",fontWeight:Z?"bold":null},Y)));k.defaultProps={isSelected:!1},k.propTypes={children:l.oneOfType([l.string,l.number]).isRequired,isSelected:l.bool},k.displayName="ComboboxOption"},91225:function(te,O,t){t.d(O,{II:function(){return s},K7:function(){return Z},Zq:function(){return g},d8:function(){return k},fv:function(){return Y}});var e=t(8471),l=t(72850),T=t(87933),o=t(30350);const k=(0,e.ZP)(T.k)`
24
+ position: relative;
25
+ border: 1px solid ${({theme:p,hasError:N})=>N?p.colors.danger600:p.colors.neutral200};
26
+ padding-right: ${({theme:p})=>p.spaces[3]};
27
+ padding-left: ${({theme:p})=>p.spaces[3]};
28
+ border-radius: ${({theme:p})=>p.borderRadius};
29
+ background: ${({theme:p})=>p.colors.neutral0};
30
+
31
+ ${({theme:p,$disabled:N})=>N?`
32
+ color: ${p.colors.neutral600};
33
+ background: ${p.colors.neutral150};
34
+ `:void 0}
35
+
36
+ ${(0,o.k3)()}
37
+ `,Z=e.ZP.div`
38
+ padding: 1px 2px;
39
+ grid-area: 1 / 1 / 2 / 3;
40
+ `,Y=(0,e.ZP)(T.k)`
41
+ display: grid;
42
+ flex: 1 1 0%;
43
+ position: relative;
44
+ `,s=e.ZP.input`
45
+ display: inline-grid;
46
+ grid-area: 1 / 1 / 2 / 3;
47
+ grid-template-columns: 0px min-content;
48
+ background: transparent;
49
+ min-height: ${40/16}rem;
50
+ border: none;
51
+ flex: 1;
52
+ font-size: ${14/16}rem;
53
+ color: ${({theme:p})=>p.colors.neutral800};
54
+ outline: none;
55
+ &:focus-visible {
56
+ outline: none;
57
+ box-shadow: none;
58
+ outline-offset: 0;
59
+ }
60
+ &[aria-disabled='true'] {
61
+ background: inherit;
62
+ color: inherit;
63
+ cursor: not-allowed;
64
+ }
65
+ `,g=(0,e.ZP)(l.x)`
66
+ width: 100%;
67
+ border: none;
68
+ text-align: left;
69
+ outline-offset: -3px;
70
+ ${({isSelected:p,theme:N})=>p&&`background: ${N.colors.primary100};`}
71
+
72
+ &:hover {
73
+ background: ${({theme:p})=>p.colors.primary100};
74
+ }
75
+ `},29439:function(te,O,t){t.d(O,{Z:function(){return T}});var e=t(74512);const l=o=>(0,e.jsx)("svg",{width:"1rem",height:"1rem",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...o,children:(0,e.jsx)("path",{d:"M24 13.3a.2.2 0 0 1-.2.2H5.74l8.239 8.239a.2.2 0 0 1 0 .282L12.14 23.86a.2.2 0 0 1-.282 0L.14 12.14a.2.2 0 0 1 0-.282L11.86.14a.2.2 0 0 1 .282 0L13.98 1.98a.2.2 0 0 1 0 .282L5.74 10.5H23.8c.11 0 .2.09.2.2v2.6Z",fill:"#212134"})}),T=l}}]);
@@ -0,0 +1,71 @@
1
+ "use strict";(self.webpackChunk_strapi_admin=self.webpackChunk_strapi_admin||[]).push([[4121],{74767:function(U,L,t){t.r(L),t.d(L,{default:function(){return ue}});var e=t(32735),a=t(43383),b=t(83983),h=t(53038),O=t(67879),p=t(94638),C=t(96709),D=t(27649),c=t(82055),f=t(99223),i=t(49372),M=t(41415),x=t(17e3),H=t(72850),_=t(56755),ee=t(73269),te=t(33827),G=t(94547),E=t(19786),N=t(44426),ne=t(3685),le=t(35658),S=t(87933),y=t(60216),V=t(8471);const $=V.ZP.div`
2
+ background: ${({theme:l})=>l.colors.danger500};
3
+ border: none;
4
+ border-radius: 16px;
5
+ position: relative;
6
+ height: ${24/16}rem;
7
+ width: ${40/16}rem;
8
+
9
+ & span {
10
+ font-size: ${({visibleLabels:l})=>l?"1rem":0};
11
+ }
12
+
13
+ &:before {
14
+ content: '';
15
+ background: ${({theme:l})=>l.colors.neutral0};
16
+ width: 1rem;
17
+ height: 1rem;
18
+ border-radius: 50%;
19
+ position: absolute;
20
+ transition: all 0.5s;
21
+ left: ${({theme:l})=>l.spaces[1]};
22
+ top: ${({theme:l})=>l.spaces[1]};
23
+ }
24
+
25
+ @media (prefers-reduced-motion: reduce) {
26
+ &:before {
27
+ transition: none;
28
+ }
29
+ }
30
+ `,ae=V.ZP.button`
31
+ background: transparent;
32
+ padding: 0;
33
+ border: none;
34
+
35
+ &[aria-checked='true'] ${$} {
36
+ background: ${({theme:l})=>l.colors.success500};
37
+ }
38
+
39
+ &[aria-checked='true'] ${$}:before {
40
+ transform: translateX(1rem);
41
+ }
42
+ `,W=e.forwardRef(({label:l,onChange:r,onLabel:s,offLabel:d,selected:T,visibleLabels:v,...u},o)=>e.createElement(ae,{ref:o,role:"switch","aria-checked":T,"aria-label":l,onClick:r,visibleLabels:v,type:"button",...u},e.createElement(S.k,null,e.createElement($,null,e.createElement("span",null,s),e.createElement("span",null,d)),v&&e.createElement(H.x,{as:"span","aria-hidden":!0,paddingLeft:2,color:T?"success600":"danger600"},T?s:d))));W.defaultProps={onLabel:"On",offLabel:"Off",visibleLabels:!1},W.propTypes={label:y.string.isRequired,offLabel:y.string,onChange:y.func.isRequired,onLabel:y.string,selected:y.bool.isRequired,visibleLabels:y.bool},W.displayName="Switch";var j=t(50563),oe=t(9695),R=t(19406),F=t(4038),se=t(68625),re=t(54725),ie=t(97889),de=t(3040),ce=t.n(de);const Ee={webhooks:[],webhooksToDelete:[],webhookToDelete:null,loadingWebhooks:!0};var me=(l,r)=>(0,ie.ZP)(l,s=>{switch(r.type){case"GET_DATA_SUCCEEDED":{s.webhooks=r.data,s.loadingWebhooks=!1;break}case"TOGGLE_LOADING":{s.loadingWebhooks=!l.loadingWebhooks;break}case"SET_WEBHOOK_ENABLED":{ce()(s,["webhooks",...r.keys],r.value);break}case"SET_WEBHOOK_TO_DELETE":{s.webhookToDelete=r.id;break}case"SET_WEBHOOKS_TO_DELETE":{r.value?s.webhooksToDelete.push(r.id):s.webhooksToDelete=l.webhooksToDelete.filter(d=>d!==r.id);break}case"SET_ALL_WEBHOOKS_TO_DELETE":{l.webhooksToDelete.length===0?s.webhooksToDelete=l.webhooks.map(d=>d.id):s.webhooksToDelete=[];break}case"WEBHOOKS_DELETED":{s.webhooks=l.webhooks.filter(d=>!l.webhooksToDelete.includes(d.id)),s.webhooksToDelete=[];break}case"WEBHOOK_DELETED":{s.webhooks=l.webhooks.filter((d,T)=>T!==r.index),s.webhookToDelete=null;break}default:return s}}),he=()=>{const{isLoading:l,allowedActions:{canCreate:r,canRead:s,canUpdate:d,canDelete:T}}=(0,a.ss)(b.Z.settings.webhooks),v=(0,a.lm)(),u=(0,e.useRef)(!0),{formatMessage:o}=(0,O.Z)(),[ge,P]=(0,e.useState)(!1),[{webhooks:B,webhooksToDelete:Z,webhookToDelete:K,loadingWebhooks:I},g]=(0,e.useReducer)(me,Ee),{notifyStatus:be}=(0,p.G)();(0,a.go)();const{push:fe}=(0,h.k6)(),{pathname:z}=(0,h.TH)(),A=B.length,k=Z.length,Y=n=>B.findIndex(m=>m.id===n);(0,e.useEffect)(()=>(u.current=!0,()=>{u.current=!1}),[]),(0,e.useEffect)(()=>{s&&Te()},[s]);const Te=async()=>{try{const{data:n}=await(0,a.WY)("/admin/webhooks",{method:"GET"});u.current&&(g({type:"GET_DATA_SUCCEEDED",data:n}),be("webhooks have been loaded"))}catch(n){console.log(n),u.current&&(n.code!==20&&v({type:"warning",message:{id:"notification.error"}}),g({type:"TOGGLE_LOADING"}))}},De=()=>{P(n=>!n)},ve=()=>{K?Le():Oe()},Le=async()=>{try{await(0,a.WY)(`/admin/webhooks/${K}`,{method:"DELETE"}),g({type:"WEBHOOK_DELETED",index:Y(K)})}catch(n){n.code!==20&&v({type:"warning",message:{id:"notification.error"}})}P(!1)},Oe=async()=>{const n={ids:Z};try{await(0,a.WY)("/admin/webhooks/batch-delete",{method:"POST",body:n}),u.current&&g({type:"WEBHOOKS_DELETED"})}catch(m){u.current&&m.code!==20&&v({type:"warning",message:{id:"notification.error"}})}P(!1)},Q=n=>{P(!0),n!=="all"&&g({type:"SET_WEBHOOK_TO_DELETE",id:n})},pe=async(n,m)=>{const X=Y(m),ke=B[X],J=[X,"isEnabled"],q={...ke,isEnabled:n};delete q.id;try{g({type:"SET_WEBHOOK_ENABLED",keys:J,value:n}),await(0,a.WY)(`/admin/webhooks/${m}`,{method:"PUT",body:q})}catch(Me){u.current&&(g({type:"SET_WEBHOOK_ENABLED",keys:J,value:!n}),Me.code!==20&&v({type:"warning",message:{id:"notification.error"}}))}},ye=()=>{g({type:"SET_ALL_WEBHOOKS_TO_DELETE"})},Ce=(n,m)=>{g({type:"SET_WEBHOOKS_TO_DELETE",value:n,id:m})},w=n=>{fe(`${z}/${n}`)};return e.createElement(C.A,null,e.createElement(a.SL,{name:"Webhooks"}),e.createElement(D.o,{"aria-busy":l||I},e.createElement(c.T,{title:o({id:"Settings.webhooks.title",defaultMessage:"Webhooks"}),subtitle:o({id:"Settings.webhooks.list.description",defaultMessage:"Get POST changes notifications"}),primaryAction:r&&!I&&e.createElement(a.Qj,{startIcon:e.createElement(R.Z,null),variant:"default",to:`${z}/create`,size:"S"},o({id:"Settings.webhooks.list.button.add",defaultMessage:"Create new webhook"}))}),k>0&&T&&e.createElement(f.Z,{startActions:e.createElement(e.Fragment,null,e.createElement(i.Z,{variant:"epsilon",textColor:"neutral600"},o({id:"Settings.webhooks.to.delete",defaultMessage:"{webhooksToDeleteLength, plural, one {# asset} other {# assets}} selected"},{webhooksToDeleteLength:k})),e.createElement(M.z,{onClick:()=>Q("all"),startIcon:e.createElement(F.Z,null),size:"L",variant:"danger-light"},o({id:"global.delete",defaultMessage:"Delete"})))}),e.createElement(x.D,null,l||I?e.createElement(H.x,{background:"neutral0",padding:6,shadow:"filterShadow",hasRadius:!0},e.createElement(a.dO,null)):A>0?e.createElement(_.i,{colCount:5,rowCount:A+1,footer:e.createElement(ee.c,{onClick:()=>r?w("create"):{},icon:e.createElement(R.Z,null)},o({id:"Settings.webhooks.list.button.add",defaultMessage:"Create new webhook"}))},e.createElement(te.h,null,e.createElement(G.Tr,null,e.createElement(E.Th,null,e.createElement(N.C,{"aria-label":o({id:"global.select-all-entries",defaultMessage:"Select all entries"}),indeterminate:k>0&&k<A,value:k===A,onValueChange:ye})),e.createElement(E.Th,{width:"20%"},e.createElement(i.Z,{variant:"sigma",textColor:"neutral600"},o({id:"global.name",defaultMessage:"Name"}))),e.createElement(E.Th,{width:"60%"},e.createElement(i.Z,{variant:"sigma",textColor:"neutral600"},o({id:"Settings.webhooks.form.url",defaultMessage:"URL"}))),e.createElement(E.Th,{width:"20%"},e.createElement(i.Z,{variant:"sigma",textColor:"neutral600"},o({id:"Settings.webhooks.list.th.status",defaultMessage:"Status"}))),e.createElement(E.Th,null,e.createElement(ne.T,null,o({id:"Settings.webhooks.list.th.actions",defaultMessage:"Actions"}))))),e.createElement(le.p,null,B.map(n=>e.createElement(G.Tr,{key:n.id,...(0,a.X7)({fn:()=>w(n.id),condition:d})},e.createElement(E.Td,{...a.UW},e.createElement(N.C,{"aria-label":`${o({id:"global.select",defaultMessage:"Select"})} ${n.name}`,value:Z?.includes(n.id),onValueChange:m=>Ce(m,n.id),id:"select",name:"select"})),e.createElement(E.Td,null,e.createElement(i.Z,{fontWeight:"semiBold",textColor:"neutral800"},n.name)),e.createElement(E.Td,null,e.createElement(i.Z,{textColor:"neutral800"},n.url)),e.createElement(E.Td,null,e.createElement(S.k,{...a.UW},e.createElement(W,{onLabel:o({id:"global.enabled",defaultMessage:"Enabled"}),offLabel:o({id:"global.disabled",defaultMessage:"Disabled"}),label:`${n.name} ${o({id:"Settings.webhooks.list.th.status",defaultMessage:"Status"})}`,selected:n.isEnabled,onChange:()=>pe(!n.isEnabled,n.id),visibleLabels:!0}))),e.createElement(E.Td,null,e.createElement(S.k,{gap:1,...a.UW},d&&e.createElement(j.h,{onClick:()=>{w(n.id)},label:o({id:"Settings.webhooks.events.update",defaultMessage:"Update"}),icon:e.createElement(se.Z,null),noBorder:!0}),T&&e.createElement(j.h,{onClick:()=>Q(n.id),label:o({id:"global.delete",defaultMessage:"Delete"}),icon:e.createElement(F.Z,null),noBorder:!0,id:`delete-${n.id}`}))))))):e.createElement(oe.x,{icon:e.createElement(re.Z,{width:"160px"}),content:o({id:"Settings.webhooks.list.empty.description",defaultMessage:"No webhooks found"}),action:e.createElement(M.z,{variant:"secondary",startIcon:e.createElement(R.Z,null),onClick:()=>r?w("create"):{}},o({id:"Settings.webhooks.list.button.add",defaultMessage:"Create new webhook"}))}))),e.createElement(a.QH,{isOpen:ge,onToggleDialog:De,onConfirm:ve}))},ue=()=>e.createElement(a.O4,{permissions:b.Z.settings.webhooks.main},e.createElement(he,null))},99223:function(U,L,t){t.d(L,{Z:function(){return D}});var e=t(32735),a=t(60216),b=t(8471),h=t(72850),O=t(87933);const p=(0,b.ZP)(O.k)`
43
+ & > * + * {
44
+ margin-left: ${({theme:c})=>c.spaces[2]};
45
+ }
46
+
47
+ margin-left: ${({pullRight:c})=>c?"auto":void 0};
48
+ `,C=(0,b.ZP)(p)`
49
+ flex-shrink: 0;
50
+ `,D=({startActions:c,endActions:f})=>c||f?e.createElement(h.x,{paddingLeft:10,paddingRight:10},e.createElement(h.x,{paddingBottom:4},e.createElement(O.k,{justifyContent:"space-between",alignItems:"flex-start"},c&&e.createElement(p,{wrap:"wrap"},c),f&&e.createElement(C,{pullRight:!0},f)))):null;D.defaultProps={endActions:void 0,startActions:void 0},D.propTypes={endActions:a.node,startActions:a.node}},73269:function(U,L,t){t.d(L,{c:function(){return f}});var e=t(32735),a=t(60216),b=t(8471),h=t(72850),O=t(9026),p=t(87933),C=t(49372);const D=(0,b.ZP)(h.x)`
51
+ height: ${24/16}rem;
52
+ width: ${24/16}rem;
53
+ border-radius: 50%;
54
+ display: flex;
55
+ justify-content: center;
56
+ align-items: center;
57
+
58
+ svg {
59
+ height: ${10/16}rem;
60
+ width: ${10/16}rem;
61
+ }
62
+
63
+ svg path {
64
+ fill: ${({theme:i})=>i.colors.primary600};
65
+ }
66
+ `,c=(0,b.ZP)(h.x)`
67
+ border-radius: 0 0 ${({theme:i})=>i.borderRadius} ${({theme:i})=>i.borderRadius};
68
+ display: block;
69
+ width: 100%;
70
+ border: none;
71
+ `,f=({children:i,icon:M,...x})=>e.createElement("div",null,e.createElement(O.i,null),e.createElement(c,{as:"button",background:"primary100",padding:5,...x},e.createElement(p.k,null,e.createElement(D,{"aria-hidden":!0,background:"primary200"},M),e.createElement(h.x,{paddingLeft:3},e.createElement(C.Z,{variant:"pi",fontWeight:"bold",textColor:"primary600"},i)))));f.propTypes={children:a.string.isRequired,icon:a.node.isRequired}}}]);
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Typography } from '@strapi/design-system';
4
4
 
5
- export function ReviewWorkflowsStage({ name }) {
5
+ export function ReviewWorkflowsStageEE({ name }) {
6
6
  return (
7
7
  <Typography fontWeight="regular" textColor="neutral700">
8
8
  {name}
@@ -10,6 +10,6 @@ export function ReviewWorkflowsStage({ name }) {
10
10
  );
11
11
  }
12
12
 
13
- ReviewWorkflowsStage.propTypes = {
13
+ ReviewWorkflowsStageEE.propTypes = {
14
14
  name: PropTypes.string.isRequired,
15
15
  };
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import { Typography } from '@strapi/design-system';
4
+
5
+ import ReviewWorkflowsStage from '.';
6
+ import getTrad from '../../../../../../../admin/src/content-manager/utils/getTrad';
7
+
8
+ export default (layout) => {
9
+ const { formatMessage } = useIntl();
10
+
11
+ // TODO: As soon as the feature was enabled in EE mode, the BE currently does not have a way to send
12
+ // `false` once a user is in CE mode again. We shouldn't have to perform the window.strapi.isEE check here
13
+ // and it is meant to be in interim solution until we find a better one.
14
+ const hasReviewWorkflows =
15
+ (window.strapi.isEE && layout.contentType.options?.reviewWorkflows) ?? false;
16
+
17
+ if (!hasReviewWorkflows) {
18
+ return null;
19
+ }
20
+
21
+ return {
22
+ key: '__strapi_reviewWorkflows_stage_temp_key__',
23
+ name: 'strapi_reviewWorkflows_stage',
24
+ fieldSchema: {
25
+ type: 'custom',
26
+ },
27
+ metadatas: {
28
+ label: formatMessage({
29
+ id: getTrad(`containers.ListPage.table-headers.reviewWorkflows.stage`),
30
+ defaultMessage: 'Review stage',
31
+ }),
32
+ searchable: false,
33
+ sortable: false,
34
+ },
35
+ cellFormatter({ strapi_reviewWorkflows_stage }) {
36
+ // if entities are created e.g. through lifecycle methods
37
+ // they may not have a stage assigned
38
+ if (!strapi_reviewWorkflows_stage) {
39
+ return <Typography textColor="neutral800">-</Typography>;
40
+ }
41
+
42
+ return <ReviewWorkflowsStage name={strapi_reviewWorkflows_stage.name} />;
43
+ },
44
+ };
45
+ };
@@ -0,0 +1,3 @@
1
+ import { ReviewWorkflowsStageEE } from './ReviewWorkflowsStageEE';
2
+
3
+ export default ReviewWorkflowsStageEE;
@@ -4,13 +4,16 @@ import {
4
4
  useCMEditViewDataManager,
5
5
  useAPIErrorHandler,
6
6
  useFetchClient,
7
+ useNotification,
7
8
  } from '@strapi/helper-plugin';
8
- import { Field, FieldLabel, FieldError, Flex } from '@strapi/design-system';
9
+ import { Field, FieldLabel, FieldError, Flex, Loader } from '@strapi/design-system';
9
10
  import { useIntl } from 'react-intl';
10
11
  import { useMutation } from 'react-query';
12
+ import { useDispatch } from 'react-redux';
11
13
 
12
14
  import { useReviewWorkflows } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows';
13
15
  import Information from '../../../../../../admin/src/content-manager/pages/EditView/Information';
16
+ import { updatePartialData } from '../../../../../../admin/src/content-manager/sharedReducers/crudReducer/actions';
14
17
 
15
18
  const ATTRIBUTE_NAME = 'strapi_reviewWorkflows_stage';
16
19
 
@@ -19,27 +22,63 @@ export function InformationBoxEE() {
19
22
  initialData,
20
23
  isCreatingEntry,
21
24
  layout: { uid },
25
+ isSingleType,
22
26
  } = useCMEditViewDataManager();
27
+ const dispatch = useDispatch();
23
28
  const { put } = useFetchClient();
24
29
  const activeWorkflowStage = initialData?.[ATTRIBUTE_NAME] ?? null;
30
+ const hasReviewWorkflowsEnabled = Object.prototype.hasOwnProperty.call(
31
+ initialData,
32
+ ATTRIBUTE_NAME
33
+ );
25
34
  const { formatMessage } = useIntl();
26
35
  const { formatAPIError } = useAPIErrorHandler();
36
+ const toggleNotification = useNotification();
27
37
 
28
- const { workflows: { data: [workflow] = [] } = {} } = useReviewWorkflows();
38
+ const { workflows: { data: workflows, isLoading: workflowIsLoading } = {} } =
39
+ useReviewWorkflows();
40
+ // TODO: this works only as long as we support one workflow
41
+ const workflow = workflows?.[0] ?? null;
29
42
 
30
- const { error, isLoading, mutateAsync } = useMutation(async ({ entityId, stageId, uid }) => {
31
- const {
32
- data: { data },
33
- } = await put(`/admin/content-manager/collection-types/${uid}/${entityId}/stage`, {
34
- data: { id: stageId },
35
- });
43
+ const { error, isLoading, mutateAsync } = useMutation(
44
+ async ({ entityId, stageId, uid }) => {
45
+ const typeSlug = isSingleType ? 'single-types' : 'collection-types';
36
46
 
37
- return data;
38
- });
47
+ const {
48
+ data: { data: createdEntity },
49
+ } = await put(`/admin/content-manager/${typeSlug}/${uid}/${entityId}/stage`, {
50
+ data: { id: stageId },
51
+ });
39
52
 
40
- // stages are empty while the workflow is loading
41
- const options = (workflow?.stages ?? []).map(({ id, name }) => ({ value: id, label: name }));
42
- const formattedError = error ? formatAPIError(error) : null;
53
+ dispatch(updatePartialData({ [ATTRIBUTE_NAME]: createdEntity[ATTRIBUTE_NAME] }));
54
+
55
+ return createdEntity;
56
+ },
57
+ {
58
+ onSuccess() {
59
+ toggleNotification({
60
+ type: 'success',
61
+ message: { id: 'notification.success.saved', defaultMessage: 'Saved' },
62
+ });
63
+ },
64
+ }
65
+ );
66
+
67
+ // if entities are created e.g. through lifecycle methods
68
+ // they may not have a stage assigned. Updating the entity won't
69
+ // set the default stage either which may lead to entities that
70
+ // do not have a stage assigned for a while. By displaying an
71
+ // error by default we are trying to nudge users into assigning a stage.
72
+ const initialStageNullError =
73
+ activeWorkflowStage === null &&
74
+ !workflowIsLoading &&
75
+ !isCreatingEntry &&
76
+ formatMessage({
77
+ id: 'content-manager.reviewWorkflows.stage.select.placeholder',
78
+ defaultMessage: 'Select a stage',
79
+ });
80
+ const formattedMutationError = error && formatAPIError(error);
81
+ const formattedError = formattedMutationError || initialStageNullError || null;
43
82
 
44
83
  const handleStageChange = async ({ value: stageId }) => {
45
84
  try {
@@ -58,7 +97,7 @@ export function InformationBoxEE() {
58
97
  <Information.Root>
59
98
  <Information.Title />
60
99
 
61
- {activeWorkflowStage && (
100
+ {hasReviewWorkflowsEnabled && !isCreatingEntry && (
62
101
  <Field error={formattedError} name={ATTRIBUTE_NAME} id={ATTRIBUTE_NAME}>
63
102
  <Flex direction="column" gap={2} alignItems="stretch">
64
103
  <FieldLabel>
@@ -69,16 +108,20 @@ export function InformationBoxEE() {
69
108
  </FieldLabel>
70
109
 
71
110
  <ReactSelect
111
+ components={{
112
+ LoadingIndicator: () => <Loader small />,
113
+ }}
72
114
  error={formattedError}
73
115
  inputId={ATTRIBUTE_NAME}
74
- isDisabled={isCreatingEntry}
75
- options={options}
76
- name={ATTRIBUTE_NAME}
77
- defaultValue={{ value: activeWorkflowStage?.id, label: activeWorkflowStage?.name }}
78
116
  isLoading={isLoading}
79
117
  isSearchable={false}
80
118
  isClearable={false}
119
+ name={ATTRIBUTE_NAME}
81
120
  onChange={handleStageChange}
121
+ options={
122
+ workflow ? workflow.stages.map(({ id, name }) => ({ value: id, label: name })) : []
123
+ }
124
+ value={{ value: activeWorkflowStage?.id, label: activeWorkflowStage?.name }}
82
125
  />
83
126
 
84
127
  <FieldError />
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { useEffect } from 'react';
7
7
  import { useIntl } from 'react-intl';
8
- import { useLocation } from 'react-router';
8
+ import { useLocation } from 'react-router-dom';
9
9
  import { useNotification } from '@strapi/helper-plugin';
10
10
  import isNil from 'lodash/isNil';
11
11
  import useLicenseLimits from '../useLicenseLimits';
@@ -2,7 +2,7 @@ import { useQuery } from 'react-query';
2
2
  import { useNotification, useFetchClient } from '@strapi/helper-plugin';
3
3
  import { useLocation } from 'react-router-dom';
4
4
 
5
- const useAuditLogsData = ({ canRead }) => {
5
+ const useAuditLogsData = ({ canReadAuditLogs, canReadUsers }) => {
6
6
  const { get } = useFetchClient();
7
7
  const { search } = useLocation();
8
8
  const toggleNotification = useNotification();
@@ -21,7 +21,6 @@ const useAuditLogsData = ({ canRead }) => {
21
21
  };
22
22
 
23
23
  const queryOptions = {
24
- enabled: canRead,
25
24
  keepPreviousData: true,
26
25
  retry: false,
27
26
  staleTime: 1000 * 20, // 20 seconds
@@ -32,10 +31,14 @@ const useAuditLogsData = ({ canRead }) => {
32
31
  data: auditLogs,
33
32
  isLoading,
34
33
  isError: isAuditLogsError,
35
- } = useQuery(['auditLogs', search], fetchAuditLogsPage, queryOptions);
34
+ } = useQuery(['auditLogs', search], fetchAuditLogsPage, {
35
+ ...queryOptions,
36
+ enabled: canReadAuditLogs,
37
+ });
36
38
 
37
39
  const { data: users, isError: isUsersError } = useQuery(['auditLogsUsers'], fetchAllUsers, {
38
40
  ...queryOptions,
41
+ enabled: canReadUsers,
39
42
  staleTime: 2 * (1000 * 60), // 2 minutes
40
43
  });
41
44
 
@@ -25,17 +25,27 @@ import Filters from '../../../../../../../admin/src/pages/SettingsPage/component
25
25
  import getDisplayedFilters from './utils/getDisplayedFilters';
26
26
  import useAuditLogsData from './hooks/useAuditLogsData';
27
27
 
28
+ const auditLogsPermissions = {
29
+ ...adminPermissions.settings.auditLogs,
30
+ readUsers: adminPermissions.settings.users.read,
31
+ };
32
+
28
33
  const ListView = () => {
29
34
  const { formatMessage } = useIntl();
35
+
30
36
  const {
31
- allowedActions: { canRead },
32
- } = useRBAC(adminPermissions.settings.auditLogs);
37
+ allowedActions: { canRead: canReadAuditLogs, canReadUsers },
38
+ } = useRBAC(auditLogsPermissions);
39
+
33
40
  const [{ query }, setQuery] = useQueryParams();
34
- const { auditLogs, users, isLoading, hasError } = useAuditLogsData({ canRead });
41
+ const { auditLogs, users, isLoading, hasError } = useAuditLogsData({
42
+ canReadAuditLogs,
43
+ canReadUsers,
44
+ });
35
45
 
36
46
  useFocusWhenNavigate();
37
47
 
38
- const displayedFilters = getDisplayedFilters({ formatMessage, users });
48
+ const displayedFilters = getDisplayedFilters({ formatMessage, users, canReadUsers });
39
49
 
40
50
  const title = formatMessage({
41
51
  id: 'global.auditLogs',
@@ -73,7 +83,7 @@ const ListView = () => {
73
83
  })}
74
84
  />
75
85
  <ActionLayout startActions={<Filters displayedFilters={displayedFilters} />} />
76
- <ContentLayout canRead={canRead}>
86
+ <ContentLayout canRead={canReadAuditLogs}>
77
87
  <DynamicTable
78
88
  contentType="Audit logs"
79
89
  headers={headers}
@@ -12,27 +12,7 @@ const customOperators = [
12
12
  },
13
13
  ];
14
14
 
15
- const getDisplayedFilters = ({ formatMessage, users }) => {
16
- const getDisplaynameFromUser = (user) => {
17
- if (user.username) {
18
- return user.username;
19
- }
20
- if (user.firstname && user.lastname) {
21
- return formatMessage(
22
- {
23
- id: 'Settings.permissions.auditLogs.user.fullname',
24
- defaultMessage: '{firstname} {lastname}',
25
- },
26
- {
27
- firstname: user.firstname,
28
- lastname: user.lastname,
29
- }
30
- );
31
- }
32
-
33
- return user.email;
34
- };
35
-
15
+ const getDisplayedFilters = ({ formatMessage, users, canReadUsers }) => {
36
16
  const actionOptions = Object.keys(actionTypes).map((action) => {
37
17
  return {
38
18
  label: formatMessage(
@@ -46,17 +26,7 @@ const getDisplayedFilters = ({ formatMessage, users }) => {
46
26
  };
47
27
  });
48
28
 
49
- const userOptions =
50
- users &&
51
- users.results.map((user) => {
52
- return {
53
- label: getDisplaynameFromUser(user),
54
- // Combobox expects a string value
55
- customValue: user.id.toString(),
56
- };
57
- });
58
-
59
- return [
29
+ const filters = [
60
30
  {
61
31
  name: 'action',
62
32
  metadatas: {
@@ -80,20 +50,57 @@ const getDisplayedFilters = ({ formatMessage, users }) => {
80
50
  },
81
51
  fieldSchema: { type: 'datetime' },
82
52
  },
83
- {
84
- name: 'user',
85
- metadatas: {
86
- customOperators,
87
- label: formatMessage({
88
- id: 'Settings.permissions.auditLogs.user',
89
- defaultMessage: 'User',
90
- }),
91
- options: userOptions,
92
- customInput: ComboboxFilter,
93
- },
94
- fieldSchema: { type: 'relation', mainField: { name: 'id' } },
95
- },
96
53
  ];
54
+
55
+ if (canReadUsers && users) {
56
+ const getDisplayNameFromUser = (user) => {
57
+ if (user.username) {
58
+ return user.username;
59
+ }
60
+
61
+ if (user.firstname && user.lastname) {
62
+ return formatMessage(
63
+ {
64
+ id: 'Settings.permissions.auditLogs.user.fullname',
65
+ defaultMessage: '{firstname} {lastname}',
66
+ },
67
+ {
68
+ firstname: user.firstname,
69
+ lastname: user.lastname,
70
+ }
71
+ );
72
+ }
73
+
74
+ return user.email;
75
+ };
76
+
77
+ const userOptions = users.results.map((user) => {
78
+ return {
79
+ label: getDisplayNameFromUser(user),
80
+ // Combobox expects a string value
81
+ customValue: user.id.toString(),
82
+ };
83
+ });
84
+
85
+ return [
86
+ ...filters,
87
+ {
88
+ name: 'user',
89
+ metadatas: {
90
+ customOperators,
91
+ label: formatMessage({
92
+ id: 'Settings.permissions.auditLogs.user',
93
+ defaultMessage: 'User',
94
+ }),
95
+ options: userOptions,
96
+ customInput: ComboboxFilter,
97
+ },
98
+ fieldSchema: { type: 'relation', mainField: { name: 'id' } },
99
+ },
100
+ ];
101
+ }
102
+
103
+ return filters;
97
104
  };
98
105
 
99
106
  export default getDisplayedFilters;
@@ -86,10 +86,10 @@ export function ReviewWorkflowsPage() {
86
86
  };
87
87
 
88
88
  const submitForm = async () => {
89
- setIsConfirmDeleteDialogOpen(false);
90
-
91
89
  await updateWorkflowStages(currentWorkflow.id, currentWorkflow.stages);
92
- refetchWorkflow();
90
+ await refetchWorkflow();
91
+
92
+ setIsConfirmDeleteDialogOpen(false);
93
93
  };
94
94
 
95
95
  const handleConfirmDeleteDialog = async () => {
@@ -122,7 +122,8 @@ export function ReviewWorkflowsPage() {
122
122
 
123
123
  useEffect(() => {
124
124
  trackUsage('didViewWorkflow');
125
- }, [trackUsage]);
125
+ // eslint-disable-next-line react-hooks/exhaustive-deps
126
+ }, []);
126
127
 
127
128
  return (
128
129
  <CheckPagePermissions permissions={adminPermissions.settings['review-workflows'].main}>
@@ -143,6 +144,9 @@ export function ReviewWorkflowsPage() {
143
144
  type="submit"
144
145
  size="M"
145
146
  disabled={!currentWorkflowIsDirty}
147
+ // if the confirm dialog is open the loading state is on
148
+ // the confirm button already
149
+ loading={!isConfirmDeleteDialogOpen && isLoading}
146
150
  >
147
151
  {formatMessage({
148
152
  id: 'global.save',