@strapi/admin 4.5.0-alpha.0 → 4.5.0

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 (317) hide show
  1. package/admin/src/StrapiApp.js +21 -18
  2. package/admin/src/assets/images/hot-air-balloon.png +0 -0
  3. package/admin/src/assets/images/icon_offline-cloud.svg +3 -3
  4. package/admin/src/assets/images/logo-strapi-2022.svg +7 -0
  5. package/admin/src/assets/images/upgrade-details.png +0 -0
  6. package/admin/src/components/Providers/index.js +14 -10
  7. package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +24 -0
  8. package/admin/src/content-manager/components/DynamicTable/CellContent/CellValue.js +1 -1
  9. package/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js +5 -4
  10. package/admin/src/content-manager/components/DynamicTable/CellContent/index.js +10 -0
  11. package/admin/src/content-manager/components/DynamicTable/TableRows/index.js +20 -15
  12. package/admin/src/content-manager/components/DynamicTable/index.js +21 -4
  13. package/admin/src/content-manager/components/DynamicZone/components/Component/index.js +19 -9
  14. package/admin/src/content-manager/components/DynamicZone/index.js +6 -2
  15. package/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +153 -63
  16. package/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +180 -132
  17. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js +70 -16
  18. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/findLeafByPathAndReplace.js +52 -0
  19. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js +2 -0
  20. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/recursivelyFindPathsBasedOnCondition.js +72 -0
  21. package/admin/src/content-manager/components/FieldComponent/index.js +9 -2
  22. package/admin/src/content-manager/components/FieldTypeIcon/index.js +31 -1
  23. package/admin/src/content-manager/components/Inputs/index.js +36 -14
  24. package/admin/src/content-manager/components/NonRepeatableComponent/index.js +2 -0
  25. package/admin/src/content-manager/components/PreviewWysiwyg/index.js +1 -1
  26. package/admin/src/content-manager/components/RelationInput/RelationInput.js +163 -96
  27. package/admin/src/content-manager/components/RelationInput/components/RelationItem.js +2 -2
  28. package/admin/src/content-manager/components/RelationInput/constants.js +1 -1
  29. package/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +116 -73
  30. package/admin/src/content-manager/components/RelationInputDataManager/utils/diffRelations.js +24 -0
  31. package/admin/src/content-manager/components/RelationInputDataManager/utils/index.js +3 -1
  32. package/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js +17 -31
  33. package/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeSearchResults.js +16 -0
  34. package/admin/src/content-manager/components/RelationInputDataManager/utils/select.js +35 -11
  35. package/admin/src/content-manager/components/RepeatableComponent/DraggedItem/index.js +5 -0
  36. package/admin/src/content-manager/components/RepeatableComponent/index.js +4 -3
  37. package/admin/src/content-manager/components/SingleTypeFormWrapper/index.js +23 -0
  38. package/admin/src/content-manager/hooks/__test__/usePrev.test.js +26 -0
  39. package/admin/src/content-manager/hooks/index.js +1 -0
  40. package/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/formatLayouts.js +19 -48
  41. package/admin/src/content-manager/hooks/usePrev.js +14 -0
  42. package/admin/src/content-manager/hooks/useRelation/useRelation.js +116 -15
  43. package/admin/src/content-manager/pages/App/reducer.js +3 -0
  44. package/admin/src/content-manager/pages/EditSettingsView/components/FormModal.js +7 -2
  45. package/admin/src/content-manager/pages/EditSettingsView/index.js +2 -1
  46. package/admin/src/content-manager/pages/EditView/Header/index.js +118 -50
  47. package/admin/src/content-manager/pages/EditView/Header/utils/select.js +4 -0
  48. package/admin/src/content-manager/pages/EditView/index.js +102 -93
  49. package/admin/src/content-manager/pages/ListSettingsView/components/DraggableCard.js +3 -3
  50. package/admin/src/content-manager/pages/ListSettingsView/components/Settings.js +2 -2
  51. package/admin/src/content-manager/pages/ListSettingsView/components/SortDisplayedFields.js +1 -1
  52. package/admin/src/content-manager/pages/ListView/index.js +24 -15
  53. package/admin/src/content-manager/pages/ListView/utils/buildQueryString.js +14 -2
  54. package/admin/src/contexts/ApiTokenPermissions/index.js +24 -0
  55. package/admin/src/core/apis/CustomFields.js +79 -0
  56. package/admin/src/core/apis/index.js +1 -0
  57. package/admin/src/core/store/configureStore.js +17 -2
  58. package/admin/src/favicon.png +0 -0
  59. package/admin/src/hooks/index.js +1 -0
  60. package/admin/src/hooks/useFetchMarketplacePlugins/index.js +2 -2
  61. package/admin/src/hooks/useFetchMarketplacePlugins/utils/api.js +4 -2
  62. package/admin/src/hooks/useFetchMarketplaceProviders/index.js +3 -3
  63. package/admin/src/hooks/useFetchMarketplaceProviders/utils/api.js +5 -3
  64. package/admin/src/hooks/useRegenerate/index.js +34 -0
  65. package/admin/src/index.js +1 -0
  66. package/admin/src/pages/App/index.js +1 -1
  67. package/admin/src/pages/HomePage/SocialLinks.js +1 -1
  68. package/admin/src/pages/HomePage/assets/corner-ornament.svg +48 -0
  69. package/admin/src/pages/HomePage/index.js +3 -2
  70. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/CardButton.js +110 -0
  71. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/InstallPluginButton.js +32 -21
  72. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/PackageStats.js +79 -0
  73. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/index.js +28 -11
  74. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FilterSelect.js +41 -0
  75. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FiltersPopover.js +96 -0
  76. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/index.js +106 -0
  77. package/admin/src/pages/MarketplacePage/components/NpmPackagesGrid/index.js +4 -0
  78. package/admin/src/pages/MarketplacePage/components/SortSelect/index.js +70 -0
  79. package/admin/src/pages/MarketplacePage/index.js +68 -8
  80. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ActionBoundRoutes/index.js +56 -0
  81. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/getMethodColor.js +41 -0
  82. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/index.js +72 -0
  83. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/CheckBoxWrapper.js +30 -0
  84. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +150 -0
  85. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ContenTypesSection/index.js +37 -0
  86. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js +255 -0
  87. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormBody/index.js +78 -0
  88. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormHead/index.js +89 -0
  89. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Permissions/index.js +40 -0
  90. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +68 -0
  91. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +216 -197
  92. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/init.js +13 -0
  93. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/reducer.js +72 -0
  94. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/getDateOfExpiration.js +16 -0
  95. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/index.js +5 -0
  96. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/schema.js +2 -1
  97. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/transformPermissionsData.js +36 -0
  98. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/DefaultButton/index.js +63 -0
  99. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/DeleteButton/index.js +1 -0
  100. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/ReadButton/index.js +19 -0
  101. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/UpdateButton/index.js +3 -36
  102. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/index.js +13 -11
  103. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js +3 -2
  104. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/utils/tableHeaders.js +8 -8
  105. package/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedEditView/index.js +1 -1
  106. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/index.js +7 -38
  107. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/options.js +31 -0
  108. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/index.js +32 -43
  109. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/index.js +1 -1
  110. package/admin/src/pages/SettingsPage/pages/Roles/ListPage/components/RoleRow/index.js +3 -1
  111. package/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js +2 -1
  112. package/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/index.js +2 -2
  113. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/EventInput/index.js +2 -2
  114. package/admin/src/permissions/defaultPermissions.js +2 -6
  115. package/admin/src/translations/ca.json +4 -2
  116. package/admin/src/translations/de.json +5 -2
  117. package/admin/src/translations/dk.json +4 -1
  118. package/admin/src/translations/en.json +38 -3
  119. package/admin/src/translations/es.json +157 -158
  120. package/admin/src/translations/fr.json +4 -1
  121. package/admin/src/translations/gu.json +608 -606
  122. package/admin/src/translations/he.json +1 -1
  123. package/admin/src/translations/hi.json +689 -687
  124. package/admin/src/translations/hu.json +3 -1
  125. package/admin/src/translations/id.json +3 -1
  126. package/admin/src/translations/it.json +3 -1
  127. package/admin/src/translations/ja.json +3 -1
  128. package/admin/src/translations/ko.json +3 -1
  129. package/admin/src/translations/ml.json +689 -687
  130. package/admin/src/translations/nl.json +4 -1
  131. package/admin/src/translations/no.json +1 -1
  132. package/admin/src/translations/pl.json +3 -1
  133. package/admin/src/translations/pt-BR.json +4 -1
  134. package/admin/src/translations/ru.json +489 -491
  135. package/admin/src/translations/sa.json +86 -83
  136. package/admin/src/translations/sk.json +4 -1
  137. package/admin/src/translations/sv.json +4 -1
  138. package/admin/src/translations/th.json +1 -1
  139. package/admin/src/translations/zh-Hans.json +5 -2
  140. package/admin/src/translations/zh.json +4 -1
  141. package/build/1856.172d5fa0.chunk.js +174 -0
  142. package/build/2077.058590f4.chunk.js +206 -0
  143. package/build/2912.2c42c07b.chunk.js +259 -0
  144. package/build/4318.5e670740.chunk.js +30 -0
  145. package/build/4715.22747b59.chunk.js +387 -0
  146. package/build/{4800.d09f1225.chunk.js → 4800.a6935af6.chunk.js} +1 -1
  147. package/build/4982.1b75ddb1.chunk.js +325 -0
  148. package/build/617f9c948fa79e6d73bd.png +0 -0
  149. package/build/6d21938306785f176538.png +0 -0
  150. package/build/70674f63fc3904c20de0.svg +7 -0
  151. package/build/7379.d246dd38.chunk.js +1 -0
  152. package/build/7692.a36fb2c2.chunk.js +470 -0
  153. package/build/7841.c50e9509.chunk.js +259 -0
  154. package/build/7866.ba215f99.chunk.js +505 -0
  155. package/build/7e9af4fb7e723fcebf1f.svg +48 -0
  156. package/build/8380.e53e7207.chunk.js +299 -0
  157. package/build/8549.832ed79d.chunk.js +159 -0
  158. package/build/8738.0fe8a61e.chunk.js +463 -0
  159. package/build/{9066.08049eb1.chunk.js → 9066.eaf76ff3.chunk.js} +5 -5
  160. package/build/{9166.037339e0.chunk.js → 9166.90876521.chunk.js} +16 -15
  161. package/build/{9420.43a86e7c.chunk.js → 9420.5292d1d2.chunk.js} +38 -37
  162. package/build/9649.468667d9.chunk.js +199 -0
  163. package/build/9d5d788027e86620c234.svg +5 -0
  164. package/build/{Admin-authenticatedApp.e39f36c9.chunk.js → Admin-authenticatedApp.c4f68103.chunk.js} +3 -3
  165. package/build/{Admin_homePage.118926e0.chunk.js → Admin_homePage.26d32e30.chunk.js} +6 -5
  166. package/build/Admin_marketplace.32375885.chunk.js +22 -0
  167. package/build/{Admin_profilePage.9d50ac44.chunk.js → Admin_profilePage.da32abbc.chunk.js} +1 -1
  168. package/build/Admin_settingsPage.bf2234e1.chunk.js +178 -0
  169. package/build/admin-app.9049056c.chunk.js +112 -0
  170. package/build/admin-edit-roles-page.69d9fcb2.chunk.js +1 -0
  171. package/build/{admin-users.97a08630.chunk.js → admin-users.d71f198a.chunk.js} +3 -3
  172. package/build/api-tokens-create-page.93dd0689.chunk.js +1 -0
  173. package/build/api-tokens-edit-page.b0adac81.chunk.js +1 -0
  174. package/build/api-tokens-list-page.bb36535f.chunk.js +16 -0
  175. package/build/ca-json.07ae0f2c.chunk.js +1 -0
  176. package/build/content-manager.ff998bed.chunk.js +1204 -0
  177. package/build/content-type-builder-list-view.5b3cd768.chunk.js +194 -0
  178. package/build/content-type-builder-translation-en-json.f985c9c4.chunk.js +1 -0
  179. package/build/content-type-builder-translation-sv-json.6deff030.chunk.js +1 -0
  180. package/build/content-type-builder.16af63a6.chunk.js +145 -0
  181. package/build/de-json.6b3e1894.chunk.js +1 -0
  182. package/build/dk-json.144c6a8e.chunk.js +1 -0
  183. package/build/{email-settings-page.64037147.chunk.js → email-settings-page.c3469093.chunk.js} +6 -6
  184. package/build/en-json.4a269f6b.chunk.js +1 -0
  185. package/build/es-json.6d123a82.chunk.js +1 -0
  186. package/build/fr-json.28ab54cb.chunk.js +1 -0
  187. package/build/gu-json.9a50ea64.chunk.js +1 -0
  188. package/build/he-json.72f18790.chunk.js +1 -0
  189. package/build/hi-json.0301b7ba.chunk.js +1 -0
  190. package/build/hu-json.c4b641bb.chunk.js +1 -0
  191. package/build/{i18n-settings-page.0b73785d.chunk.js → i18n-settings-page.46d894ff.chunk.js} +5 -5
  192. package/build/id-json.86035797.chunk.js +1 -0
  193. package/build/index.html +1 -1
  194. package/build/it-json.bbdc8993.chunk.js +1 -0
  195. package/build/ja-json.1c9eeeec.chunk.js +1 -0
  196. package/build/ko-json.e1f66398.chunk.js +1 -0
  197. package/build/main.91328e7a.js +9381 -0
  198. package/build/ml-json.963c889f.chunk.js +1 -0
  199. package/build/nl-json.2b8cc3a0.chunk.js +1 -0
  200. package/build/no-json.a58c28bd.chunk.js +1 -0
  201. package/build/pl-json.249626b3.chunk.js +1 -0
  202. package/build/pt-BR-json.7852f808.chunk.js +1 -0
  203. package/build/ru-json.d7cfc2ff.chunk.js +1 -0
  204. package/build/runtime~main.c9c319c0.js +2 -0
  205. package/build/sa-json.44e95991.chunk.js +1 -0
  206. package/build/sk-json.7ba4b330.chunk.js +1 -0
  207. package/build/sso-settings-page.9ceb0140.chunk.js +1 -0
  208. package/build/sv-json.8e5a7911.chunk.js +1 -0
  209. package/build/th-json.a67309b1.chunk.js +1 -0
  210. package/build/{upload-settings.80ff0974.chunk.js → upload-settings.53b690f3.chunk.js} +5 -5
  211. package/build/{upload-translation-en-json.004a86c1.chunk.js → upload-translation-en-json.86da7b0a.chunk.js} +1 -1
  212. package/build/{users-advanced-settings-page.a02f4806.chunk.js → users-advanced-settings-page.3f4ee86e.chunk.js} +5 -5
  213. package/build/{webhook-edit-page.d2ea3351.chunk.js → webhook-edit-page.dc9442ce.chunk.js} +2 -2
  214. package/build/webhook-list-page.02191138.chunk.js +134 -0
  215. package/build/zh-Hans-json.21617c24.chunk.js +1 -0
  216. package/build/zh-json.608aaf24.chunk.js +1 -0
  217. package/ee/admin/pages/SettingsPage/pages/Roles/ListPage/index.js +3 -2
  218. package/ee/server/controllers/user.js +5 -3
  219. package/env.js +1 -0
  220. package/package.json +13 -11
  221. package/scripts/build.js +11 -0
  222. package/server/bootstrap.js +19 -1
  223. package/server/config/admin-actions.js +20 -0
  224. package/server/content-types/api-token-permission.js +36 -0
  225. package/server/content-types/api-token.js +25 -1
  226. package/server/content-types/index.js +1 -0
  227. package/server/controllers/admin.js +3 -0
  228. package/server/controllers/api-token.js +24 -1
  229. package/server/controllers/content-api.js +15 -0
  230. package/server/controllers/index.js +1 -0
  231. package/server/controllers/user.js +3 -2
  232. package/server/routes/api-tokens.js +11 -0
  233. package/server/routes/content-api.js +20 -0
  234. package/server/routes/index.js +2 -0
  235. package/server/services/api-token.js +309 -29
  236. package/server/services/constants.js +10 -0
  237. package/server/services/permission/engine.js +36 -226
  238. package/server/services/permission.js +4 -1
  239. package/server/strategies/admin.js +7 -1
  240. package/server/strategies/api-token.js +72 -11
  241. package/server/validation/api-tokens.js +12 -2
  242. package/utils/create-plugins-exclude-path.js +40 -0
  243. package/utils/get-custom-app-config-file.js +5 -0
  244. package/webpack.alias.js +0 -13
  245. package/webpack.config.js +4 -1
  246. package/admin/src/assets/images/banner_strapi-rocket.png +0 -0
  247. package/admin/src/assets/images/big-logo-home.png +0 -0
  248. package/admin/src/assets/images/homepage-logo.png +0 -0
  249. package/admin/src/assets/images/icon_made-by-strapi.svg +0 -5
  250. package/admin/src/assets/images/logo_strapi_auth.png +0 -0
  251. package/admin/src/assets/images/logo_strapi_auth_v4.png +0 -0
  252. package/admin/src/assets/images/logo_strapi_menu.png +0 -0
  253. package/admin/src/assets/images/oops.png +0 -0
  254. package/admin/src/content-manager/components/State/index.js +0 -37
  255. package/admin/src/favicon.ico +0 -0
  256. package/build/15026a3d58aeb2828134.png +0 -0
  257. package/build/1856.47226450.chunk.js +0 -173
  258. package/build/2077.c935ee42.chunk.js +0 -205
  259. package/build/2912.a015078a.chunk.js +0 -258
  260. package/build/4715.58cd558f.chunk.js +0 -387
  261. package/build/4982.05eda880.chunk.js +0 -324
  262. package/build/7098.40dcd7bf.chunk.js +0 -1
  263. package/build/7841.91f793dc.chunk.js +0 -258
  264. package/build/7866.1201afbd.chunk.js +0 -504
  265. package/build/8380.8789ff76.chunk.js +0 -284
  266. package/build/8549.133c4473.chunk.js +0 -158
  267. package/build/8851.e4ac62f2.chunk.js +0 -158
  268. package/build/90f49a385afb000fb1d4.svg +0 -5
  269. package/build/9311.7cc03f29.chunk.js +0 -508
  270. package/build/Admin_marketplace.82c0570b.chunk.js +0 -11
  271. package/build/Admin_settingsPage.98a711e5.chunk.js +0 -178
  272. package/build/a6b842e0b6d2b61135d1.svg +0 -5
  273. package/build/admin-app.4f7618a9.chunk.js +0 -112
  274. package/build/admin-edit-roles-page.554ba3fa.chunk.js +0 -1
  275. package/build/api-tokens-create-page.4c262d6e.chunk.js +0 -1
  276. package/build/api-tokens-edit-page.10a9d368.chunk.js +0 -1
  277. package/build/api-tokens-list-page.442c9f3c.chunk.js +0 -15
  278. package/build/b997a22a2e0b87ef1fa2.ico +0 -0
  279. package/build/bd81ba6c07827282255d.png +0 -0
  280. package/build/c3de6118ef47086ad05c.png +0 -0
  281. package/build/ca-json.a16899ae.chunk.js +0 -1
  282. package/build/content-manager.7d57c9d1.chunk.js +0 -1200
  283. package/build/content-type-builder-list-view.8cc534e0.chunk.js +0 -194
  284. package/build/content-type-builder-translation-en-json.201bfb78.chunk.js +0 -1
  285. package/build/content-type-builder.684df7a4.chunk.js +0 -142
  286. package/build/de-json.aa6026b3.chunk.js +0 -1
  287. package/build/dk-json.fac2bcfb.chunk.js +0 -1
  288. package/build/en-json.0c69c7d7.chunk.js +0 -1
  289. package/build/es-json.d672e181.chunk.js +0 -1
  290. package/build/fb376b132d18bf4522ca.png +0 -0
  291. package/build/fde9b1ad0670d29a2516.png +0 -0
  292. package/build/fr-json.71a16175.chunk.js +0 -1
  293. package/build/gu-json.ca345cd1.chunk.js +0 -1
  294. package/build/he-json.3b825d80.chunk.js +0 -1
  295. package/build/hi-json.50c7e6d4.chunk.js +0 -1
  296. package/build/hu-json.e0521dcc.chunk.js +0 -1
  297. package/build/id-json.4b1ff8d6.chunk.js +0 -1
  298. package/build/it-json.86bac220.chunk.js +0 -1
  299. package/build/ja-json.4e44e36b.chunk.js +0 -1
  300. package/build/ko-json.1003756e.chunk.js +0 -1
  301. package/build/main.b47db1a3.js +0 -9337
  302. package/build/ml-json.c7774425.chunk.js +0 -1
  303. package/build/nl-json.f58ea235.chunk.js +0 -1
  304. package/build/no-json.40386397.chunk.js +0 -1
  305. package/build/pl-json.fed96aba.chunk.js +0 -1
  306. package/build/pt-BR-json.073799ab.chunk.js +0 -1
  307. package/build/ru-json.7ad2cbbf.chunk.js +0 -1
  308. package/build/runtime~main.feeac6d3.js +0 -2
  309. package/build/sa-json.f0f704f0.chunk.js +0 -1
  310. package/build/sk-json.a848961b.chunk.js +0 -1
  311. package/build/sso-settings-page.445184e0.chunk.js +0 -1
  312. package/build/sv-json.b038acbe.chunk.js +0 -1
  313. package/build/th-json.72e8de3d.chunk.js +0 -1
  314. package/build/webhook-list-page.2775a683.chunk.js +0 -134
  315. package/build/zh-Hans-json.03d2bda1.chunk.js +0 -1
  316. package/build/zh-json.3d0cc664.chunk.js +0 -1
  317. package/server/services/permission/engine-hooks.js +0 -82
@@ -0,0 +1,36 @@
1
+ import { flatten } from 'lodash';
2
+
3
+ const transformPermissionsData = (data) => {
4
+ const layout = {
5
+ allActionsIds: [],
6
+ permissions: [],
7
+ };
8
+
9
+ layout.permissions = Object.keys(data).map((apiId) => ({
10
+ apiId,
11
+ label: apiId.split('::')[1],
12
+ controllers: flatten(
13
+ Object.keys(data[apiId].controllers).map((controller) => ({
14
+ controller,
15
+ actions: flatten(
16
+ data[apiId].controllers[controller].map((action) => {
17
+ const actionId = `${apiId}.${controller}.${action}`;
18
+
19
+ if (apiId.includes('api::')) {
20
+ layout.allActionsIds.push(actionId);
21
+ }
22
+
23
+ return {
24
+ action,
25
+ actionId,
26
+ };
27
+ })
28
+ ),
29
+ }))
30
+ ),
31
+ }));
32
+
33
+ return layout;
34
+ };
35
+
36
+ export default transformPermissionsData;
@@ -0,0 +1,63 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import PropTypes from 'prop-types';
4
+ import { Link } from '@strapi/helper-plugin';
5
+ import { useHistory } from 'react-router-dom';
6
+ import styled from 'styled-components';
7
+
8
+ const MESSAGES_MAP = {
9
+ edit: {
10
+ id: 'app.component.table.edit',
11
+ defaultMessage: 'Edit {target}',
12
+ },
13
+ read: {
14
+ id: 'app.component.table.read',
15
+ defaultMessage: 'Read {target}',
16
+ },
17
+ };
18
+
19
+ const LinkStyled = styled(Link)`
20
+ svg {
21
+ path {
22
+ fill: ${({ theme }) => theme.colors.neutral500};
23
+ }
24
+ }
25
+
26
+ &:hover,
27
+ &:focus {
28
+ svg {
29
+ path {
30
+ fill: ${({ theme }) => theme.colors.neutral800};
31
+ }
32
+ }
33
+ }
34
+ `;
35
+
36
+ const DefaultButton = ({ tokenName, tokenId, buttonType, children }) => {
37
+ const { formatMessage } = useIntl();
38
+ const {
39
+ location: { pathname },
40
+ } = useHistory();
41
+
42
+ return (
43
+ <LinkStyled
44
+ to={`${pathname}/${tokenId}`}
45
+ title={formatMessage(MESSAGES_MAP[buttonType], { target: tokenName })}
46
+ >
47
+ {children}
48
+ </LinkStyled>
49
+ );
50
+ };
51
+
52
+ DefaultButton.propTypes = {
53
+ tokenName: PropTypes.string.isRequired,
54
+ tokenId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
55
+ buttonType: PropTypes.string,
56
+ children: PropTypes.node.isRequired,
57
+ };
58
+
59
+ DefaultButton.defaultProps = {
60
+ buttonType: 'edit',
61
+ };
62
+
63
+ export default DefaultButton;
@@ -24,6 +24,7 @@ const DeleteButton = ({ tokenName, onClickDelete }) => {
24
24
  },
25
25
  { target: `${tokenName}` }
26
26
  )}
27
+ name="delete"
27
28
  noBorder
28
29
  icon={<Trash />}
29
30
  />
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import Eye from '@strapi/icons/Eye';
3
+ import PropTypes from 'prop-types';
4
+ import DefaultButton from '../DefaultButton';
5
+
6
+ const ReadButton = ({ tokenName, tokenId }) => {
7
+ return (
8
+ <DefaultButton tokenName={tokenName} tokenId={tokenId} buttonType="read">
9
+ <Eye />
10
+ </DefaultButton>
11
+ );
12
+ };
13
+
14
+ ReadButton.propTypes = {
15
+ tokenName: PropTypes.string.isRequired,
16
+ tokenId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
17
+ };
18
+
19
+ export default ReadButton;
@@ -1,46 +1,13 @@
1
1
  import React from 'react';
2
2
  import Pencil from '@strapi/icons/Pencil';
3
- import { useIntl } from 'react-intl';
4
3
  import PropTypes from 'prop-types';
5
- import { Link } from '@strapi/helper-plugin';
6
- import { useHistory } from 'react-router-dom';
7
- import styled from 'styled-components';
8
-
9
- const LinkUpdate = styled(Link)`
10
- svg {
11
- path {
12
- fill: ${({ theme }) => theme.colors.neutral500};
13
- }
14
- }
15
-
16
- &:hover {
17
- svg {
18
- path {
19
- fill: ${({ theme }) => theme.colors.neutral800};
20
- }
21
- }
22
- }
23
- `;
4
+ import DefaultButton from '../DefaultButton';
24
5
 
25
6
  const UpdateButton = ({ tokenName, tokenId }) => {
26
- const { formatMessage } = useIntl();
27
- const {
28
- location: { pathname },
29
- } = useHistory();
30
-
31
7
  return (
32
- <LinkUpdate
33
- to={`${pathname}/${tokenId}`}
34
- title={formatMessage(
35
- {
36
- id: 'app.component.table.edit',
37
- defaultMessage: 'Edit {target}',
38
- },
39
- { target: `${tokenName}` }
40
- )}
41
- >
8
+ <DefaultButton tokenName={tokenName} tokenId={tokenId}>
42
9
  <Pencil />
43
- </LinkUpdate>
10
+ </DefaultButton>
44
11
  );
45
12
  };
46
13
 
@@ -1,5 +1,4 @@
1
1
  import React from 'react';
2
- import { useIntl } from 'react-intl';
3
2
  import PropTypes from 'prop-types';
4
3
  import { useHistory } from 'react-router-dom';
5
4
 
@@ -13,12 +12,11 @@ import {
13
12
  pxToRem,
14
13
  useTracking,
15
14
  } from '@strapi/helper-plugin';
16
-
17
15
  import DeleteButton from './DeleteButton';
18
16
  import UpdateButton from './UpdateButton';
17
+ import ReadButton from './ReadButton';
19
18
 
20
- const TableRows = ({ canDelete, canUpdate, onClickDelete, withBulkActions, rows }) => {
21
- const { formatMessage } = useIntl();
19
+ const TableRows = ({ canDelete, canUpdate, canRead, onClickDelete, withBulkActions, rows }) => {
22
20
  const [{ query }] = useQueryParams();
23
21
  const [, sortOrder] = query.sort.split(':');
24
22
  const {
@@ -59,22 +57,24 @@ const TableRows = ({ canDelete, canUpdate, onClickDelete, withBulkActions, rows
59
57
  </Td>
60
58
  <Td>
61
59
  <Typography textColor="neutral800">
62
- {formatMessage({
63
- id: `Settings.apiTokens.types.${apiToken.type}`,
64
- defaultMessage: 'Type unknown',
65
- })}
60
+ <RelativeTime timestamp={new Date(apiToken.createdAt)} />
66
61
  </Typography>
67
62
  </Td>
68
63
  <Td>
69
- <Typography textColor="neutral800">
70
- <RelativeTime timestamp={new Date(apiToken.createdAt)} />
71
- </Typography>
64
+ {apiToken.lastUsedAt && (
65
+ <Typography textColor="neutral800">
66
+ <RelativeTime timestamp={new Date(apiToken.lastUsedAt)} />
67
+ </Typography>
68
+ )}
72
69
  </Td>
73
70
 
74
71
  {withBulkActions && (
75
72
  <Td>
76
73
  <Flex justifyContent="end">
77
74
  {canUpdate && <UpdateButton tokenName={apiToken.name} tokenId={apiToken.id} />}
75
+ {!canUpdate && canRead && (
76
+ <ReadButton tokenName={apiToken.name} tokenId={apiToken.id} />
77
+ )}
78
78
  {canDelete && (
79
79
  <DeleteButton
80
80
  tokenName={apiToken.name}
@@ -94,6 +94,7 @@ const TableRows = ({ canDelete, canUpdate, onClickDelete, withBulkActions, rows
94
94
  TableRows.defaultProps = {
95
95
  canDelete: false,
96
96
  canUpdate: false,
97
+ canRead: false,
97
98
  onClickDelete() {},
98
99
  rows: [],
99
100
  withBulkActions: false,
@@ -102,6 +103,7 @@ TableRows.defaultProps = {
102
103
  TableRows.propTypes = {
103
104
  canDelete: PropTypes.bool,
104
105
  canUpdate: PropTypes.bool,
106
+ canRead: PropTypes.bool,
105
107
  onClickDelete: PropTypes.func,
106
108
  rows: PropTypes.array,
107
109
  withBulkActions: PropTypes.bool,
@@ -147,15 +147,16 @@ const ApiTokenListView = () => {
147
147
  headers={headers}
148
148
  contentType="api-tokens"
149
149
  rows={apiTokens}
150
- withBulkActions={canDelete || canUpdate}
150
+ withBulkActions={canDelete || canUpdate || canRead}
151
151
  isLoading={isLoading}
152
152
  onConfirmDelete={(id) => deleteMutation.mutateAsync(id)}
153
153
  >
154
154
  <TableRows
155
+ canRead={canRead}
155
156
  canDelete={canDelete}
156
157
  canUpdate={canUpdate}
157
158
  rows={apiTokens}
158
- withBulkActions={canDelete || canUpdate}
159
+ withBulkActions={canDelete || canUpdate || canRead}
159
160
  />
160
161
  </DynamicTable>
161
162
  )}
@@ -22,23 +22,23 @@ const tableHeaders = [
22
22
  },
23
23
  },
24
24
  {
25
- name: 'type',
26
- key: 'type',
25
+ name: 'createdAt',
26
+ key: 'createdAt',
27
27
  metadatas: {
28
28
  label: {
29
- id: 'Settings.apiTokens.ListView.headers.type',
30
- defaultMessage: 'Token type',
29
+ id: 'Settings.apiTokens.ListView.headers.createdAt',
30
+ defaultMessage: 'Created at',
31
31
  },
32
32
  sortable: false,
33
33
  },
34
34
  },
35
35
  {
36
- name: 'createdAt',
37
- key: 'createdAt',
36
+ name: 'lastUsedAt',
37
+ key: 'lastUsedAt',
38
38
  metadatas: {
39
39
  label: {
40
- id: 'Settings.apiTokens.ListView.headers.createdAt',
41
- defaultMessage: 'Created at',
40
+ id: 'Settings.apiTokens.ListView.headers.lastUsedAt',
41
+ defaultMessage: 'Last used',
42
42
  },
43
43
  sortable: false,
44
44
  },
@@ -5,7 +5,7 @@ import EditView from '../EditView';
5
5
 
6
6
  const ProtectedApiTokenCreateView = () => {
7
7
  return (
8
- <CheckPagePermissions permissions={adminPermissions.settings['api-tokens'].update}>
8
+ <CheckPagePermissions permissions={adminPermissions.settings['api-tokens'].read}>
9
9
  <EditView />
10
10
  </CheckPagePermissions>
11
11
  );
@@ -5,14 +5,9 @@ import { Box } from '@strapi/design-system/Box';
5
5
  import { Flex } from '@strapi/design-system/Flex';
6
6
  import { Typography } from '@strapi/design-system/Typography';
7
7
  import { MultiSelectNested } from '@strapi/design-system/Select';
8
- import upperFirst from 'lodash/upperFirst';
9
8
  import { useIntl } from 'react-intl';
10
- import styled from 'styled-components';
11
- import { rowHeight } from '../../Permissions/utils/constants';
12
9
 
13
- const FlexWrapper = styled(Flex)`
14
- height: ${rowHeight};
15
- `;
10
+ import { getNestedOptions, getSelectedValues, getNewStateFromChangedValues } from './utils/options';
16
11
 
17
12
  const ActionRow = ({
18
13
  arrayOfOptionsGroupedByCategory,
@@ -24,40 +19,13 @@ const ActionRow = ({
24
19
  value,
25
20
  }) => {
26
21
  const { formatMessage } = useIntl();
27
- const options = arrayOfOptionsGroupedByCategory.reduce((arr, curr) => {
28
- const [label, children] = curr;
29
- const obj = {
30
- label: upperFirst(label),
31
- children: children.map((child) => ({
32
- label: child.displayName,
33
- value: child.id,
34
- })),
35
- };
36
22
 
37
- return [...arr, obj];
38
- }, []);
39
-
40
- // Output: ['value1', 'value2']
41
- const values = Object.values(value)
42
- .map((x) =>
43
- Object.entries(x)
44
- .filter(([, value]) => value)
45
- .map(([key]) => key)
46
- )
47
- .flat();
48
-
49
- // ! Only expects arrayOfOpt to be [['default', obj]] - might break in future changes
50
23
  const handleChange = (val) => {
51
- const [[, values]] = arrayOfOptionsGroupedByCategory;
52
- const formattedValues = values.reduce(
53
- (acc, curr) => ({ [curr.id]: val.includes(curr.id), ...acc }),
54
- {}
55
- );
56
- onChange(name, formattedValues);
24
+ onChange(name, getNewStateFromChangedValues(arrayOfOptionsGroupedByCategory, val));
57
25
  };
58
26
 
59
27
  return (
60
- <FlexWrapper as="li" background={isGrey ? 'neutral100' : 'neutral0'}>
28
+ <Flex as="li" background={isGrey ? 'neutral100' : 'neutral0'} paddingBottom={3} paddingTop={3}>
61
29
  <Flex paddingLeft={6} style={{ width: 180 }}>
62
30
  <Typography variant="sigma" textColor="neutral600">
63
31
  {formatMessage({
@@ -85,12 +53,12 @@ const ActionRow = ({
85
53
  id={name}
86
54
  customizeContent={(values) => `${values.length} currently selected`}
87
55
  onChange={handleChange}
88
- value={values}
89
- options={options}
56
+ value={getSelectedValues(value)}
57
+ options={getNestedOptions(arrayOfOptionsGroupedByCategory)}
90
58
  disabled={isFormDisabled || IS_DISABLED}
91
59
  />
92
60
  </Box>
93
- </FlexWrapper>
61
+ </Flex>
94
62
  );
95
63
  };
96
64
 
@@ -103,4 +71,5 @@ ActionRow.propTypes = {
103
71
  value: PropTypes.object.isRequired,
104
72
  onChange: PropTypes.func.isRequired,
105
73
  };
74
+
106
75
  export default ActionRow;
@@ -0,0 +1,31 @@
1
+ import upperFirst from 'lodash/upperFirst';
2
+
3
+ const getSelectedValues = (rawValue) =>
4
+ Object.values(rawValue)
5
+ .map((x) =>
6
+ Object.entries(x)
7
+ .filter(([, value]) => value)
8
+ .map(([key]) => key)
9
+ )
10
+ .flat();
11
+
12
+ const getNestedOptions = (options) =>
13
+ options.reduce((acc, [label, children]) => {
14
+ acc.push({
15
+ label: upperFirst(label),
16
+ children: children.map((child) => ({
17
+ label: child.displayName,
18
+ value: child.id,
19
+ })),
20
+ });
21
+
22
+ return acc;
23
+ }, []);
24
+
25
+ const getNewStateFromChangedValues = (options, changedValues) =>
26
+ options
27
+ .map(([, values]) => values)
28
+ .flat()
29
+ .reduce((acc, curr) => ({ [curr.id]: changedValues.includes(curr.id), ...acc }), {});
30
+
31
+ export { getNestedOptions, getSelectedValues, getNewStateFromChangedValues };
@@ -1,10 +1,12 @@
1
1
  import React, { useMemo, useState } from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { Box } from '@strapi/design-system/Box';
4
3
  import { Button } from '@strapi/design-system/Button';
5
- import { Divider } from '@strapi/design-system/Divider';
6
- import { Stack } from '@strapi/design-system/Stack';
7
- import { ModalFooter, ModalHeader, ModalLayout } from '@strapi/design-system/ModalLayout';
4
+ import {
5
+ ModalFooter,
6
+ ModalHeader,
7
+ ModalLayout,
8
+ ModalBody,
9
+ } from '@strapi/design-system/ModalLayout';
8
10
  import { Breadcrumbs, Crumb } from '@strapi/design-system/Breadcrumbs';
9
11
  import { Typography } from '@strapi/design-system/Typography';
10
12
  import produce from 'immer';
@@ -88,48 +90,35 @@ const ConditionsModal = ({ actions, headerBreadCrumbs, isFormDisabled, onClosed,
88
90
  ))}
89
91
  </Breadcrumbs>
90
92
  </ModalHeader>
91
- <Box padding={8}>
92
- <Stack spacing={6}>
93
- <Typography variant="beta" as="h2">
93
+ <ModalBody>
94
+ {actionsToDisplay.length === 0 && (
95
+ <Typography>
94
96
  {formatMessage({
95
- id: 'Settings.permissions.conditions.define-conditions',
96
- defaultMessage: 'Define conditions',
97
+ id: 'Settings.permissions.conditions.no-actions',
98
+ defaultMessage:
99
+ 'You first need to select actions (create, read, update, ...) before defining conditions on them.',
97
100
  })}
98
101
  </Typography>
99
- <Box>
100
- <Divider />
101
- </Box>
102
- <Box>
103
- {actionsToDisplay.length === 0 && (
104
- <Typography>
105
- {formatMessage({
106
- id: 'Settings.permissions.conditions.no-actions',
107
- defaultMessage:
108
- 'You first need to select actions (create, read, update, ...) before defining conditions on them.',
109
- })}
110
- </Typography>
111
- )}
112
- <ul>
113
- {actionsToDisplay.map(({ actionId, label, pathToConditionsObject }, index) => {
114
- const name = pathToConditionsObject.join('..');
115
-
116
- return (
117
- <ActionRow
118
- key={actionId}
119
- arrayOfOptionsGroupedByCategory={arrayOfOptionsGroupedByCategory}
120
- label={label}
121
- isFormDisabled={isFormDisabled}
122
- isGrey={index % 2 === 0}
123
- name={name}
124
- onChange={handleChange}
125
- value={get(state, name, {})}
126
- />
127
- );
128
- })}
129
- </ul>
130
- </Box>
131
- </Stack>
132
- </Box>
102
+ )}
103
+ <ul>
104
+ {actionsToDisplay.map(({ actionId, label, pathToConditionsObject }, index) => {
105
+ const name = pathToConditionsObject.join('..');
106
+
107
+ return (
108
+ <ActionRow
109
+ key={actionId}
110
+ arrayOfOptionsGroupedByCategory={arrayOfOptionsGroupedByCategory}
111
+ label={label}
112
+ isFormDisabled={isFormDisabled}
113
+ isGrey={index % 2 === 0}
114
+ name={name}
115
+ onChange={handleChange}
116
+ value={get(state, name, {})}
117
+ />
118
+ );
119
+ })}
120
+ </ul>
121
+ </ModalBody>
133
122
  <ModalFooter
134
123
  startActions={
135
124
  <Button variant="tertiary" onClick={onToggle}>
@@ -232,7 +232,7 @@ const Collapse = ({
232
232
  </Flex>
233
233
  {isModalOpen && (
234
234
  <ConditionsModal
235
- headerBreadCrumbs={[label, 'app.components.LeftMenuLinkContainer.settings']}
235
+ headerBreadCrumbs={[label, 'Settings.permissions.conditions.conditions']}
236
236
  actions={checkboxesActions}
237
237
  isFormDisabled={isFormDisabled}
238
238
  onClosed={handleModalClose}
@@ -8,7 +8,7 @@ import { IconButton } from '@strapi/design-system/IconButton';
8
8
  import { stopPropagation, onRowClick, pxToRem } from '@strapi/helper-plugin';
9
9
  import { useIntl } from 'react-intl';
10
10
 
11
- const RoleRow = ({ id, name, description, usersCount, icons }) => {
11
+ const RoleRow = ({ id, name, description, usersCount, icons, rowIndex }) => {
12
12
  const { formatMessage } = useIntl();
13
13
 
14
14
  const usersCountText = formatMessage(
@@ -21,6 +21,7 @@ const RoleRow = ({ id, name, description, usersCount, icons }) => {
21
21
 
22
22
  return (
23
23
  <Tr
24
+ aria-rowindex={rowIndex}
24
25
  key={id}
25
26
  {...onRowClick({
26
27
  fn: icons[1].onClick,
@@ -60,6 +61,7 @@ RoleRow.propTypes = {
60
61
  description: PropTypes.string.isRequired,
61
62
  usersCount: PropTypes.number.isRequired,
62
63
  icons: PropTypes.array.isRequired,
64
+ rowIndex: PropTypes.number.isRequired,
63
65
  };
64
66
 
65
67
  export default RoleRow;
@@ -168,7 +168,7 @@ const RoleListPage = () => {
168
168
  </Tr>
169
169
  </Thead>
170
170
  <Tbody>
171
- {sortedRoles?.map((role) => (
171
+ {sortedRoles?.map((role, rowIndex) => (
172
172
  <RoleRow
173
173
  key={role.id}
174
174
  id={role.id}
@@ -176,6 +176,7 @@ const RoleListPage = () => {
176
176
  description={role.description}
177
177
  usersCount={role.usersCount}
178
178
  icons={getIcons(role)}
179
+ rowIndex={rowIndex + 2}
179
180
  />
180
181
  ))}
181
182
  </Tbody>
@@ -69,8 +69,8 @@ const ModalForm = ({ queryName, onToggle }) => {
69
69
  } catch (err) {
70
70
  unlockApp();
71
71
 
72
- if (err?.response?.data.message === 'Email already taken') {
73
- setErrors({ email: err.response.data.message });
72
+ if (err?.response?.data?.error.message === 'Email already taken') {
73
+ setErrors({ email: err.response.data.error.message });
74
74
  }
75
75
  }
76
76
  };
@@ -114,7 +114,7 @@ const EventInput = ({ isDraftAndPublish }) => {
114
114
  if (header === 'app.utils.publish' || header === 'app.utils.unpublish') {
115
115
  return (
116
116
  <td
117
- key={header}
117
+ key={header.id}
118
118
  title={formatMessage({
119
119
  id: 'Settings.webhooks.event.publish-tooltip',
120
120
  defaultMessage:
@@ -129,7 +129,7 @@ const EventInput = ({ isDraftAndPublish }) => {
129
129
  }
130
130
 
131
131
  return (
132
- <td key={header}>
132
+ <td key={header.id}>
133
133
  <Typography variant="sigma" textColor="neutral600">
134
134
  {formatMessage(header)}
135
135
  </Typography>
@@ -76,16 +76,12 @@ const permissions = {
76
76
  update: [{ action: 'admin::webhooks.update', subject: null }],
77
77
  },
78
78
  'api-tokens': {
79
- main: [
80
- { action: 'admin::api-tokens.create', subject: null },
81
- { action: 'admin::api-tokens.read', subject: null },
82
- { action: 'admin::api-tokens.update', subject: null },
83
- { action: 'admin::api-tokens.delete', subject: null },
84
- ],
79
+ main: [{ action: 'admin::api-tokens.access', subject: null }],
85
80
  create: [{ action: 'admin::api-tokens.create', subject: null }],
86
81
  delete: [{ action: 'admin::api-tokens.delete', subject: null }],
87
82
  read: [{ action: 'admin::api-tokens.read', subject: null }],
88
83
  update: [{ action: 'admin::api-tokens.update', subject: null }],
84
+ regenerate: [{ action: 'admin::api-tokens.regenerate', subject: null }],
89
85
  },
90
86
  },
91
87
  };
@@ -107,7 +107,7 @@
107
107
  "Settings.permissions.conditions.anytime": "En qualsevol moment",
108
108
  "Settings.permissions.conditions.apply": "Aplicar",
109
109
  "Settings.permissions.conditions.can": "Poder",
110
- "Settings.permissions.conditions.define-conditions": "Definir condicions",
110
+ "Settings.permissions.conditions.conditions": "Definir condicions",
111
111
  "Settings.permissions.conditions.links": "Enllaços",
112
112
  "Settings.permissions.conditions.no-actions": "No hi ha acció",
113
113
  "Settings.permissions.conditions.none-selected": "En qualsevol moment",
@@ -633,6 +633,8 @@
633
633
  "content-manager.plugin.description.short": "Veure, editar i eliminar informació de la base de dades de manera ràpida.",
634
634
  "content-manager.popUpWarning.bodyMessage.contentType.delete": "Esteu segur de voler eliminar aquest registre?",
635
635
  "content-manager.popUpWarning.bodyMessage.contentType.delete.all": "Esteu segur de voler eliminar aquests registres?",
636
+ "content-manager.popUpWarning.warning.publish-question": "Encara vols publicar-ho?",
637
+ "content-manager.popUpwarning.warning.has-draft-relations.button-confirm": "Sí, publicar",
636
638
  "content-manager.popover.display-relations.label": "Mostrar relacions",
637
639
  "content-manager.success.record.delete": "Eliminat",
638
640
  "content-manager.success.record.publish": "Publicat",
@@ -687,4 +689,4 @@
687
689
  "request.error.model.unknown": "Aquest model no existeix",
688
690
  "skipToContent": "Saltar al contingut",
689
691
  "submit": "Enviar"
690
- }
692
+ }