strapi-plugin-navigation 2.0.13 → 2.1.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 (288) hide show
  1. package/README.md +105 -27
  2. package/admin/src/components/Alert/styles.d.ts +2 -0
  3. package/admin/src/components/Alert/styles.js +10 -4
  4. package/admin/src/components/CollapseButton/index.d.ts +7 -0
  5. package/admin/src/components/CollapseButton/index.js +21 -22
  6. package/admin/src/components/ConfirmationDialog/index.d.ts +28 -0
  7. package/admin/src/components/ConfirmationDialog/index.js +32 -54
  8. package/admin/src/components/EmptyView/index.d.ts +3 -0
  9. package/admin/src/components/EmptyView/index.js +9 -7
  10. package/admin/src/components/Item/ItemCardBadge/index.d.ts +3 -0
  11. package/admin/src/components/Item/ItemCardBadge/index.js +11 -7
  12. package/admin/src/components/Item/ItemCardHeader/Wrapper.d.ts +3 -0
  13. package/admin/src/components/Item/ItemCardHeader/Wrapper.js +10 -6
  14. package/admin/src/components/Item/ItemCardHeader/index.d.ts +12 -0
  15. package/admin/src/components/Item/ItemCardHeader/index.js +33 -52
  16. package/admin/src/components/Item/ItemCardRemovedOverlay/index.d.ts +2 -0
  17. package/admin/src/components/Item/ItemCardRemovedOverlay/index.js +10 -4
  18. package/admin/src/components/Item/Wrapper.d.ts +3 -0
  19. package/admin/src/components/Item/Wrapper.js +10 -6
  20. package/admin/src/components/Item/index.d.ts +31 -0
  21. package/admin/src/components/Item/index.js +163 -242
  22. package/admin/src/components/NavigationItemList/Wrapper.d.ts +3 -0
  23. package/admin/src/components/NavigationItemList/Wrapper.js +9 -5
  24. package/admin/src/components/NavigationItemList/index.d.ts +35 -0
  25. package/admin/src/components/NavigationItemList/index.js +28 -66
  26. package/admin/src/components/RestartAlert/index.d.ts +3 -0
  27. package/admin/src/components/RestartAlert/index.js +10 -5
  28. package/admin/src/components/Search/index.d.ts +6 -0
  29. package/admin/src/components/Search/index.js +57 -46
  30. package/admin/src/components/icons/navigation.d.ts +6 -0
  31. package/admin/src/components/icons/navigation.js +11 -13
  32. package/admin/src/contexts/DataManagerContext.d.ts +3 -0
  33. package/admin/src/contexts/DataManagerContext.js +6 -5
  34. package/admin/src/hooks/useAllContentTypes.d.ts +6 -0
  35. package/admin/src/hooks/useAllContentTypes.js +10 -11
  36. package/admin/src/hooks/useDataManager.d.ts +3 -0
  37. package/admin/src/hooks/useDataManager.js +10 -6
  38. package/admin/src/hooks/useI18nCopyNavigationItemsModal.d.ts +9 -0
  39. package/admin/src/hooks/useI18nCopyNavigationItemsModal.js +51 -0
  40. package/admin/src/hooks/useNavigationConfig.d.ts +10 -0
  41. package/admin/src/hooks/useNavigationConfig.js +52 -56
  42. package/admin/src/hooks/useNavigationManager.d.ts +7 -0
  43. package/admin/src/hooks/useNavigationManager.js +41 -0
  44. package/admin/src/index.d.ts +14 -0
  45. package/admin/src/index.js +92 -76
  46. package/admin/src/pages/App/index.d.ts +3 -0
  47. package/admin/src/pages/App/index.js +43 -31
  48. package/admin/src/pages/DataManagerProvider/actions.d.ts +19 -0
  49. package/admin/src/pages/DataManagerProvider/actions.js +22 -26
  50. package/admin/src/pages/DataManagerProvider/index.d.ts +12 -0
  51. package/admin/src/pages/DataManagerProvider/index.js +316 -298
  52. package/admin/src/pages/DataManagerProvider/init.d.ts +3 -0
  53. package/admin/src/pages/DataManagerProvider/init.js +5 -3
  54. package/admin/src/pages/DataManagerProvider/reducer.d.ts +19 -0
  55. package/admin/src/pages/DataManagerProvider/reducer.js +119 -121
  56. package/admin/src/pages/SettingsPage/components/DisableI18nModal/index.d.ts +24 -0
  57. package/admin/src/pages/SettingsPage/components/DisableI18nModal/index.js +88 -0
  58. package/admin/src/pages/SettingsPage/index.d.ts +3 -0
  59. package/admin/src/pages/SettingsPage/index.js +242 -335
  60. package/admin/src/pages/SettingsPage/utils/functions.d.ts +5 -0
  61. package/admin/src/pages/SettingsPage/utils/functions.js +3 -8
  62. package/admin/src/pages/View/components/I18nCopyNavigationItems/index.d.ts +14 -0
  63. package/admin/src/pages/View/components/I18nCopyNavigationItems/index.js +15 -0
  64. package/admin/src/pages/View/components/NavigationContentHeader/index.d.ts +6 -0
  65. package/admin/src/pages/View/components/NavigationContentHeader/index.js +13 -17
  66. package/admin/src/pages/View/components/NavigationHeader/index.d.ts +12 -0
  67. package/admin/src/pages/View/components/NavigationHeader/index.js +79 -65
  68. package/admin/src/pages/View/components/NavigationHeader/styles.d.ts +2 -0
  69. package/admin/src/pages/View/components/NavigationHeader/styles.js +10 -5
  70. package/admin/src/pages/View/components/NavigationItemForm/index.d.ts +57 -0
  71. package/admin/src/pages/View/components/NavigationItemForm/index.js +416 -453
  72. package/admin/src/pages/View/components/NavigationItemForm/utils/form.d.ts +45 -0
  73. package/admin/src/pages/View/components/NavigationItemForm/utils/form.js +84 -52
  74. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.d.ts +23 -0
  75. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js +24 -34
  76. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.d.ts +4 -0
  77. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js +16 -16
  78. package/admin/src/pages/View/components/NavigationItemPopup/index.d.ts +30 -0
  79. package/admin/src/pages/View/components/NavigationItemPopup/index.js +85 -108
  80. package/admin/src/pages/View/components/NavigationManager/Create/index.d.ts +9 -0
  81. package/admin/src/pages/View/components/NavigationManager/Create/index.js +57 -0
  82. package/admin/src/pages/View/components/NavigationManager/Delete/index.d.ts +8 -0
  83. package/admin/src/pages/View/components/NavigationManager/Delete/index.js +28 -0
  84. package/admin/src/pages/View/components/NavigationManager/Edit/index.d.ts +8 -0
  85. package/admin/src/pages/View/components/NavigationManager/Edit/index.js +54 -0
  86. package/admin/src/pages/View/components/NavigationManager/Error/index.d.ts +8 -0
  87. package/admin/src/pages/View/components/NavigationManager/Error/index.js +53 -0
  88. package/admin/src/pages/View/components/NavigationManager/Form/index.d.ts +19 -0
  89. package/admin/src/pages/View/components/NavigationManager/Form/index.js +98 -0
  90. package/admin/src/pages/View/components/NavigationManager/List/index.d.ts +8 -0
  91. package/admin/src/pages/View/components/NavigationManager/List/index.js +138 -0
  92. package/admin/src/pages/View/components/NavigationManager/index.d.ts +10 -0
  93. package/admin/src/pages/View/components/NavigationManager/index.js +189 -0
  94. package/admin/src/pages/View/components/NavigationManager/types.d.ts +53 -0
  95. package/admin/src/pages/View/components/NavigationManager/types.js +3 -0
  96. package/admin/src/pages/View/index.d.ts +4 -0
  97. package/admin/src/pages/View/index.js +231 -304
  98. package/admin/src/pages/View/utils/enums.d.ts +9 -0
  99. package/admin/src/pages/View/utils/enums.js +11 -8
  100. package/admin/src/pages/View/utils/form.d.ts +2 -0
  101. package/admin/src/pages/View/utils/form.js +15 -12
  102. package/admin/src/pages/View/utils/index.d.ts +2 -0
  103. package/admin/src/pages/View/utils/index.js +11 -3
  104. package/admin/src/pages/View/utils/parsers.d.ts +49 -0
  105. package/admin/src/pages/View/utils/parsers.js +239 -278
  106. package/admin/src/permissions.d.ts +12 -0
  107. package/admin/src/permissions.js +11 -7
  108. package/admin/src/pluginId.d.ts +3 -0
  109. package/admin/src/pluginId.js +2 -2
  110. package/admin/src/translations/en.json +157 -104
  111. package/admin/src/translations/fr.json +44 -44
  112. package/admin/src/translations/index.d.ts +12 -0
  113. package/admin/src/translations/index.js +17 -11
  114. package/admin/src/utils/api.d.ts +8 -0
  115. package/admin/src/utils/api.js +54 -50
  116. package/admin/src/utils/getTrad.d.ts +3 -0
  117. package/admin/src/utils/getTrad.js +9 -5
  118. package/admin/src/utils/index.d.ts +18 -0
  119. package/admin/src/utils/index.js +36 -15
  120. package/package.json +20 -19
  121. package/permissions.d.ts +9 -0
  122. package/permissions.js +5 -4
  123. package/server/bootstrap/index.d.ts +4 -0
  124. package/server/bootstrap/index.js +41 -0
  125. package/server/config/index.d.ts +5 -0
  126. package/server/config/index.js +33 -9
  127. package/server/config/setupStrategy.d.ts +3 -0
  128. package/server/config/setupStrategy.js +38 -0
  129. package/server/content-types/audience/index.d.ts +27 -0
  130. package/server/content-types/audience/index.js +9 -8
  131. package/server/content-types/audience/schema.d.ts +25 -0
  132. package/server/content-types/audience/schema.js +26 -0
  133. package/server/content-types/index.d.ts +255 -0
  134. package/server/content-types/index.js +15 -12
  135. package/server/content-types/navigation/index.d.ts +64 -0
  136. package/server/content-types/navigation/index.js +11 -8
  137. package/server/content-types/navigation/lifecycle.d.ts +9 -0
  138. package/server/content-types/navigation/lifecycle.js +8 -12
  139. package/server/content-types/navigation/schema.d.ts +55 -0
  140. package/server/content-types/navigation/schema.js +56 -0
  141. package/server/content-types/navigation-item/index.d.ts +112 -0
  142. package/server/content-types/navigation-item/index.js +11 -8
  143. package/server/content-types/navigation-item/lifecycle.d.ts +16 -0
  144. package/server/content-types/navigation-item/lifecycle.js +28 -32
  145. package/server/content-types/navigation-item/schema.d.ts +97 -0
  146. package/server/content-types/navigation-item/schema.js +102 -0
  147. package/server/content-types/navigations-items-related/index.d.ts +56 -0
  148. package/server/content-types/navigations-items-related/index.js +11 -8
  149. package/server/content-types/navigations-items-related/lifecycle.d.ts +8 -0
  150. package/server/content-types/navigations-items-related/lifecycle.js +20 -17
  151. package/server/content-types/navigations-items-related/schema.d.ts +49 -0
  152. package/server/content-types/navigations-items-related/schema.js +50 -0
  153. package/server/controllers/admin.d.ts +4 -0
  154. package/server/controllers/admin.js +130 -0
  155. package/server/controllers/client.d.ts +4 -0
  156. package/server/controllers/client.js +57 -0
  157. package/server/controllers/index.d.ts +4 -0
  158. package/server/controllers/index.js +12 -6
  159. package/server/destroy.d.ts +3 -0
  160. package/server/destroy.js +5 -0
  161. package/server/graphql/config.d.ts +4 -0
  162. package/server/graphql/config.js +28 -0
  163. package/server/graphql/index.d.ts +2 -0
  164. package/server/graphql/index.js +18 -22
  165. package/server/graphql/queries/index.d.ts +3 -0
  166. package/server/graphql/queries/index.js +15 -15
  167. package/server/graphql/queries/render-navigation-child.d.ts +15 -0
  168. package/server/graphql/queries/render-navigation-child.js +24 -15
  169. package/server/graphql/queries/render-navigation.d.ts +21 -0
  170. package/server/graphql/queries/render-navigation.js +31 -15
  171. package/server/graphql/resolvers-config.d.ts +10 -0
  172. package/server/graphql/resolvers-config.js +5 -3
  173. package/server/graphql/setupStrategy.d.ts +3 -0
  174. package/server/graphql/setupStrategy.js +15 -0
  175. package/server/graphql/types/content-types-name-fields.d.ts +6 -0
  176. package/server/graphql/types/content-types-name-fields.js +13 -9
  177. package/server/graphql/types/content-types.d.ts +5 -0
  178. package/server/graphql/types/content-types.js +17 -15
  179. package/server/graphql/types/create-navigation-item.d.ts +5 -0
  180. package/server/graphql/types/create-navigation-item.js +18 -16
  181. package/server/graphql/types/create-navigation-related.d.ts +5 -0
  182. package/server/graphql/types/create-navigation-related.js +9 -7
  183. package/server/graphql/types/create-navigation.d.ts +5 -0
  184. package/server/graphql/types/create-navigation.js +8 -6
  185. package/server/graphql/types/index.d.ts +3 -0
  186. package/server/graphql/types/index.js +15 -13
  187. package/server/graphql/types/navigation-config.d.ts +5 -0
  188. package/server/graphql/types/navigation-config.js +10 -8
  189. package/server/graphql/types/navigation-details.d.ts +5 -0
  190. package/server/graphql/types/navigation-details.js +11 -9
  191. package/server/graphql/types/navigation-item-related-data.d.ts +5 -0
  192. package/server/graphql/types/navigation-item-related-data.js +9 -0
  193. package/server/graphql/types/navigation-item-related.d.ts +7 -0
  194. package/server/graphql/types/navigation-item-related.js +25 -0
  195. package/server/graphql/types/navigation-item.d.ts +5 -0
  196. package/server/graphql/types/navigation-item.js +28 -29
  197. package/server/graphql/types/navigation-render-type.d.ts +5 -0
  198. package/server/graphql/types/navigation-render-type.js +7 -4
  199. package/server/graphql/types/navigation.d.ts +5 -0
  200. package/server/graphql/types/navigation.js +10 -8
  201. package/server/i18n/constant.d.ts +2 -0
  202. package/server/i18n/constant.js +5 -0
  203. package/server/i18n/errors.d.ts +7 -0
  204. package/server/i18n/errors.js +14 -0
  205. package/server/i18n/graphQLEnhancers.d.ts +10 -0
  206. package/server/i18n/graphQLEnhancers.js +10 -0
  207. package/server/i18n/index.d.ts +8 -0
  208. package/server/i18n/index.js +23 -0
  209. package/server/i18n/navigationSetupStrategy.d.ts +3 -0
  210. package/server/i18n/navigationSetupStrategy.js +119 -0
  211. package/server/i18n/serviceEnhancers.d.ts +13 -0
  212. package/server/i18n/serviceEnhancers.js +156 -0
  213. package/server/i18n/types.d.ts +60 -0
  214. package/server/i18n/types.js +3 -0
  215. package/server/i18n/utils.d.ts +12 -0
  216. package/server/i18n/utils.js +29 -0
  217. package/server/index.d.ts +273 -0
  218. package/server/index.js +26 -0
  219. package/server/navigation/index.d.ts +2 -0
  220. package/server/navigation/index.js +18 -0
  221. package/server/navigation/setupStrategy.d.ts +3 -0
  222. package/server/navigation/setupStrategy.js +39 -0
  223. package/server/register/index.d.ts +3 -0
  224. package/server/register/index.js +4 -0
  225. package/server/routes/admin.d.ts +4 -0
  226. package/server/routes/admin.js +82 -61
  227. package/server/routes/client.d.ts +4 -0
  228. package/server/routes/client.js +25 -21
  229. package/server/routes/index.d.ts +6 -0
  230. package/server/routes/index.js +13 -4
  231. package/server/services/admin.d.ts +5 -0
  232. package/server/services/admin.js +238 -0
  233. package/server/services/client.d.ts +5 -0
  234. package/server/services/client.js +249 -0
  235. package/server/services/common.d.ts +5 -0
  236. package/server/services/common.js +313 -0
  237. package/server/services/index.d.ts +7 -0
  238. package/server/services/index.js +14 -6
  239. package/server/utils/constant.d.ts +27 -0
  240. package/server/utils/constant.js +24 -0
  241. package/server/utils/functions.d.ts +139 -0
  242. package/server/utils/functions.js +226 -0
  243. package/server/utils/index.d.ts +3 -0
  244. package/server/utils/index.js +19 -0
  245. package/strapi-admin.d.ts +3 -0
  246. package/strapi-admin.js +8 -1
  247. package/strapi-server.d.ts +273 -0
  248. package/strapi-server.js +6 -17
  249. package/tsconfig.tsbuildinfo +1 -0
  250. package/types/bootstrap.d.ts +13 -0
  251. package/types/bootstrap.js +3 -0
  252. package/types/config.d.ts +21 -0
  253. package/types/config.js +3 -0
  254. package/types/contentTypes.d.ts +85 -0
  255. package/types/contentTypes.js +3 -0
  256. package/types/controllers.d.ts +48 -0
  257. package/types/controllers.js +5 -0
  258. package/types/graphQL.d.ts +3 -0
  259. package/types/graphQL.js +3 -0
  260. package/types/i18n.d.ts +9 -0
  261. package/types/i18n.js +3 -0
  262. package/types/index.d.ts +9 -0
  263. package/types/index.js +25 -0
  264. package/types/services.d.ts +74 -0
  265. package/types/services.js +3 -0
  266. package/types/utils.d.ts +62 -0
  267. package/types/utils.js +27 -0
  268. package/utils/InvalidParamNavigationError.d.ts +4 -0
  269. package/utils/InvalidParamNavigationError.js +8 -0
  270. package/utils/NavigationError.d.ts +5 -0
  271. package/utils/NavigationError.js +7 -7
  272. package/__mocks__/pages.settings.json +0 -25
  273. package/__mocks__/strapi.js +0 -207
  274. package/jest.config.js +0 -14
  275. package/server/bootstrap.js +0 -52
  276. package/server/config.js +0 -9
  277. package/server/content-types/audience/lifecycle.js +0 -8
  278. package/server/content-types/audience/schema.json +0 -23
  279. package/server/content-types/navigation/schema.json +0 -45
  280. package/server/content-types/navigation-item/schema.json +0 -99
  281. package/server/content-types/navigations-items-related/schema.json +0 -47
  282. package/server/controllers/navigation.js +0 -105
  283. package/server/graphql/types/navigation-related.js +0 -25
  284. package/server/services/__tests__/functions.test.js +0 -48
  285. package/server/services/__tests__/navigation.test.js +0 -91
  286. package/server/services/navigation.js +0 -791
  287. package/server/services/utils/constant.js +0 -21
  288. package/server/services/utils/functions.js +0 -226
package/README.md CHANGED
@@ -44,12 +44,13 @@ Strapi Navigation Plugin provides a website navigation / menu builder feature fo
44
44
  - [Settings page](#in-v203-and-newer)
45
45
  - [Plugin file](#in-v202-and-older--default-configuration-state-for-v203-and-newer)
46
46
  5. [🔧 GraphQL Configuration](#-gql-configuration)
47
- 6. [🕸️ Public API specification](#%EF%B8%8F-public-api-specification)
47
+ 6. [🌍 i18n Internationalization](#-i18n-internationalization)
48
+ 7. [🕸️ Public API specification](#%EF%B8%8F-public-api-specification)
48
49
  - [REST API](#rest-api)
49
50
  - [GraphQL API](#graphql-api)
50
51
  8. [💬 FAQ](#-faq)
51
- 9. [🤝 Contributing](#-contributing)
52
- 10. [👨‍💻 Community support](#-community-support)
52
+ 10. [🤝 Contributing](#-contributing)
53
+ 11. [👨‍💻 Community support](#-community-support)
53
54
 
54
55
  ## ✨ Features
55
56
 
@@ -59,6 +60,7 @@ Strapi Navigation Plugin provides a website navigation / menu builder feature fo
59
60
  - **Different types of navigation items:** Create navigation with items linked to internal types, to external links or wrapper elements to keep structure clean
60
61
  - **Multiple navigations:** Create as many Navigation containers as you want, setup them and use in the consumer application
61
62
  - **Light / Dark mode compatible:** By design we're supporting Strapi ☀️ Light / 🌙 Dark modes
63
+ - **Webhooks integration:** Changes to navigation will trigger 'entry.update' or 'entry.create' webhook events.
62
64
  - **Customizable:** Possibility to customize the options like: available Content Types, Maximum level for "attach to menu", Additional fields (audience)
63
65
  - **[Audit log](https://github.com/VirtusLab/strapi-molecules/tree/master/packages/strapi-plugin-audit-log):** integration with Strapi Molecules Audit Log plugin that provides changes track record
64
66
 
@@ -100,6 +102,12 @@ yarn develop --watch-admin
100
102
 
101
103
  The **UI Navigation** plugin should appear in the **Plugins** section of Strapi sidebar after you run app again.
102
104
 
105
+ You can manage your multiple navigation containers by going to the **Navigation** manage view by clicking "Manage" button.
106
+
107
+ <div style="margin: 20px 0" align="center">
108
+ <img style="width: 100%; height: auto;" src="public/assets/manager-view.png" alt="Navigation Manager View" />
109
+ </div>
110
+
103
111
  As a next step you must configure your the plugin by the way you want to. See [**Configuration**](#🔧-configuration) section.
104
112
 
105
113
  All done. Enjoy 🎉
@@ -110,7 +118,7 @@ Complete installation requirements are exact same as for Strapi itself and can b
110
118
 
111
119
  **Supported Strapi versions**:
112
120
 
113
- - Strapi v4.1.8 (recently tested)
121
+ - Strapi v4.2.0 (recently tested)
114
122
  - Strapi v4.x
115
123
 
116
124
  > This plugin is designed for **Strapi v4** and is not working with v3.x. To get version for **Strapi v3** install version [v1.x](https://github.com/VirtusLab-Open-Source/strapi-plugin-navigation/tree/strapi-v3).
@@ -165,6 +173,7 @@ Config for this plugin is stored as a part of the `config/plugins.js` or `config
165
173
  - `contentTypes` - UIDs of related content types
166
174
  - `contentTypesNameFields` - Definition of content type title fields like `'api::<collection name>.<content type name>': ['field_name_1', 'field_name_2']`, if not set titles are pulled from fields like `['title', 'subject', 'name']`. **TIP** - Proper content type uid you can find in the URL of Content Manager where you're managing relevant entities like: `admin/content-manager/collectionType/< THE UID HERE >?page=1&pageSize=10&sort=Title:ASC&plugins[i18n][locale]=en`
167
175
  - `gql` - If you're using GraphQL that's the right place to put all necessary settings. More **[ here ](#gql-configuration)**
176
+ - `i18nEnabled` - should you want to manage multi-locale content via navigation set this value `Enabled`. More **[ here ](#i18n-internationalization)**
168
177
 
169
178
  ## 🔧 GQL Configuration
170
179
  Using navigation with GraphQL requires both plugins to be installed and working. You can find installation guide for GraphQL plugin **[here](https://docs.strapi.io/developer-docs/latest/plugins/graphql.html#graphql)**. To properly configure GQL to work with navigation you should provide `gql` prop. This should contain union types that will be used to define GQL response format for your data while fetching:
@@ -195,6 +204,38 @@ gql: {
195
204
  ```
196
205
  where `Page` and `UploadFile` are your type names for the **Content Types** you're referring by navigation items relations.
197
206
 
207
+ ## 🌍 i18n Internationalization
208
+
209
+ ### Settings
210
+
211
+ This feature is **opt-in**.
212
+
213
+ In order to use this functionality setting **default locale** is required. (See: Settings -> Internationalization)
214
+
215
+ Once feature is enabled a restart is required. On server startup missing navigations for other locales will be created. From then you can manage navigation's localizations just like before.
216
+
217
+ If you want go back to _pre-i18n_ way you can disable it in settings. Already created navigations will not be removed unless you make a choice for plugin to do so(this will require a restart).
218
+
219
+ If your newly created navigation localization is empty you can copy contents of one version's to the empty one. If related item is localized and locale version exists localization will be used as a related item. Otherwise plugin will fallback to an original item.
220
+
221
+ ### Rendering
222
+
223
+ Shape of the rendered navigation will not change. Querying stays almost the same. To query for specific locale version just add `locale` query param. For example:
224
+
225
+ ```https://yourdomain.cool/api/navigation/render/1?locale=fr```
226
+
227
+ or
228
+
229
+ ```https://yourdomain.cool/api/navigation/render/main-navigation?locale=fr```
230
+
231
+ If `locale` is not specified whatever version used to be at id `1` will be returned.
232
+
233
+ Of course if you know that `fr` version is present at id `2` you can just query for that.
234
+
235
+ ### GraphQL
236
+
237
+ If feature is enabled GQL render navigation query is expanded to handle `locale` param(it will work the same as regular requests). Checkout schema provided by GraphQL plugin.
238
+
198
239
  ## 👤 RBAC
199
240
  Plugin provides granular permissions based on Strapi RBAC functionality.
200
241
 
@@ -296,7 +337,7 @@ Plugin supports both **REST API** and **GraphQL API** exposed by Strapi.
296
337
 
297
338
  `GET <host>/api/navigation/render/<navigationIdOrSlug>?type=<type>`
298
339
 
299
- Return a rendered navigation structure depends on passed type (`tree`, `rfr` or nothing to render as `flat/raw`).
340
+ Return a rendered navigation structure depends on passed type (`TREE`, `RFR` or nothing to render as `FLAT`).
300
341
 
301
342
  > The ID of navigation by default is `1`, if you've got defined multiple navigations you must work with their IDs or Slugs to fetch.
302
343
 
@@ -329,7 +370,7 @@ Return a rendered navigation structure depends on passed type (`tree`, `rfr` or
329
370
  ]
330
371
  ```
331
372
 
332
- **Example URL**: `https://localhost:1337/api/navigation/render/1?type=tree`
373
+ **Example URL**: `https://localhost:1337/api/navigation/render/1?type=TREE`
333
374
 
334
375
  **Example response body**
335
376
 
@@ -365,7 +406,7 @@ Return a rendered navigation structure depends on passed type (`tree`, `rfr` or
365
406
  ]
366
407
  ```
367
408
 
368
- **Example URL**: `https://localhost:1337/api/navigation/render/1?type=rfr`
409
+ **Example URL**: `https://localhost:1337/api/navigation/render/1?type=RFR`
369
410
 
370
411
  **Example response body**
371
412
 
@@ -450,7 +491,7 @@ Return a rendered navigation structure depends on passed type (`tree`, `rfr` or
450
491
 
451
492
  ### GraphQL API
452
493
 
453
- Same as [**REST API**](#rest-api) returns a rendered navigation structure depends on passed type (`tree`, `rfr` or nothing to render as `flat/raw`).
494
+ Same as [**REST API**](#rest-api) returns a rendered navigation structure depends on passed type (`TREE`, `RFR` or nothing to render as `FLAT`).
454
495
 
455
496
  **Example request**
456
497
 
@@ -465,14 +506,17 @@ query {
465
506
  title
466
507
  path
467
508
  related {
468
- __typename
509
+ id
510
+ attributes {
511
+ __typename
469
512
 
470
- ... on Page {
471
- Title
472
- }
513
+ ... on Page {
514
+ Title
515
+ }
473
516
 
474
- ... on WithFlowType {
475
- Name
517
+ ... on WithFlowType {
518
+ Name
519
+ }
476
520
  }
477
521
  }
478
522
  items {
@@ -480,14 +524,17 @@ query {
480
524
  title
481
525
  path
482
526
  related {
483
- __typename
527
+ id
528
+ attributes {
529
+ __typename
484
530
 
485
- ... on Page {
486
- Title
487
- }
531
+ ... on Page {
532
+ Title
533
+ }
488
534
 
489
- ... on WithFlowType {
490
- Name
535
+ ... on WithFlowType {
536
+ Name
537
+ }
491
538
  }
492
539
  }
493
540
  }
@@ -506,8 +553,11 @@ query {
506
553
  "title": "Test page",
507
554
  "path": "/test-path",
508
555
  "related": {
509
- "__typename": "WithFlowType",
510
- "Name": "Test"
556
+ "id": 3,
557
+ "attributes": {
558
+ "__typename": "WithFlowType",
559
+ "Name": "Test"
560
+ }
511
561
  },
512
562
  "items": [
513
563
  {
@@ -515,8 +565,11 @@ query {
515
565
  "title": "Nested",
516
566
  "path": "/test-path/nested-one",
517
567
  "related": {
518
- "__typename": "Page",
519
- "Title": "Eg. Page title"
568
+ "id": 1,
569
+ "attributes": {
570
+ "__typename": "Page",
571
+ "Title": "Eg. Page title"
572
+ }
520
573
  }
521
574
  }
522
575
  ]
@@ -526,8 +579,11 @@ query {
526
579
  "title": "Another page",
527
580
  "path": "/another",
528
581
  "related": {
529
- "__typename": "Page",
530
- "Title": "dfdfdf"
582
+ "id": 2,
583
+ "attributes": {
584
+ "__typename": "Page",
585
+ "Title": "dfdfdf"
586
+ }
531
587
  },
532
588
  "items": []
533
589
  }
@@ -554,7 +610,7 @@ Live example of plugin usage can be found in the [VirtusLab Strapi Examples](htt
554
610
 
555
611
  **Q:** I would like to use GraphQL schemas but I'm not getting renderNavigation query or even proper types as Navigation, NavigationItem etc. What should I do?
556
612
 
557
- **A:** There is a one trick you might try. Strapi by default is ordering plugins by the way which takes `strapi-plugin-graphql` to initialize earlier than other plugins so types might not be injected. If you don't have it yet, please create `config/plugins.js` file and put there at lease following lines:
613
+ **A:** **A:** There is a one trick you might try. Strapi by default is ordering plugins by the way which takes `strapi-plugin-graphql` to initialize earlier than other plugins so types might not be injected. If you don't have it yet, please create `config/plugins.js` file and put there following lines (put `graphql` at the end):
558
614
 
559
615
  ```js
560
616
  module.exports = {
@@ -578,6 +634,28 @@ If you already got it, make sure that `navigation` plugin is inserted before `gr
578
634
 
579
635
  Feel free to fork and make a Pull Request to this plugin project. All the input is warmly welcome!
580
636
 
637
+ - Clone repository
638
+
639
+ ```
640
+ git clone git@github.com:VirtusLab-Open-Source/strapi-plugin-navigation.git
641
+ ```
642
+
643
+ - Create a soft link in your strapi project to plugin build folder
644
+
645
+ ```sh
646
+ ln -s <...>/strapi-plugin-navigation/build <...>/strapi-project/src/plugins/navigation
647
+ ```
648
+
649
+ - Run build command
650
+
651
+ ```ts
652
+ // Watch for file changes
653
+ yarn develop
654
+
655
+ // or run build without nodemon
656
+ yarn build:dev
657
+ ```
658
+
581
659
  ## 👨‍💻 Community support
582
660
 
583
661
  For general help using Strapi, please refer to [the official Strapi documentation](https://strapi.io/documentation/). For additional help, you can use one of these channels to ask a question:
@@ -0,0 +1,2 @@
1
+ export const PermanentAlert: any;
2
+ //# sourceMappingURL=styles.d.ts.map
@@ -1,8 +1,14 @@
1
- import styled from 'styled-components';
2
- import { Alert } from '@strapi/design-system/Alert';
3
-
4
- export const PermanentAlert = styled(Alert)`
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PermanentAlert = void 0;
7
+ const styled_components_1 = __importDefault(require("styled-components"));
8
+ const Alert_1 = require("@strapi/design-system/Alert");
9
+ exports.PermanentAlert = (0, styled_components_1.default)(Alert_1.Alert) `
5
10
  button {
6
11
  display: none;
7
12
  }
8
13
  `;
14
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1,7 @@
1
+ export default CollapseButton;
2
+ declare function CollapseButton({ toggle, collapsed, itemsCount }: {
3
+ toggle: any;
4
+ collapsed: any;
5
+ itemsCount: any;
6
+ }): JSX.Element;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -1,11 +1,15 @@
1
- import React from 'react';
2
- import styled from 'styled-components'
3
- import { Flex } from '@strapi/design-system/Flex';
4
- import { Typography } from '@strapi/design-system/Typography';
5
- import { Icon } from '@strapi/design-system/Icon';
6
- import { CarretUp, CarretDown } from '@strapi/icons';
7
-
8
- const Wrapper = styled.div`
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const styled_components_1 = __importDefault(require("styled-components"));
8
+ const Flex_1 = require("@strapi/design-system/Flex");
9
+ const Typography_1 = require("@strapi/design-system/Typography");
10
+ const Icon_1 = require("@strapi/design-system/Icon");
11
+ const icons_1 = require("@strapi/icons");
12
+ const Wrapper = styled_components_1.default.div `
9
13
  border-radius: 50%;
10
14
  background: #DCDCE4;
11
15
  width: 25px;
@@ -15,17 +19,12 @@ const Wrapper = styled.div`
15
19
  align-items: center;
16
20
  margin-right: 8px;
17
21
  `;
18
-
19
- const CollapseButton = ({ toggle, collapsed, itemsCount }) => (
20
- <Flex justifyContent='space-between' alignItems='center' onClick={toggle} cursor="pointer" style={{ marginRight: '16px' }}>
21
- <Wrapper>
22
- { collapsed ?
23
- <Icon as={CarretDown} width='7px' height='4px' /> :
24
- <Icon as={CarretUp} width='7px' height='4px' />
25
- }
26
- </Wrapper>
27
- <Typography variant="pi">{itemsCount} nested items</Typography>
28
- </Flex >
29
- );
30
-
31
- export default CollapseButton;
22
+ const CollapseButton = ({ toggle, collapsed, itemsCount }) => (react_1.default.createElement(Flex_1.Flex, { justifyContent: 'space-between', alignItems: 'center', onClick: toggle, cursor: "pointer", style: { marginRight: '16px' } },
23
+ react_1.default.createElement(Wrapper, null, collapsed ?
24
+ react_1.default.createElement(Icon_1.Icon, { as: icons_1.CarretDown, width: '7px', height: '4px' }) :
25
+ react_1.default.createElement(Icon_1.Icon, { as: icons_1.CarretUp, width: '7px', height: '4px' })),
26
+ react_1.default.createElement(Typography_1.Typography, { variant: "pi" },
27
+ itemsCount,
28
+ " nested items")));
29
+ exports.default = CollapseButton;
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,28 @@
1
+ export default ConfirmationDialog;
2
+ declare function ConfirmationDialog({ isVisible, isActionAsync, children, onConfirm, onCancel, header, labelCancel, labelConfirm, iconConfirm, mainIcon }: {
3
+ isVisible?: boolean | undefined;
4
+ isActionAsync?: boolean | undefined;
5
+ children: any;
6
+ onConfirm: any;
7
+ onCancel: any;
8
+ header: any;
9
+ labelCancel: any;
10
+ labelConfirm: any;
11
+ iconConfirm: any;
12
+ mainIcon?: JSX.Element | undefined;
13
+ }): JSX.Element;
14
+ declare namespace ConfirmationDialog {
15
+ namespace propTypes {
16
+ const isVisible: PropTypes.Requireable<boolean>;
17
+ const isActionAsync: PropTypes.Requireable<boolean>;
18
+ const children: PropTypes.Requireable<any>;
19
+ const header: PropTypes.Requireable<string>;
20
+ const labelCancel: PropTypes.Requireable<string>;
21
+ const labelConfirm: PropTypes.Requireable<string>;
22
+ const iconConfirm: PropTypes.Requireable<object>;
23
+ const onConfirm: PropTypes.Validator<(...args: any[]) => any>;
24
+ const onCancel: PropTypes.Validator<(...args: any[]) => any>;
25
+ }
26
+ }
27
+ import PropTypes from "prop-types";
28
+ //# sourceMappingURL=index.d.ts.map
@@ -1,56 +1,34 @@
1
- /**
2
- *
3
- * Entity Details
4
- *
5
- */
6
-
7
- import React from 'react';
8
- import PropTypes from 'prop-types';
9
- import { Button } from '@strapi/design-system/Button';
10
- import { Dialog, DialogBody, DialogFooter } from '@strapi/design-system/Dialog';
11
- import { Flex } from '@strapi/design-system/Flex';
12
- import { Stack } from '@strapi/design-system/Stack';
13
- import { Typography } from '@strapi/design-system/Typography';
14
- import { ExclamationMarkCircle, Check } from '@strapi/icons';
15
- import { getMessage } from '../../utils';
16
-
17
- const ConfirmationDialog = ({
18
- isVisible = false,
19
- isActionAsync = false,
20
- children,
21
- onConfirm,
22
- onCancel,
23
- header,
24
- labelCancel,
25
- labelConfirm,
26
- iconConfirm
27
- }) => (
28
- <Dialog onClose={onCancel} title={header || getMessage('components.confirmation.dialog.header', 'Confirmation')} isOpen={isVisible}>
29
- <DialogBody icon={<ExclamationMarkCircle />}>
30
- <Stack spacing={2}>
31
- <Flex justifyContent="center">
32
- <Typography id="dialog-confirm-description">{children || getMessage('components.confirmation.dialog.description')}</Typography>
33
- </Flex>
34
- </Stack>
35
- </DialogBody>
36
- <DialogFooter startAction={<Button onClick={onCancel} variant="tertiary" disabled={isActionAsync}>
37
- {labelCancel || getMessage('components.confirmation.dialog.button.cancel', 'Cancel')}
38
- </Button>} endAction={<Button onClick={onConfirm} variant="danger-light" startIcon={iconConfirm || <Check />} disabled={isActionAsync}>
39
- {labelConfirm || getMessage('components.confirmation.dialog.button.confirm', 'Confirm')}
40
- </Button>} />
41
- </Dialog>
42
- );
43
-
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const prop_types_1 = __importDefault(require("prop-types"));
8
+ const Button_1 = require("@strapi/design-system/Button");
9
+ const Dialog_1 = require("@strapi/design-system/Dialog");
10
+ const Flex_1 = require("@strapi/design-system/Flex");
11
+ const Stack_1 = require("@strapi/design-system/Stack");
12
+ const Typography_1 = require("@strapi/design-system/Typography");
13
+ const icons_1 = require("@strapi/icons");
14
+ const utils_1 = require("../../utils");
15
+ const DEFAULT_ICON = react_1.default.createElement(icons_1.ExclamationMarkCircle, null);
16
+ const ConfirmationDialog = ({ isVisible = false, isActionAsync = false, children, onConfirm, onCancel, header, labelCancel, labelConfirm, iconConfirm, mainIcon = DEFAULT_ICON }) => (react_1.default.createElement(Dialog_1.Dialog, { onClose: onCancel, title: header || (0, utils_1.getMessage)('components.confirmation.dialog.header', 'Confirmation'), isOpen: isVisible },
17
+ react_1.default.createElement(Dialog_1.DialogBody, { icon: mainIcon },
18
+ react_1.default.createElement(Stack_1.Stack, { spacing: 2 },
19
+ react_1.default.createElement(Flex_1.Flex, { justifyContent: "center" },
20
+ react_1.default.createElement(Typography_1.Typography, { id: "dialog-confirm-description" }, children || (0, utils_1.getMessage)('components.confirmation.dialog.description'))))),
21
+ react_1.default.createElement(Dialog_1.DialogFooter, { startAction: react_1.default.createElement(Button_1.Button, { onClick: onCancel, variant: "tertiary", disabled: isActionAsync }, labelCancel || (0, utils_1.getMessage)('components.confirmation.dialog.button.cancel', 'Cancel')), endAction: react_1.default.createElement(Button_1.Button, { onClick: onConfirm, variant: "danger-light", startIcon: iconConfirm || react_1.default.createElement(icons_1.Check, null), disabled: isActionAsync }, labelConfirm || (0, utils_1.getMessage)('components.confirmation.dialog.button.confirm', 'Confirm')) })));
44
22
  ConfirmationDialog.propTypes = {
45
- isVisible: PropTypes.bool,
46
- isActionAsync: PropTypes.bool,
47
- children: PropTypes.string.isRequired,
48
- header: PropTypes.string,
49
- labelCancel: PropTypes.string,
50
- labelConfirm: PropTypes.string,
51
- iconConfirm: PropTypes.object,
52
- onConfirm: PropTypes.func.isRequired,
53
- onCancel: PropTypes.func.isRequired,
23
+ isVisible: prop_types_1.default.bool,
24
+ isActionAsync: prop_types_1.default.bool,
25
+ children: prop_types_1.default.any,
26
+ header: prop_types_1.default.string,
27
+ labelCancel: prop_types_1.default.string,
28
+ labelConfirm: prop_types_1.default.string,
29
+ iconConfirm: prop_types_1.default.object,
30
+ onConfirm: prop_types_1.default.func.isRequired,
31
+ onCancel: prop_types_1.default.func.isRequired,
54
32
  };
55
-
56
- export default ConfirmationDialog;
33
+ exports.default = ConfirmationDialog;
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ export default EmptyView;
2
+ declare const EmptyView: any;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -1,8 +1,10 @@
1
- import styled from "styled-components";
2
- import { Box } from '@strapi/design-system/Box';
3
- import { Button } from "@strapi/design-system/Button";
4
-
5
- const EmptyView = styled.div`
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const styled_components_1 = __importDefault(require("styled-components"));
7
+ const EmptyView = styled_components_1.default.div `
6
8
  display: flex;
7
9
  flex-grow: 1;
8
10
  flex-direction: column;
@@ -22,5 +24,5 @@ const EmptyView = styled.div`
22
24
  margin: 1rem;
23
25
  }
24
26
  `;
25
-
26
- export default EmptyView;
27
+ exports.default = EmptyView;
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ export default ItemCardBadge;
2
+ declare const ItemCardBadge: any;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -1,10 +1,14 @@
1
- import styled from "styled-components";
2
- import { Badge } from '@strapi/design-system/Badge';
3
-
4
- const ItemCardBadge = styled(Badge)`
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const styled_components_1 = __importDefault(require("styled-components"));
7
+ const Badge_1 = require("@strapi/design-system/Badge");
8
+ const ItemCardBadge = (0, styled_components_1.default)(Badge_1.Badge) `
5
9
  border: 1px solid ${({ theme, borderColor }) => theme.colors[borderColor]};
6
10
 
7
- ${ ({small, theme}) => small && `
11
+ ${({ small, theme }) => small && `
8
12
  padding: ${theme.spaces[1]} ${theme.spaces[2]};
9
13
  margin: 0px ${theme.spaces[3]};
10
14
  vertical-align: middle;
@@ -18,5 +22,5 @@ const ItemCardBadge = styled(Badge)`
18
22
  }
19
23
  `}
20
24
  `;
21
-
22
- export default ItemCardBadge;
25
+ exports.default = ItemCardBadge;
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ export default CardItemTitle;
2
+ declare const CardItemTitle: any;
3
+ //# sourceMappingURL=Wrapper.d.ts.map
@@ -1,7 +1,11 @@
1
- import styled from "styled-components";
2
- import { CardTitle } from '@strapi/design-system/Card';
3
-
4
- const CardItemTitle = styled(CardTitle)`
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const styled_components_1 = __importDefault(require("styled-components"));
7
+ const Card_1 = require("@strapi/design-system/Card");
8
+ const CardItemTitle = (0, styled_components_1.default)(Card_1.CardTitle) `
5
9
  width: 100%;
6
10
 
7
11
  display: flex;
@@ -13,5 +17,5 @@ const CardItemTitle = styled(CardTitle)`
13
17
  margin: 0px ${({ theme }) => theme.spaces[1]};
14
18
  }
15
19
  `;
16
-
17
- export default CardItemTitle;
20
+ exports.default = CardItemTitle;
21
+ //# sourceMappingURL=Wrapper.js.map
@@ -0,0 +1,12 @@
1
+ export default ItemCardHeader;
2
+ declare function ItemCardHeader({ title, path, icon, removed, onItemRemove, onItemEdit, onItemRestore, dragRef }: {
3
+ title: any;
4
+ path: any;
5
+ icon: any;
6
+ removed: any;
7
+ onItemRemove: any;
8
+ onItemEdit: any;
9
+ onItemRestore: any;
10
+ dragRef: any;
11
+ }): JSX.Element;
12
+ //# sourceMappingURL=index.d.ts.map