strapi-plugin-navigation 1.1.1 → 2.0.0-beta.3

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 (129) hide show
  1. package/README.md +36 -15
  2. package/admin/src/components/EmptyView/index.js +7 -16
  3. package/admin/src/components/Item/ItemCardBadge/index.js +8 -0
  4. package/admin/src/components/Item/ItemCardHeader/Wrapper.js +21 -0
  5. package/admin/src/components/Item/ItemCardHeader/index.js +59 -0
  6. package/admin/src/components/Item/Wrapper.js +39 -0
  7. package/admin/src/components/Item/index.js +76 -124
  8. package/admin/src/components/NavigationItemList/Wrapper.js +22 -0
  9. package/admin/src/components/NavigationItemList/index.js +54 -0
  10. package/admin/src/components/PluginIcon/index.js +6 -0
  11. package/admin/src/index.js +49 -45
  12. package/admin/src/pages/App/index.js +31 -0
  13. package/admin/src/{containers → pages}/DataManagerProvider/actions.js +0 -0
  14. package/admin/src/{containers → pages}/DataManagerProvider/index.js +77 -84
  15. package/admin/src/{containers → pages}/DataManagerProvider/init.js +0 -0
  16. package/admin/src/pages/DataManagerProvider/reducer.js +125 -0
  17. package/admin/src/pages/View/components/NavigationContentHeader/index.js +18 -0
  18. package/admin/src/pages/View/components/NavigationHeader/index.js +60 -0
  19. package/admin/src/pages/View/components/NavigationItemForm/index.js +403 -0
  20. package/admin/src/{containers → pages}/View/components/NavigationItemForm/utils/form.js +2 -2
  21. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupFooter.js +40 -0
  22. package/admin/src/pages/View/components/NavigationItemPopup/NavigationItemPopupHeader.js +20 -0
  23. package/admin/src/{containers → pages}/View/components/NavigationItemPopup/index.js +16 -16
  24. package/admin/src/pages/View/index.js +209 -0
  25. package/admin/src/{containers → pages}/View/utils/enums.js +0 -0
  26. package/admin/src/{containers → pages}/View/utils/form.js +1 -1
  27. package/admin/src/{containers → pages}/View/utils/index.js +0 -0
  28. package/admin/src/{containers → pages}/View/utils/parsers.js +13 -12
  29. package/admin/src/pluginId.js +3 -2
  30. package/admin/src/translations/en.json +47 -38
  31. package/admin/src/translations/fr.json +7 -1
  32. package/admin/src/utils/getTrad.js +2 -2
  33. package/package.json +14 -6
  34. package/server/bootstrap.js +41 -0
  35. package/server/config.js +8 -0
  36. package/server/content-types/audience/index.js +9 -0
  37. package/{models/audience.js → server/content-types/audience/lifecycle.js} +0 -0
  38. package/{models/audience.settings.json → server/content-types/audience/schema.json} +4 -2
  39. package/server/content-types/index.js +13 -0
  40. package/server/content-types/navigation/index.js +9 -0
  41. package/{models/navigation.js → server/content-types/navigation/lifecycle.js} +0 -0
  42. package/server/content-types/navigation/schema.js +45 -0
  43. package/server/content-types/navigation-item/index.js +9 -0
  44. package/{models/navigationItem.js → server/content-types/navigation-item/lifecycle.js} +0 -0
  45. package/{models/navigationItem.settings.json → server/content-types/navigation-item/schema.json} +16 -12
  46. package/server/content-types/navigations-items-related/index.js +9 -0
  47. package/{models/navigations_items_related.js → server/content-types/navigations-items-related/lifecycle.js} +0 -0
  48. package/{models/navigations_items_related.settings.json → server/content-types/navigations-items-related/schema.json} +4 -2
  49. package/server/controllers/index.js +7 -0
  50. package/{controllers → server/controllers}/navigation.js +7 -39
  51. package/server/routes/admin.js +38 -0
  52. package/server/routes/index.js +3 -0
  53. package/{services → server/services}/__tests__/navigation.test.js +0 -0
  54. package/server/services/index.js +7 -0
  55. package/server/services/navigation.js +463 -0
  56. package/{services → server/services}/utils/constant.js +3 -1
  57. package/server/services/utils/functions.js +103 -0
  58. package/strapi-admin.js +1 -0
  59. package/strapi-server.js +18 -0
  60. package/__mocks__/helpers/another-plugin/blog-post.settings.json +0 -31
  61. package/__mocks__/helpers/another-plugin/pages.settings.json +0 -28
  62. package/__mocks__/helpers/blog-post.settings.json +0 -31
  63. package/__mocks__/helpers/home-page.settings.json +0 -4
  64. package/__mocks__/helpers/my-homepage.settings.json +0 -27
  65. package/__mocks__/helpers/pages.settings.json +0 -27
  66. package/__mocks__/helpers/strapi.js +0 -101
  67. package/admin/src/assets/images/icon-cross-blue.svg +0 -1
  68. package/admin/src/assets/images/icon_remove.svg +0 -19
  69. package/admin/src/components/Container/index.js +0 -7
  70. package/admin/src/components/Input/index.js +0 -41
  71. package/admin/src/components/Item/CardItem.js +0 -46
  72. package/admin/src/components/Item/CardItemLevelAdd.js +0 -41
  73. package/admin/src/components/Item/CardItemLevelWrapper.js +0 -27
  74. package/admin/src/components/Item/CardItemPath.js +0 -9
  75. package/admin/src/components/Item/CardItemRestore.js +0 -19
  76. package/admin/src/components/Item/CardItemTitle.js +0 -5
  77. package/admin/src/components/Item/CardWrapper.js +0 -78
  78. package/admin/src/components/ItemFooter/CardItemError.js +0 -11
  79. package/admin/src/components/ItemFooter/CardItemRelation.js +0 -18
  80. package/admin/src/components/ItemFooter/CardItemRelationStatus.js +0 -17
  81. package/admin/src/components/ItemFooter/CardItemType.js +0 -18
  82. package/admin/src/components/ItemFooter/Wrapper.js +0 -26
  83. package/admin/src/components/ItemFooter/index.js +0 -66
  84. package/admin/src/components/ItemOrdering/CardOrderingButton.js +0 -24
  85. package/admin/src/components/ItemOrdering/Wrapper.js +0 -24
  86. package/admin/src/components/ItemOrdering/index.js +0 -36
  87. package/admin/src/components/List/Container.js +0 -34
  88. package/admin/src/components/List/ListLevelRoot.js +0 -18
  89. package/admin/src/components/List/index.js +0 -81
  90. package/admin/src/components/Option/OptionButton.js +0 -18
  91. package/admin/src/components/Option/OptionSet.js +0 -14
  92. package/admin/src/components/Option/Wrapper.js +0 -15
  93. package/admin/src/components/Option/index.js +0 -47
  94. package/admin/src/components/Search/index.js +0 -86
  95. package/admin/src/components/Select/ClearIndicator.js +0 -15
  96. package/admin/src/components/Select/DropdownIndicator.js +0 -39
  97. package/admin/src/components/Select/ErrorMessage.js +0 -10
  98. package/admin/src/components/Select/IndicatorSeparator.js +0 -3
  99. package/admin/src/components/Select/MultiValueContainer.js +0 -43
  100. package/admin/src/components/Select/StyledOption.js +0 -11
  101. package/admin/src/components/Select/index.js +0 -68
  102. package/admin/src/components/Select/utils/styles.js +0 -92
  103. package/admin/src/containers/App/Wrapper.js +0 -14
  104. package/admin/src/containers/App/index.js +0 -34
  105. package/admin/src/containers/DataManagerProvider/reducer.js +0 -136
  106. package/admin/src/containers/DetailsView/Wrapper.js +0 -21
  107. package/admin/src/containers/DetailsView/index.js +0 -111
  108. package/admin/src/containers/Initializer/index.js +0 -26
  109. package/admin/src/containers/ListView/Footer.js +0 -56
  110. package/admin/src/containers/ListView/components.js +0 -138
  111. package/admin/src/containers/ListView/index.js +0 -54
  112. package/admin/src/containers/View/FadedWrapper.js +0 -51
  113. package/admin/src/containers/View/HeaderForm.js +0 -9
  114. package/admin/src/containers/View/HeaderFormCell.js +0 -25
  115. package/admin/src/containers/View/Wrapper.js +0 -17
  116. package/admin/src/containers/View/components/NavigationItemForm/ModalFooter.js +0 -45
  117. package/admin/src/containers/View/components/NavigationItemForm/index.js +0 -427
  118. package/admin/src/containers/View/components/NavigationItemPopup/MediumPopup.js +0 -6
  119. package/admin/src/containers/View/index.js +0 -240
  120. package/admin/src/lifecycles.js +0 -3
  121. package/admin/src/permissions.js +0 -14
  122. package/config/functions/bootstrap.js +0 -138
  123. package/config/routes.json +0 -60
  124. package/config/schema.graphql.js +0 -204
  125. package/examples/audit-log-integrations.js.md +0 -38
  126. package/models/navigation.settings.json +0 -43
  127. package/public/assets/preview.png +0 -0
  128. package/services/navigation.js +0 -730
  129. package/services/utils/functions.js +0 -186
@@ -1,138 +0,0 @@
1
- const { isEmpty, get, last } = require('lodash');
2
-
3
- const saveJSONParse = (value) => {
4
- try {
5
- return JSON.parse(value).map((_) => ({ ..._, id: _._id }));
6
- } catch (e) {
7
- return null;
8
- }
9
- };
10
-
11
- const getDefaultConnectionName = (strapi) => strapi.config.get('database.defaultConnection');
12
-
13
- const isMongo = (strapi) => {
14
- const connectionName = getDefaultConnectionName(strapi);
15
- return strapi.config.get(`database.connections.${connectionName}.connector`).includes('mongo');
16
- };
17
-
18
- const getNavigationMorphData = (strapi) => {
19
- const connectionName = getDefaultConnectionName(strapi);
20
- const { [connectionName]: knex } = strapi.connections;
21
- return knex.schema.hasTable('navigations_items_morph').then((exist)=> exist ? knex('navigations_items_morph').select('*') : []);
22
- };
23
-
24
- const getNavigationItemsModel = (strapi) => strapi.query('navigationitem', 'navigation');
25
-
26
- const getRelatedModel = (strapi) => strapi.query('navigations_items_related', 'navigation');
27
-
28
- const createRelatedData = (relatedModel, navigationItemsModel, items) => ({
29
- field,
30
- order,
31
- related_id,
32
- related_type,
33
- navigations_items_id,
34
- }) => {
35
- const item = items.find(item => item.id === navigations_items_id);
36
- const modelUID = get(strapi.query(related_type), 'model.uid');
37
- if (item && modelUID) {
38
- const relatedData = {
39
- field,
40
- order,
41
- related_id,
42
- related_type: modelUID,
43
- master: get(item.master, 'id', item.master),
44
- };
45
- return relatedModel.create(relatedData)
46
- .then(
47
- ({ id }) => navigationItemsModel.update({ id: navigations_items_id }, { related: id }),
48
- );
49
- }
50
- return Promise.resolve();
51
- };
52
-
53
- const migrateNavigationItemsSQL = async (strapi) => {
54
- const morphData = await getNavigationMorphData(strapi);
55
- if (morphData.length) {
56
- const relatedModel = getRelatedModel(strapi);
57
- const navigationItemsModel = getNavigationItemsModel(strapi);
58
- const items = await navigationItemsModel.find({});
59
- await Promise.all(morphData.map(createRelatedData(relatedModel, navigationItemsModel, items)));
60
- }
61
- };
62
-
63
- const migrateNavigationItemsMongo = async (strapi) => {
64
- const navigationItemsModel = getNavigationItemsModel(strapi);
65
- const connectionName = getDefaultConnectionName(strapi);
66
- const models = strapi.connections[connectionName].models;
67
- const items = (await models.NavigationNavigationitem.find({}))
68
- // workaround to change type from object to int
69
- .map(_ => ({ ..._.toObject(), related: last(saveJSONParse(get(_.errors, 'related.properties.value', null))) }))
70
- .filter(_ => _.related);
71
-
72
- if (items.length) {
73
- await Promise.all(items.map(item => {
74
- const data = {
75
- related_id: item.related.ref,
76
- related_type: models[item.related.kind].uid,
77
- field: item.related.field,
78
- order: 1,
79
- master: item.master,
80
- };
81
- return getRelatedModel(strapi)
82
- .create(data)
83
- .then(result => navigationItemsModel.update({ id: item.id }, { related: [result.id] }));
84
- }));
85
-
86
- }
87
- };
88
-
89
- module.exports = async () => {
90
- // Check if the plugin users-permissions is installed because the navigation needs it
91
- if (Object.keys(strapi.plugins).indexOf('users-permissions') === -1) {
92
- throw new Error(
93
- 'In order to make the navigation plugin work the users-permissions plugin is required',
94
- );
95
- }
96
-
97
- // Add permissions
98
- const actions = [
99
- {
100
- section: 'plugins',
101
- displayName: 'Access the Navigation',
102
- uid: 'read',
103
- pluginName: 'navigation',
104
- },
105
- {
106
- section: 'plugins',
107
- displayName: 'Ability to change the Navigation',
108
- uid: 'update',
109
- pluginName: 'navigation',
110
- },
111
- ];
112
-
113
- const navigations = await strapi
114
- .query('navigation', 'navigation')
115
- .find();
116
- if (isEmpty(navigations)) {
117
- await strapi
118
- .query('navigation', 'navigation')
119
- .create({
120
- name: 'Main navigation',
121
- slug: 'main-navigation',
122
- visible: true,
123
- });
124
- }
125
- const relatedModel = getRelatedModel(global.strapi);
126
- const isMigrated = !!(await relatedModel.count({}));
127
- if (!isMigrated) {
128
- const isMongoDB = isMongo(global.strapi);
129
- if (isMongoDB) {
130
- await migrateNavigationItemsMongo(global.strapi);
131
- } else {
132
- await migrateNavigationItemsSQL(global.strapi);
133
- }
134
- }
135
-
136
- const { actionProvider } = strapi.admin.services.permission;
137
- await actionProvider.registerMany(actions);
138
- };
@@ -1,60 +0,0 @@
1
- {
2
- "routes": [
3
- {
4
- "method": "GET",
5
- "path": "/",
6
- "handler": "navigation.get",
7
- "config": {
8
- "policies": []
9
- }
10
- },
11
- {
12
- "method": "POST",
13
- "path": "/",
14
- "handler": "navigation.post",
15
- "config": {
16
- "policies": []
17
- }
18
- },
19
- {
20
- "method": "GET",
21
- "path": "/config",
22
- "handler": "navigation.config",
23
- "config": {
24
- "policies": []
25
- }
26
- },
27
- {
28
- "method": "GET",
29
- "path": "/:id",
30
- "handler": "navigation.getById",
31
- "config": {
32
- "policies": []
33
- }
34
- },
35
- {
36
- "method": "PUT",
37
- "path": "/:id",
38
- "handler": "navigation.put",
39
- "config": {
40
- "policies": []
41
- }
42
- },
43
- {
44
- "method": "GET",
45
- "path": "/render/:idOrSlug",
46
- "handler": "navigation.render",
47
- "config": {
48
- "policies": []
49
- }
50
- },
51
- {
52
- "method": "GET",
53
- "path": "/render/:idOrSlug/:childUIKey",
54
- "handler": "navigation.renderChild",
55
- "config": {
56
- "policies": []
57
- }
58
- }
59
- ]
60
- }
@@ -1,204 +0,0 @@
1
- const NAVIGATION_DATE = `
2
- # SQL
3
- created_at: String
4
- updated_at: String
5
- # MONGO
6
- createdAt: String
7
- updatedAt: String
8
- `;
9
-
10
- const NAVIGATION_USER = `
11
- # SQL
12
- created_by: String
13
- updated_by: String
14
- # MONGO
15
- createdBy: String
16
- updatedBy: String
17
- `;
18
-
19
- const NAVIGATION = `
20
- id: String!
21
- name: String!
22
- slug: String!
23
- visible: Boolean!
24
- `;
25
-
26
- const getContentTypesNamesFields = () => {
27
- const contentTypesNameFields = strapi.config.get('plugins.navigation.contentTypesNameFields');
28
- return Object.keys(contentTypesNameFields || {}).map(key => `${key}: [String]!`).join('\n');
29
- };
30
-
31
- const getNavigationRelated = () => {
32
- const related = strapi.config.get('plugins.navigation.gql.navigationItemRelated');
33
- if (related) {
34
- return related;
35
- }
36
- return `
37
- type NavigationRelated {
38
- id: Int
39
- title: String
40
- name: String
41
- }
42
- `;
43
- };
44
-
45
- module.exports = {
46
- // language=GraphQL
47
- definition: `
48
- enum NavigationRenderType {
49
- FLAT,
50
- TREE,
51
- RFR
52
- }
53
-
54
- ${getNavigationRelated()}
55
-
56
-
57
- type NavigationItem {
58
- id: Int!
59
- title: String!
60
- type: String!
61
- path: String
62
- externalPath: String
63
- uiRouterKey: String!
64
- menuAttached: Boolean!
65
- order: Int!
66
- parent: Int
67
- master: Int
68
- items: [NavigationItem]
69
- related: NavigationRelated
70
- audience: [String]
71
- ${NAVIGATION_DATE}
72
- ${NAVIGATION_USER}
73
- }
74
-
75
- type Navigation {
76
- ${NAVIGATION}
77
- }
78
-
79
- type NavigationDetails {
80
- ${NAVIGATION}
81
- items: [NavigationItem]!
82
- }
83
-
84
-
85
- type ContentTypesNameFields {
86
- default: [String!]!
87
- ${getContentTypesNamesFields()}
88
- }
89
-
90
- type ContentTypes {
91
- uid: String!
92
- name: String!
93
- isSingle: Boolean!
94
- collectionName: String!
95
- contentTypeName: String!
96
- label: String!
97
- relatedField: String!
98
- labelSingular: String!
99
- endpoint: String!
100
- available: Boolean!
101
- visible: Boolean!
102
- }
103
-
104
- type NavigationConfig {
105
- allowedLevels: Int
106
- availableAudience: [NavigationAudience]!
107
- additionalFields: [String]!
108
- contentTypesNameFields: ContentTypesNameFields
109
- contentTypes: [ContentTypes]
110
- }
111
-
112
- input CreateNavigationRelated {
113
- ref: String!
114
- field: String!
115
- refId: String!
116
- }
117
-
118
- input CreateNavigationItem {
119
- title: String!
120
- type: String!
121
- path: String
122
- externalPath: String
123
- uiRouterKey: String!
124
- menuAttached: Boolean!
125
- order: Int!
126
- parent: Int
127
- master: Int
128
- items: [CreateNavigationItem]
129
- audience: [String]
130
- related: CreateNavigationRelated
131
- }
132
-
133
- input CreateNavigation {
134
- name: String!
135
- items: [CreateNavigationItem]!
136
- }
137
- `,
138
- query: `
139
- renderNavigation(navigationIdOrSlug: String!, type: NavigationRenderType, menuOnly: Boolean): [NavigationItem]!
140
- renderNavigationChild(id: String!, childUIKey: String!, type: NavigationRenderType, menuOnly: Boolean): [NavigationItem]!
141
- getNavigation: [Navigation]!
142
- configNavigation: NavigationConfig
143
- getByIdNavigation(id: String!): NavigationItem
144
- `,
145
- type: {},
146
- mutation: `
147
- navigationCreate(newNavigation: CreateNavigation!): Navigation!
148
- navigationUpdate(id: String!, navigation: CreateNavigation!): Navigation!
149
- `,
150
- resolver: {
151
- Query: {
152
- renderNavigation: {
153
- resolverOf: 'plugins::navigation.navigation.render',
154
- resolver(obj, options) {
155
- const { navigationIdOrSlug, type, menuOnly } = options;
156
- return strapi.plugins.navigation.services.navigation.render(navigationIdOrSlug, type, menuOnly);
157
- },
158
- },
159
- renderNavigationChild: {
160
- resolverOf: 'plugins::navigation.navigation.renderChild',
161
- async resolver(obj, options) {
162
- const { id, childUIKey, type, menuOnly } = options;
163
- return strapi.plugins.navigation.services.navigation.renderChildren(id, childUIKey, type, menuOnly);
164
- },
165
- },
166
- getNavigation: {
167
- resolverOf: 'plugins::navigation.navigation.get',
168
- resolver() {
169
- return strapi.plugins.navigation.services.navigation.get();
170
- },
171
- },
172
- configNavigation: {
173
- resolverOf: 'plugins::navigation.navigation.config',
174
- resolver() {
175
- return strapi.plugins.navigation.services.navigation.config();
176
- },
177
- },
178
- getByIdNavigation: {
179
- resolverOf: 'plugins::navigation.navigation.getById',
180
- async resolver(obj, options) {
181
- const { id } = options;
182
- return strapi.plugins.navigation.services.navigation.getById(id);
183
- },
184
- },
185
- },
186
- Mutation: {
187
- navigationCreate: {
188
- resolverOf: 'plugins::navigation.navigation.post',
189
- resolver(obj, options) {
190
- const { newNavigation } = options;
191
- return strapi.plugins.navigation.services.navigation.post(newNavigation);
192
- },
193
- },
194
- navigationUpdate: {
195
- resolverOf: 'plugins::navigation.navigation.put',
196
- resolver(obj, options) {
197
- const { id, navigation } = options;
198
- return strapi.plugins.navigation.services.navigation.put(id, navigation);
199
- },
200
- },
201
- },
202
- },
203
- };
204
-
@@ -1,38 +0,0 @@
1
- ```javascript
2
- const { Base, AvailableAction } = require('strapi-plugin-audit-log');
3
-
4
- class Navigation extends Base {
5
- constructor(strapi, user) {
6
- super(strapi, user);
7
-
8
- this.once('onChangeNavigation', ({ actionType, oldEntity, newEntity }) => {
9
- this.actionType = actionType;
10
- this.add('beforeUpdate', oldEntity);
11
- this.add('afterUpdate', newEntity);
12
- });
13
- }
14
-
15
- async run(method, ctx, config) {
16
- const data = this.sanitize(this.entities);
17
- switch (method) {
18
- case 'POST':
19
- case 'PUT': {
20
- const { beforeUpdate, afterUpdate } = data;
21
- if (beforeUpdate && afterUpdate) {
22
- const diffs = this.getDiff(beforeUpdate, afterUpdate);
23
- return this.save(
24
- ctx.params.id,
25
- this.actionType || AvailableAction.UPDATE,
26
- config.pluginName,
27
- diffs,
28
- );
29
- }
30
- break;
31
- }
32
- }
33
- return Promise.resolve();
34
- }
35
- }
36
-
37
- module.exports = Navigation;
38
- ```
@@ -1,43 +0,0 @@
1
- {
2
- "collectionName": "navigations",
3
- "info": {
4
- "name": "navigation",
5
- "description": "Navigation container"
6
- },
7
- "options": {
8
- "increments": true,
9
- "comment": ""
10
- },
11
- "pluginOptions": {
12
- "content-manager": {
13
- "visible": true
14
- },
15
- "content-type-builder": {
16
- "visible": false
17
- }
18
- },
19
- "attributes": {
20
- "name": {
21
- "type": "text",
22
- "configurable": false,
23
- "required": true
24
- },
25
- "slug": {
26
- "type": "uid",
27
- "target": "name",
28
- "configurable": false,
29
- "required": true
30
- },
31
- "visible": {
32
- "type": "boolean",
33
- "default": false,
34
- "configurable": false
35
- },
36
- "items": {
37
- "collection": "navigationitem",
38
- "plugin": "navigation",
39
- "via": "master",
40
- "configurable": false
41
- }
42
- }
43
- }
Binary file