strapi-plugin-navigation 2.0.12 → 2.1.0-beta.2
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.
- package/README.md +260 -41
- package/admin/src/components/Alert/styles.d.ts +2 -0
- package/admin/src/components/Alert/styles.js +10 -4
- package/admin/src/components/CollapseButton/index.d.ts +7 -0
- package/admin/src/components/CollapseButton/index.js +21 -22
- package/admin/src/components/ConfirmationDialog/index.d.ts +28 -0
- package/admin/src/components/ConfirmationDialog/index.js +32 -54
- package/admin/src/components/EmptyView/index.d.ts +3 -0
- package/admin/src/components/EmptyView/index.js +9 -7
- package/admin/src/components/Item/ItemCardBadge/index.d.ts +3 -0
- package/admin/src/components/Item/ItemCardBadge/index.js +11 -7
- package/admin/src/components/Item/ItemCardHeader/Wrapper.d.ts +3 -0
- package/admin/src/components/Item/ItemCardHeader/Wrapper.js +10 -6
- package/admin/src/components/Item/ItemCardHeader/index.d.ts +12 -0
- package/admin/src/components/Item/ItemCardHeader/index.js +33 -52
- package/admin/src/components/Item/ItemCardRemovedOverlay/index.d.ts +2 -0
- package/admin/src/components/Item/ItemCardRemovedOverlay/index.js +10 -4
- package/admin/src/components/Item/Wrapper.d.ts +3 -0
- package/admin/src/components/Item/Wrapper.js +10 -6
- package/admin/src/components/Item/index.d.ts +31 -0
- package/admin/src/components/Item/index.js +162 -242
- package/admin/src/components/NavigationItemList/Wrapper.d.ts +3 -0
- package/admin/src/components/NavigationItemList/Wrapper.js +9 -5
- package/admin/src/components/NavigationItemList/index.d.ts +35 -0
- package/admin/src/components/NavigationItemList/index.js +28 -66
- package/admin/src/components/RestartAlert/index.d.ts +3 -0
- package/admin/src/components/RestartAlert/index.js +10 -5
- package/admin/src/components/Search/index.d.ts +6 -0
- package/admin/src/components/Search/index.js +57 -46
- package/admin/src/components/icons/navigation.d.ts +6 -0
- package/admin/src/components/icons/navigation.js +11 -13
- package/admin/src/contexts/DataManagerContext.d.ts +3 -0
- package/admin/src/contexts/DataManagerContext.js +6 -5
- package/admin/src/hooks/useAllContentTypes.d.ts +6 -0
- package/admin/src/hooks/useAllContentTypes.js +10 -11
- package/admin/src/hooks/useDataManager.d.ts +3 -0
- package/admin/src/hooks/useDataManager.js +10 -6
- package/admin/src/hooks/useNavigationConfig.d.ts +10 -0
- package/admin/src/hooks/useNavigationConfig.js +52 -56
- package/admin/src/index.d.ts +14 -0
- package/admin/src/index.js +92 -76
- package/admin/src/pages/App/index.d.ts +3 -0
- package/admin/src/pages/App/index.js +43 -31
- package/admin/src/pages/DataManagerProvider/actions.d.ts +19 -0
- package/admin/src/pages/DataManagerProvider/actions.js +22 -26
- package/admin/src/pages/DataManagerProvider/index.d.ts +12 -0
- package/admin/src/pages/DataManagerProvider/index.js +280 -300
- package/admin/src/pages/DataManagerProvider/init.d.ts +3 -0
- package/admin/src/pages/DataManagerProvider/init.js +5 -3
- package/admin/src/pages/DataManagerProvider/reducer.d.ts +19 -0
- package/admin/src/pages/DataManagerProvider/reducer.js +119 -121
- package/admin/src/pages/SettingsPage/components/DisableI18nModal/index.d.ts +24 -0
- package/admin/src/pages/SettingsPage/components/DisableI18nModal/index.js +88 -0
- package/admin/src/pages/SettingsPage/index.d.ts +3 -0
- package/admin/src/pages/SettingsPage/index.js +242 -335
- package/admin/src/pages/SettingsPage/utils/functions.d.ts +5 -0
- package/admin/src/pages/SettingsPage/utils/functions.js +3 -8
- package/admin/src/pages/View/components/I18nCopyNavigationItems/index.d.ts +20 -0
- package/admin/src/pages/View/components/I18nCopyNavigationItems/index.js +60 -0
- package/admin/src/pages/View/components/NavigationContentHeader/index.d.ts +6 -0
- package/admin/src/pages/View/components/NavigationContentHeader/index.js +13 -17
- package/admin/src/pages/View/components/NavigationHeader/index.d.ts +12 -0
- package/admin/src/pages/View/components/NavigationHeader/index.js +74 -65
- package/admin/src/pages/View/components/NavigationHeader/styles.d.ts +2 -0
- package/admin/src/pages/View/components/NavigationHeader/styles.js +10 -5
- package/admin/src/pages/View/components/NavigationItemForm/index.d.ts +51 -0
- package/admin/src/pages/View/components/NavigationItemForm/index.js +335 -454
- package/admin/src/pages/View/components/NavigationItemForm/utils/form.d.ts +45 -0
- package/admin/src/pages/View/components/NavigationItemForm/utils/form.js +81 -52
- package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.d.ts +23 -0
- package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js +24 -34
- package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.d.ts +4 -0
- package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js +16 -16
- package/admin/src/pages/View/components/NavigationItemPopup/index.d.ts +27 -0
- package/admin/src/pages/View/components/NavigationItemPopup/index.js +59 -108
- package/admin/src/pages/View/index.d.ts +4 -0
- package/admin/src/pages/View/index.js +229 -304
- package/admin/src/pages/View/utils/enums.d.ts +9 -0
- package/admin/src/pages/View/utils/enums.js +11 -8
- package/admin/src/pages/View/utils/form.d.ts +2 -0
- package/admin/src/pages/View/utils/form.js +15 -12
- package/admin/src/pages/View/utils/index.d.ts +2 -0
- package/admin/src/pages/View/utils/index.js +11 -3
- package/admin/src/pages/View/utils/parsers.d.ts +44 -0
- package/admin/src/pages/View/utils/parsers.js +231 -278
- package/admin/src/permissions.d.ts +12 -0
- package/admin/src/permissions.js +11 -7
- package/admin/src/pluginId.d.ts +3 -0
- package/admin/src/pluginId.js +2 -2
- package/admin/src/translations/en.json +126 -104
- package/admin/src/translations/fr.json +44 -44
- package/admin/src/translations/index.d.ts +12 -0
- package/admin/src/translations/index.js +17 -11
- package/admin/src/utils/api.d.ts +8 -0
- package/admin/src/utils/api.js +54 -50
- package/admin/src/utils/getTrad.d.ts +3 -0
- package/admin/src/utils/getTrad.js +9 -5
- package/admin/src/utils/index.d.ts +5 -0
- package/admin/src/utils/index.js +21 -15
- package/package.json +19 -17
- package/permissions.d.ts +9 -0
- package/permissions.js +5 -4
- package/server/bootstrap/index.d.ts +4 -0
- package/server/bootstrap/index.js +41 -0
- package/server/config/index.d.ts +5 -0
- package/server/config/index.js +33 -9
- package/server/config/setupStrategy.d.ts +3 -0
- package/server/config/setupStrategy.js +38 -0
- package/server/content-types/audience/index.d.ts +27 -0
- package/server/content-types/audience/index.js +9 -8
- package/server/content-types/audience/schema.d.ts +25 -0
- package/server/content-types/audience/schema.js +26 -0
- package/server/content-types/index.d.ts +255 -0
- package/server/content-types/index.js +15 -12
- package/server/content-types/navigation/index.d.ts +64 -0
- package/server/content-types/navigation/index.js +11 -8
- package/server/content-types/navigation/lifecycle.d.ts +9 -0
- package/server/content-types/navigation/lifecycle.js +8 -12
- package/server/content-types/navigation/schema.d.ts +55 -0
- package/server/content-types/navigation/schema.js +56 -0
- package/server/content-types/navigation-item/index.d.ts +112 -0
- package/server/content-types/navigation-item/index.js +11 -8
- package/server/content-types/navigation-item/lifecycle.d.ts +16 -0
- package/server/content-types/navigation-item/lifecycle.js +28 -32
- package/server/content-types/navigation-item/schema.d.ts +97 -0
- package/server/content-types/navigation-item/schema.js +102 -0
- package/server/content-types/navigations-items-related/index.d.ts +56 -0
- package/server/content-types/navigations-items-related/index.js +11 -8
- package/server/content-types/navigations-items-related/lifecycle.d.ts +8 -0
- package/server/content-types/navigations-items-related/lifecycle.js +20 -17
- package/server/content-types/navigations-items-related/schema.d.ts +49 -0
- package/server/content-types/navigations-items-related/schema.js +50 -0
- package/server/controllers/admin.d.ts +4 -0
- package/server/controllers/admin.js +77 -0
- package/server/controllers/client.d.ts +4 -0
- package/server/controllers/client.js +34 -0
- package/server/controllers/index.d.ts +4 -0
- package/server/controllers/index.js +12 -6
- package/server/destroy.d.ts +3 -0
- package/server/destroy.js +5 -0
- package/server/graphql/config.d.ts +4 -0
- package/server/graphql/config.js +28 -0
- package/server/graphql/index.d.ts +2 -0
- package/server/graphql/index.js +18 -22
- package/server/graphql/queries/index.d.ts +3 -0
- package/server/graphql/queries/index.js +15 -15
- package/server/graphql/queries/render-navigation-child.d.ts +15 -0
- package/server/graphql/queries/render-navigation-child.js +24 -15
- package/server/graphql/queries/render-navigation.d.ts +21 -0
- package/server/graphql/queries/render-navigation.js +31 -15
- package/server/graphql/resolvers-config.d.ts +10 -0
- package/server/graphql/resolvers-config.js +5 -3
- package/server/graphql/setupStrategy.d.ts +3 -0
- package/server/graphql/setupStrategy.js +15 -0
- package/server/graphql/types/content-types-name-fields.d.ts +6 -0
- package/server/graphql/types/content-types-name-fields.js +13 -9
- package/server/graphql/types/content-types.d.ts +5 -0
- package/server/graphql/types/content-types.js +17 -15
- package/server/graphql/types/create-navigation-item.d.ts +5 -0
- package/server/graphql/types/create-navigation-item.js +18 -16
- package/server/graphql/types/create-navigation-related.d.ts +5 -0
- package/server/graphql/types/create-navigation-related.js +9 -7
- package/server/graphql/types/create-navigation.d.ts +5 -0
- package/server/graphql/types/create-navigation.js +8 -6
- package/server/graphql/types/index.d.ts +3 -0
- package/server/graphql/types/index.js +15 -13
- package/server/graphql/types/navigation-config.d.ts +5 -0
- package/server/graphql/types/navigation-config.js +10 -8
- package/server/graphql/types/navigation-details.d.ts +5 -0
- package/server/graphql/types/navigation-details.js +11 -9
- package/server/graphql/types/navigation-item-related-data.d.ts +5 -0
- package/server/graphql/types/navigation-item-related-data.js +9 -0
- package/server/graphql/types/navigation-item-related.d.ts +7 -0
- package/server/graphql/types/navigation-item-related.js +25 -0
- package/server/graphql/types/navigation-item.d.ts +5 -0
- package/server/graphql/types/navigation-item.js +28 -29
- package/server/graphql/types/navigation-render-type.d.ts +5 -0
- package/server/graphql/types/navigation-render-type.js +7 -4
- package/server/graphql/types/navigation.d.ts +5 -0
- package/server/graphql/types/navigation.js +10 -8
- package/server/i18n/constant.d.ts +2 -0
- package/server/i18n/constant.js +5 -0
- package/server/i18n/errors.d.ts +7 -0
- package/server/i18n/errors.js +14 -0
- package/server/i18n/graphQLEnhancers.d.ts +10 -0
- package/server/i18n/graphQLEnhancers.js +10 -0
- package/server/i18n/index.d.ts +8 -0
- package/server/i18n/index.js +23 -0
- package/server/i18n/navigationSetupStrategy.d.ts +3 -0
- package/server/i18n/navigationSetupStrategy.js +119 -0
- package/server/i18n/serviceEnhancers.d.ts +12 -0
- package/server/i18n/serviceEnhancers.js +117 -0
- package/server/i18n/types.d.ts +54 -0
- package/server/i18n/types.js +3 -0
- package/server/i18n/utils.d.ts +12 -0
- package/server/i18n/utils.js +29 -0
- package/server/index.d.ts +273 -0
- package/server/index.js +26 -0
- package/server/navigation/index.d.ts +2 -0
- package/server/navigation/index.js +18 -0
- package/server/navigation/setupStrategy.d.ts +3 -0
- package/server/navigation/setupStrategy.js +37 -0
- package/server/register/index.d.ts +3 -0
- package/server/register/index.js +4 -0
- package/server/routes/admin.d.ts +4 -0
- package/server/routes/admin.js +72 -61
- package/server/routes/client.d.ts +4 -0
- package/server/routes/client.js +25 -21
- package/server/routes/index.d.ts +6 -0
- package/server/routes/index.js +13 -4
- package/server/services/admin.d.ts +5 -0
- package/server/services/admin.js +183 -0
- package/server/services/client.d.ts +5 -0
- package/server/services/client.js +249 -0
- package/server/services/common.d.ts +5 -0
- package/server/services/common.js +313 -0
- package/server/services/index.d.ts +7 -0
- package/server/services/index.js +14 -6
- package/server/utils/constant.d.ts +27 -0
- package/server/utils/constant.js +24 -0
- package/server/utils/functions.d.ts +138 -0
- package/server/utils/functions.js +224 -0
- package/server/utils/index.d.ts +3 -0
- package/server/utils/index.js +19 -0
- package/strapi-admin.d.ts +3 -0
- package/strapi-admin.js +8 -1
- package/strapi-server.d.ts +273 -0
- package/strapi-server.js +6 -17
- package/tsconfig.tsbuildinfo +1 -0
- package/types/bootstrap.d.ts +13 -0
- package/types/bootstrap.js +3 -0
- package/types/config.d.ts +21 -0
- package/types/config.js +3 -0
- package/types/contentTypes.d.ts +85 -0
- package/types/contentTypes.js +3 -0
- package/types/controllers.d.ts +35 -0
- package/types/controllers.js +5 -0
- package/types/graphQL.d.ts +3 -0
- package/types/graphQL.js +3 -0
- package/types/i18n.d.ts +9 -0
- package/types/i18n.js +3 -0
- package/types/index.d.ts +9 -0
- package/types/index.js +25 -0
- package/types/services.d.ts +68 -0
- package/types/services.js +3 -0
- package/types/utils.d.ts +58 -0
- package/types/utils.js +26 -0
- package/utils/InvalidParamNavigationError.d.ts +4 -0
- package/utils/InvalidParamNavigationError.js +11 -0
- package/utils/NavigationError.d.ts +5 -0
- package/utils/NavigationError.js +7 -7
- package/__mocks__/pages.settings.json +0 -25
- package/__mocks__/strapi.js +0 -207
- package/jest.config.js +0 -14
- package/server/bootstrap.js +0 -52
- package/server/config.js +0 -9
- package/server/content-types/audience/lifecycle.js +0 -8
- package/server/content-types/audience/schema.json +0 -23
- package/server/content-types/navigation/schema.json +0 -45
- package/server/content-types/navigation-item/schema.json +0 -99
- package/server/content-types/navigations-items-related/schema.json +0 -47
- package/server/controllers/navigation.js +0 -105
- package/server/graphql/types/navigation-related.js +0 -25
- package/server/services/__tests__/functions.test.js +0 -48
- package/server/services/__tests__/navigation.test.js +0 -91
- package/server/services/navigation.js +0 -791
- package/server/services/utils/constant.js +0 -21
- package/server/services/utils/functions.js +0 -226
package/README.md
CHANGED
|
@@ -36,6 +36,22 @@ Strapi Navigation Plugin provides a website navigation / menu builder feature fo
|
|
|
36
36
|
- Tree (nested)
|
|
37
37
|
- RFR (ready for handling by Redux First Router)
|
|
38
38
|
|
|
39
|
+
### Table of Contents
|
|
40
|
+
1. [✨ Features](#-features)
|
|
41
|
+
2. [⏳ Installation](#-installation)
|
|
42
|
+
3. [🖐 Requirements](#-requirements)
|
|
43
|
+
4. [🔧 Basic Configuration](#-configuration)
|
|
44
|
+
- [Settings page](#in-v203-and-newer)
|
|
45
|
+
- [Plugin file](#in-v202-and-older--default-configuration-state-for-v203-and-newer)
|
|
46
|
+
5. [🔧 GraphQL Configuration](#-gql-configuration)
|
|
47
|
+
6. [🌍 i18n Internationalization](#-i18n-internationalization)
|
|
48
|
+
7. [🕸️ Public API specification](#%EF%B8%8F-public-api-specification)
|
|
49
|
+
- [REST API](#rest-api)
|
|
50
|
+
- [GraphQL API](#graphql-api)
|
|
51
|
+
8. [💬 FAQ](#-faq)
|
|
52
|
+
10. [🤝 Contributing](#-contributing)
|
|
53
|
+
11. [👨💻 Community support](#-community-support)
|
|
54
|
+
|
|
39
55
|
## ✨ Features
|
|
40
56
|
|
|
41
57
|
- **Navigation Public API:** Simple and ready for use API endpoint for consuming the navigation structure you've created
|
|
@@ -43,6 +59,8 @@ Strapi Navigation Plugin provides a website navigation / menu builder feature fo
|
|
|
43
59
|
- **Any Content Type relation:** Navigation can by linked to any of your Content Types by default. Simply, you're controlling it and also limiting available content types by configuration props
|
|
44
60
|
- **Different types of navigation items:** Create navigation with items linked to internal types, to external links or wrapper elements to keep structure clean
|
|
45
61
|
- **Multiple navigations:** Create as many Navigation containers as you want, setup them and use in the consumer application
|
|
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.
|
|
46
64
|
- **Customizable:** Possibility to customize the options like: available Content Types, Maximum level for "attach to menu", Additional fields (audience)
|
|
47
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
|
|
48
66
|
|
|
@@ -53,13 +71,23 @@ Strapi Navigation Plugin provides a website navigation / menu builder feature fo
|
|
|
53
71
|
|
|
54
72
|
## ⏳ Installation
|
|
55
73
|
|
|
74
|
+
### Via Strapi Markerplace
|
|
75
|
+
|
|
76
|
+
As a ✅ **verified** plugin by Strapi team we're available on the [**Strapi Marketplace**](https://market.strapi.io/plugins/strapi-plugin-navigation) as well as **In-App Marketplace** where you can follow the installation instructions.
|
|
77
|
+
|
|
78
|
+
<div style="margin: 20px 0" align="center">
|
|
79
|
+
<img style="width: 100%; height: auto;" src="public/assets/marketplace.png" alt="Strapi In-App Marketplace" />
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
### Via command line
|
|
83
|
+
|
|
56
84
|
It's recommended to use **yarn** to install this plugin within your Strapi project. [You can install yarn with these docs](https://yarnpkg.com/lang/en/docs/install/).
|
|
57
85
|
|
|
58
86
|
```bash
|
|
59
87
|
yarn add strapi-plugin-navigation@latest
|
|
60
88
|
```
|
|
61
89
|
|
|
62
|
-
After successful installation you've to build
|
|
90
|
+
After successful installation you've to re-build your Strapi instance. To archive that simply use:
|
|
63
91
|
|
|
64
92
|
```bash
|
|
65
93
|
yarn build
|
|
@@ -74,7 +102,15 @@ yarn develop --watch-admin
|
|
|
74
102
|
|
|
75
103
|
The **UI Navigation** plugin should appear in the **Plugins** section of Strapi sidebar after you run app again.
|
|
76
104
|
|
|
77
|
-
|
|
105
|
+
You can manage your multiple navigation containers by going to the **Navigation** section of the **Content Manager**.
|
|
106
|
+
|
|
107
|
+
<div style="margin: 20px 0" align="center">
|
|
108
|
+
<img style="width: 100%; height: auto;" src="public/assets/content-manager.png" alt="Strapi In-App Marketplace" />
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
As a next step you must configure your the plugin by the way you want to. See [**Configuration**](#🔧-configuration) section.
|
|
112
|
+
|
|
113
|
+
All done. Enjoy 🎉
|
|
78
114
|
|
|
79
115
|
## 🖐 Requirements
|
|
80
116
|
|
|
@@ -82,7 +118,7 @@ Complete installation requirements are exact same as for Strapi itself and can b
|
|
|
82
118
|
|
|
83
119
|
**Supported Strapi versions**:
|
|
84
120
|
|
|
85
|
-
- Strapi v4.1.
|
|
121
|
+
- Strapi v4.1.11 (recently tested)
|
|
86
122
|
- Strapi v4.x
|
|
87
123
|
|
|
88
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).
|
|
@@ -91,9 +127,17 @@ Complete installation requirements are exact same as for Strapi itself and can b
|
|
|
91
127
|
|
|
92
128
|
## 🔧 Configuration
|
|
93
129
|
|
|
130
|
+
To start your journey with **Navigation plugin** you must first setup it using the dedicated Settings page (`v2.0.3` and newer) or for any version, put your configuration in `config/plugins.js`. Anyway we're recommending the click-through option where your configuration is going to be properly validated.
|
|
131
|
+
|
|
94
132
|
### In `v2.0.3` and newer
|
|
95
133
|
|
|
96
|
-
Version `2.0.3` introduces the intuitive **Settings** page which you can easily access via `Strapi Settings -> Section: Navigation Plugin -> Configuration`.
|
|
134
|
+
Version `2.0.3` introduces the intuitive **Settings** page which you can easily access via `Strapi Settings -> Section: Navigation Plugin -> Configuration`.
|
|
135
|
+
|
|
136
|
+
On the dedicated page, you will be able to set up all crucial properties which drive the plugin and customize each individual collection for which **Navigation plugin** should be enabled.
|
|
137
|
+
|
|
138
|
+
<div style="margin: 20px 0" align="center">
|
|
139
|
+
<img style="width: 100%; height: auto;" src="public/assets/configuration.png" alt="Plugin configuration" />
|
|
140
|
+
</div>
|
|
97
141
|
|
|
98
142
|
> *Note*
|
|
99
143
|
> The default configuration for your plugin is fetched from `config/plugins.js` or, if the file is not there, directly from the plugin itself. If you would like to customize the default state to which you might revert, please follow the next section.
|
|
@@ -129,6 +173,7 @@ Config for this plugin is stored as a part of the `config/plugins.js` or `config
|
|
|
129
173
|
- `contentTypes` - UIDs of related content types
|
|
130
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`
|
|
131
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)**
|
|
132
177
|
|
|
133
178
|
## 🔧 GQL Configuration
|
|
134
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:
|
|
@@ -159,6 +204,38 @@ gql: {
|
|
|
159
204
|
```
|
|
160
205
|
where `Page` and `UploadFile` are your type names for the **Content Types** you're referring by navigation items relations.
|
|
161
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
|
+
|
|
162
239
|
## 👤 RBAC
|
|
163
240
|
Plugin provides granular permissions based on Strapi RBAC functionality.
|
|
164
241
|
|
|
@@ -169,7 +246,7 @@ For any role different than **Super Admin**, to access the **Navigation panel**
|
|
|
169
246
|
## Base Navigation Item model
|
|
170
247
|
|
|
171
248
|
### Flat
|
|
172
|
-
```
|
|
249
|
+
```json
|
|
173
250
|
{
|
|
174
251
|
"id": 1,
|
|
175
252
|
"title": "News",
|
|
@@ -182,13 +259,13 @@ For any role different than **Super Admin**, to access the **Navigation panel**
|
|
|
182
259
|
"master": 1, // Navigation 'id'
|
|
183
260
|
"createdAt": "2020-09-29T13:29:19.086Z",
|
|
184
261
|
"updatedAt": "2020-09-29T13:29:19.128Z",
|
|
185
|
-
"related":
|
|
262
|
+
"related": {/*<Content Type model >*/ },
|
|
186
263
|
"audience": []
|
|
187
264
|
}
|
|
188
265
|
```
|
|
189
266
|
|
|
190
267
|
### Tree
|
|
191
|
-
```
|
|
268
|
+
```json
|
|
192
269
|
{
|
|
193
270
|
"title": "News",
|
|
194
271
|
"menuAttached": true,
|
|
@@ -198,7 +275,7 @@ For any role different than **Super Admin**, to access the **Navigation panel**
|
|
|
198
275
|
"slug": "benefits",
|
|
199
276
|
"external": false,
|
|
200
277
|
"related": {
|
|
201
|
-
<Content Type model >
|
|
278
|
+
// <Content Type model >
|
|
202
279
|
},
|
|
203
280
|
"items": [
|
|
204
281
|
{
|
|
@@ -209,13 +286,13 @@ For any role different than **Super Admin**, to access the **Navigation panel**
|
|
|
209
286
|
"uiRouterKey": "generic",
|
|
210
287
|
"external": true
|
|
211
288
|
},
|
|
212
|
-
|
|
289
|
+
// < Tree Navigation Item models >
|
|
213
290
|
]
|
|
214
291
|
}
|
|
215
292
|
```
|
|
216
293
|
|
|
217
294
|
### RFR
|
|
218
|
-
```
|
|
295
|
+
```json
|
|
219
296
|
{
|
|
220
297
|
"id": "News",
|
|
221
298
|
"title": "News",
|
|
@@ -234,33 +311,41 @@ For any role different than **Super Admin**, to access the **Navigation panel**
|
|
|
234
311
|
|
|
235
312
|
## 🕸️ Public API specification
|
|
236
313
|
|
|
237
|
-
|
|
314
|
+
Plugin supports both **REST API** and **GraphQL API** exposed by Strapi.
|
|
315
|
+
|
|
316
|
+
**Query Params**
|
|
238
317
|
|
|
239
|
-
- `
|
|
318
|
+
- `navigationIdOrSlug` - ID or slug for which your navigation structure is generated like for REST API:
|
|
240
319
|
|
|
241
|
-
|
|
320
|
+
> `https://localhost:1337/api/navigation/render/1`
|
|
321
|
+
> `https://localhost:1337/api/navigation/render/main-menu`
|
|
242
322
|
|
|
243
|
-
- `
|
|
323
|
+
- `type` - Enum value representing structure type of returned navigation:
|
|
324
|
+
> `https://localhost:1337/api/navigation/render/1?type=FLAT`
|
|
244
325
|
|
|
245
|
-
|
|
326
|
+
- `menu` (`menuOnly` for GQL) - Boolean value for querying only navigation items that are attached to menu should be rendered eg.
|
|
327
|
+
> `https://localhost:1337/api/navigation/render/1?menu=true`
|
|
246
328
|
|
|
247
|
-
- `path` - String value for querying navigation items by its path
|
|
329
|
+
- `path` - String value for querying navigation items by its path:
|
|
330
|
+
> `https://localhost:1337/api/navigation/render/1?path=/home/about-us`
|
|
248
331
|
|
|
249
|
-
|
|
332
|
+
### REST API
|
|
250
333
|
|
|
251
|
-
|
|
334
|
+
> **Important!**
|
|
335
|
+
> Version `v2.0.13` introduced breaking change!
|
|
336
|
+
> All responses have changed their structure. Related field will now be of type ContentType instead of Array\<ContentType\>
|
|
252
337
|
|
|
253
|
-
`GET <host>/api/navigation/render/<
|
|
338
|
+
`GET <host>/api/navigation/render/<navigationIdOrSlug>?type=<type>`
|
|
254
339
|
|
|
255
|
-
Return a rendered navigation structure depends on passed type (`
|
|
340
|
+
Return a rendered navigation structure depends on passed type (`TREE`, `RFR` or nothing to render as `FLAT`).
|
|
256
341
|
|
|
257
|
-
|
|
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.
|
|
258
343
|
|
|
259
344
|
**Example URL**: `https://localhost:1337/api/navigation/render/1`
|
|
260
345
|
|
|
261
346
|
**Example response body**
|
|
262
347
|
|
|
263
|
-
```
|
|
348
|
+
```json
|
|
264
349
|
[
|
|
265
350
|
{
|
|
266
351
|
"id": 1,
|
|
@@ -274,22 +359,22 @@ Return a rendered navigation structure depends on passed type (`tree`, `rfr` or
|
|
|
274
359
|
"master": 1,
|
|
275
360
|
"created_at": "2020-09-29T13:29:19.086Z",
|
|
276
361
|
"updated_at": "2020-09-29T13:29:19.128Z",
|
|
277
|
-
"related":
|
|
362
|
+
"related": {
|
|
278
363
|
"__contentType": "Page",
|
|
279
364
|
"id": 1,
|
|
280
365
|
"title": "News",
|
|
281
|
-
...
|
|
282
|
-
}
|
|
366
|
+
// ...
|
|
367
|
+
}
|
|
283
368
|
},
|
|
284
|
-
...
|
|
369
|
+
// ...
|
|
285
370
|
]
|
|
286
371
|
```
|
|
287
372
|
|
|
288
|
-
**Example URL**: `https://localhost:1337/api/navigation/render/1?type=
|
|
373
|
+
**Example URL**: `https://localhost:1337/api/navigation/render/1?type=TREE`
|
|
289
374
|
|
|
290
375
|
**Example response body**
|
|
291
376
|
|
|
292
|
-
```
|
|
377
|
+
```json
|
|
293
378
|
[
|
|
294
379
|
{
|
|
295
380
|
"title": "News",
|
|
@@ -303,7 +388,7 @@ Return a rendered navigation structure depends on passed type (`tree`, `rfr` or
|
|
|
303
388
|
"__contentType": "Page",
|
|
304
389
|
"id": 1,
|
|
305
390
|
"title": "News",
|
|
306
|
-
...
|
|
391
|
+
// ...
|
|
307
392
|
},
|
|
308
393
|
"items": [
|
|
309
394
|
{
|
|
@@ -314,18 +399,18 @@ Return a rendered navigation structure depends on passed type (`tree`, `rfr` or
|
|
|
314
399
|
"uiRouterKey": "generic",
|
|
315
400
|
"external": true
|
|
316
401
|
},
|
|
317
|
-
...
|
|
402
|
+
// ...
|
|
318
403
|
]
|
|
319
404
|
},
|
|
320
|
-
...
|
|
405
|
+
// ...
|
|
321
406
|
]
|
|
322
407
|
```
|
|
323
408
|
|
|
324
|
-
**Example URL**: `https://localhost:1337/api/navigation/render/1?type=
|
|
409
|
+
**Example URL**: `https://localhost:1337/api/navigation/render/1?type=RFR`
|
|
325
410
|
|
|
326
411
|
**Example response body**
|
|
327
412
|
|
|
328
|
-
```
|
|
413
|
+
```json
|
|
329
414
|
{
|
|
330
415
|
"pages": {
|
|
331
416
|
"News": {
|
|
@@ -370,7 +455,7 @@ Return a rendered navigation structure depends on passed type (`tree`, `rfr` or
|
|
|
370
455
|
"parent": "Community",
|
|
371
456
|
"menuAttached": false
|
|
372
457
|
},
|
|
373
|
-
...
|
|
458
|
+
// ...
|
|
374
459
|
},
|
|
375
460
|
"nav": {
|
|
376
461
|
"root": [
|
|
@@ -389,7 +474,7 @@ Return a rendered navigation structure depends on passed type (`tree`, `rfr` or
|
|
|
389
474
|
"type": "external",
|
|
390
475
|
"url": "http://example.com"
|
|
391
476
|
},
|
|
392
|
-
...
|
|
477
|
+
// ...
|
|
393
478
|
],
|
|
394
479
|
"Community": [
|
|
395
480
|
{
|
|
@@ -397,10 +482,113 @@ Return a rendered navigation structure depends on passed type (`tree`, `rfr` or
|
|
|
397
482
|
"type": "internal",
|
|
398
483
|
"page": "Highlights"
|
|
399
484
|
},
|
|
400
|
-
...
|
|
485
|
+
// ...
|
|
401
486
|
],
|
|
402
|
-
...
|
|
487
|
+
// ...
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
### GraphQL API
|
|
493
|
+
|
|
494
|
+
Same as [**REST API**](#rest-api) returns a rendered navigation structure depends on passed type (`TREE`, `RFR` or nothing to render as `FLAT`).
|
|
495
|
+
|
|
496
|
+
**Example request**
|
|
497
|
+
|
|
498
|
+
```graphql
|
|
499
|
+
query {
|
|
500
|
+
renderNavigation(
|
|
501
|
+
navigationIdOrSlug: "main-navigation"
|
|
502
|
+
type: TREE
|
|
503
|
+
menuOnly: false
|
|
504
|
+
) {
|
|
505
|
+
id
|
|
506
|
+
title
|
|
507
|
+
path
|
|
508
|
+
related {
|
|
509
|
+
id
|
|
510
|
+
attributes {
|
|
511
|
+
__typename
|
|
512
|
+
|
|
513
|
+
... on Page {
|
|
514
|
+
Title
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
... on WithFlowType {
|
|
518
|
+
Name
|
|
519
|
+
}
|
|
520
|
+
}
|
|
403
521
|
}
|
|
522
|
+
items {
|
|
523
|
+
id
|
|
524
|
+
title
|
|
525
|
+
path
|
|
526
|
+
related {
|
|
527
|
+
id
|
|
528
|
+
attributes {
|
|
529
|
+
__typename
|
|
530
|
+
|
|
531
|
+
... on Page {
|
|
532
|
+
Title
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
... on WithFlowType {
|
|
536
|
+
Name
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
**Example response**
|
|
546
|
+
|
|
547
|
+
```json
|
|
548
|
+
{
|
|
549
|
+
"data": {
|
|
550
|
+
"renderNavigation": [
|
|
551
|
+
{
|
|
552
|
+
"id": 8,
|
|
553
|
+
"title": "Test page",
|
|
554
|
+
"path": "/test-path",
|
|
555
|
+
"related": {
|
|
556
|
+
"id": 3,
|
|
557
|
+
"attributes": {
|
|
558
|
+
"__typename": "WithFlowType",
|
|
559
|
+
"Name": "Test"
|
|
560
|
+
}
|
|
561
|
+
},
|
|
562
|
+
"items": [
|
|
563
|
+
{
|
|
564
|
+
"id": 11,
|
|
565
|
+
"title": "Nested",
|
|
566
|
+
"path": "/test-path/nested-one",
|
|
567
|
+
"related": {
|
|
568
|
+
"id": 1,
|
|
569
|
+
"attributes": {
|
|
570
|
+
"__typename": "Page",
|
|
571
|
+
"Title": "Eg. Page title"
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
]
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
"id": 10,
|
|
579
|
+
"title": "Another page",
|
|
580
|
+
"path": "/another",
|
|
581
|
+
"related": {
|
|
582
|
+
"id": 2,
|
|
583
|
+
"attributes": {
|
|
584
|
+
"__typename": "Page",
|
|
585
|
+
"Title": "dfdfdf"
|
|
586
|
+
}
|
|
587
|
+
},
|
|
588
|
+
"items": []
|
|
589
|
+
}
|
|
590
|
+
]
|
|
591
|
+
}
|
|
404
592
|
}
|
|
405
593
|
```
|
|
406
594
|
|
|
@@ -416,13 +604,22 @@ For single types a global name of this content type will be used as a template n
|
|
|
416
604
|
|
|
417
605
|
Live example of plugin usage can be found in the [VirtusLab Strapi Examples](https://github.com/VirtusLab/strapi-examples/tree/master/strapi-plugin-navigation) repository.
|
|
418
606
|
|
|
419
|
-
## 💬
|
|
607
|
+
## 💬 FAQ
|
|
420
608
|
|
|
421
|
-
###
|
|
609
|
+
### GraphQL tricks
|
|
422
610
|
|
|
423
|
-
**Q:** I
|
|
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?
|
|
424
612
|
|
|
425
|
-
**A:**
|
|
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):
|
|
614
|
+
|
|
615
|
+
```js
|
|
616
|
+
module.exports = {
|
|
617
|
+
'navigation': { enabled: true },
|
|
618
|
+
'graphql': { enabled: true },
|
|
619
|
+
};
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
If you already got it, make sure that `navigation` plugin is inserted before `graphql`. That should do the job.
|
|
426
623
|
|
|
427
624
|
## 🤝 Contributing
|
|
428
625
|
|
|
@@ -437,6 +634,28 @@ Live example of plugin usage can be found in the [VirtusLab Strapi Examples](htt
|
|
|
437
634
|
|
|
438
635
|
Feel free to fork and make a Pull Request to this plugin project. All the input is warmly welcome!
|
|
439
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
|
+
|
|
440
659
|
## 👨💻 Community support
|
|
441
660
|
|
|
442
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:
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|