@strapi/plugin-documentation 0.0.0-113ff29005

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 (72) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +151 -0
  3. package/__mocks__/strapi.js +41 -0
  4. package/__tests__/build-component-schema.test.js +271 -0
  5. package/admin/src/components/FieldActionWrapper/index.js +14 -0
  6. package/admin/src/components/PluginIcon/index.js +12 -0
  7. package/admin/src/index.js +80 -0
  8. package/admin/src/pages/PluginPage/index.js +199 -0
  9. package/admin/src/pages/PluginPage/tests/index.test.js +873 -0
  10. package/admin/src/pages/PluginPage/tests/server.js +23 -0
  11. package/admin/src/pages/SettingsPage/index.js +181 -0
  12. package/admin/src/pages/SettingsPage/tests/index.test.js +612 -0
  13. package/admin/src/pages/SettingsPage/tests/server.js +18 -0
  14. package/admin/src/pages/utils/api.js +31 -0
  15. package/admin/src/pages/utils/schema.js +11 -0
  16. package/admin/src/pages/utils/useReactQuery.js +46 -0
  17. package/admin/src/permissions.js +19 -0
  18. package/admin/src/pluginId.js +5 -0
  19. package/admin/src/translations/ar.json +20 -0
  20. package/admin/src/translations/cs.json +21 -0
  21. package/admin/src/translations/de.json +26 -0
  22. package/admin/src/translations/dk.json +39 -0
  23. package/admin/src/translations/en.json +39 -0
  24. package/admin/src/translations/es.json +39 -0
  25. package/admin/src/translations/fr.json +26 -0
  26. package/admin/src/translations/id.json +24 -0
  27. package/admin/src/translations/it.json +26 -0
  28. package/admin/src/translations/ko.json +39 -0
  29. package/admin/src/translations/ms.json +23 -0
  30. package/admin/src/translations/nl.json +21 -0
  31. package/admin/src/translations/pl.json +39 -0
  32. package/admin/src/translations/pt-BR.json +21 -0
  33. package/admin/src/translations/pt.json +21 -0
  34. package/admin/src/translations/ru.json +28 -0
  35. package/admin/src/translations/sk.json +24 -0
  36. package/admin/src/translations/th.json +24 -0
  37. package/admin/src/translations/tr.json +20 -0
  38. package/admin/src/translations/uk.json +23 -0
  39. package/admin/src/translations/vi.json +24 -0
  40. package/admin/src/translations/zh-Hans.json +28 -0
  41. package/admin/src/translations/zh.json +24 -0
  42. package/admin/src/utils/getTrad.js +5 -0
  43. package/admin/src/utils/index.js +2 -0
  44. package/admin/src/utils/openWithNewTab.js +20 -0
  45. package/package.json +66 -0
  46. package/server/bootstrap.js +54 -0
  47. package/server/config/default-plugin-config.js +74 -0
  48. package/server/config/index.js +7 -0
  49. package/server/controllers/documentation.js +241 -0
  50. package/server/controllers/index.js +7 -0
  51. package/server/index.js +17 -0
  52. package/server/middlewares/documentation.js +25 -0
  53. package/server/middlewares/index.js +7 -0
  54. package/server/middlewares/restrict-access.js +24 -0
  55. package/server/public/index.html +70 -0
  56. package/server/public/login.html +145 -0
  57. package/server/register.js +11 -0
  58. package/server/routes/index.js +84 -0
  59. package/server/services/documentation.js +209 -0
  60. package/server/services/helpers/build-api-endpoint-path.js +185 -0
  61. package/server/services/helpers/build-component-schema.js +159 -0
  62. package/server/services/helpers/index.js +9 -0
  63. package/server/services/helpers/utils/clean-schema-attributes.js +212 -0
  64. package/server/services/helpers/utils/get-api-responses.js +105 -0
  65. package/server/services/helpers/utils/get-schema-data.js +32 -0
  66. package/server/services/helpers/utils/loop-content-type-names.js +53 -0
  67. package/server/services/helpers/utils/pascal-case.js +9 -0
  68. package/server/services/helpers/utils/query-params.js +84 -0
  69. package/server/services/helpers/utils/routes.js +10 -0
  70. package/server/services/index.js +7 -0
  71. package/strapi-admin.js +3 -0
  72. package/strapi-server.js +3 -0
@@ -0,0 +1,199 @@
1
+ /**
2
+ *
3
+ * This component is the skeleton around the actual pages, and should only
4
+ * contain code that should be seen on all pages. (e.g. navigation bar)
5
+ *
6
+ */
7
+
8
+ import React, { useState } from 'react';
9
+ import { useIntl } from 'react-intl';
10
+ import {
11
+ CheckPermissions,
12
+ ConfirmDialog,
13
+ LoadingIndicatorPage,
14
+ stopPropagation,
15
+ EmptyStateLayout,
16
+ useFocusWhenNavigate,
17
+ } from '@strapi/helper-plugin';
18
+ import { Helmet } from 'react-helmet';
19
+ import { Button } from '@strapi/design-system/Button';
20
+ import { Layout, HeaderLayout, ContentLayout } from '@strapi/design-system/Layout';
21
+ import { Main } from '@strapi/design-system/Main';
22
+ import { IconButton } from '@strapi/design-system/IconButton';
23
+ import { Typography } from '@strapi/design-system/Typography';
24
+ import { Flex } from '@strapi/design-system/Flex';
25
+ import { Table, Tr, Thead, Th, Tbody, Td } from '@strapi/design-system/Table';
26
+
27
+ import Trash from '@strapi/icons/Trash';
28
+ import Show from '@strapi/icons/Eye';
29
+ import Reload from '@strapi/icons/Refresh';
30
+
31
+ import permissions from '../../permissions';
32
+ import { getTrad } from '../../utils';
33
+ import openWithNewTab from '../../utils/openWithNewTab';
34
+ import useReactQuery from '../utils/useReactQuery';
35
+
36
+ const PluginPage = () => {
37
+ useFocusWhenNavigate();
38
+ const { formatMessage } = useIntl();
39
+ const { data, isLoading, deleteMutation, regenerateDocMutation } = useReactQuery();
40
+ const [showConfirmDelete, setShowConfirmDelete] = useState(false);
41
+ const [isConfirmButtonLoading, setIsConfirmButtonLoading] = useState(false);
42
+ const [versionToDelete, setVersionToDelete] = useState();
43
+
44
+ const colCount = 4;
45
+ const rowCount = (data?.docVersions?.length || 0) + 1;
46
+
47
+ const openDocVersion = () => {
48
+ const slash = data?.prefix.startsWith('/') ? '' : '/';
49
+ openWithNewTab(`${slash}${data?.prefix}/v${data?.currentVersion}`);
50
+ };
51
+
52
+ const handleRegenerateDoc = (version) => {
53
+ regenerateDocMutation.mutate({ version, prefix: data?.prefix });
54
+ };
55
+
56
+ const handleShowConfirmDelete = () => {
57
+ setShowConfirmDelete(!showConfirmDelete);
58
+ };
59
+
60
+ const handleConfirmDelete = async () => {
61
+ setIsConfirmButtonLoading(true);
62
+ await deleteMutation.mutateAsync({ prefix: data?.prefix, version: versionToDelete });
63
+ setShowConfirmDelete(!showConfirmDelete);
64
+ setIsConfirmButtonLoading(false);
65
+ };
66
+
67
+ const handleClickDelete = (version) => {
68
+ setVersionToDelete(version);
69
+ setShowConfirmDelete(!showConfirmDelete);
70
+ };
71
+
72
+ const title = formatMessage({
73
+ id: getTrad('plugin.name'),
74
+ defaultMessage: 'Documentation',
75
+ });
76
+
77
+ return (
78
+ <Layout>
79
+ <Helmet title={title} />
80
+ <Main aria-busy={isLoading}>
81
+ <HeaderLayout
82
+ title={title}
83
+ subtitle={formatMessage({
84
+ id: getTrad('pages.PluginPage.header.description'),
85
+ defaultMessage: 'Configure the documentation plugin',
86
+ })}
87
+ primaryAction={
88
+ // eslint-disable-next-line
89
+ <CheckPermissions permissions={permissions.open}>
90
+ <Button onClick={openDocVersion} startIcon={<Show />}>
91
+ {formatMessage({
92
+ id: getTrad('pages.PluginPage.Button.open'),
93
+ defaultMessage: 'Open Documentation',
94
+ })}
95
+ </Button>
96
+ </CheckPermissions>
97
+ }
98
+ />
99
+ <ContentLayout>
100
+ {isLoading && <LoadingIndicatorPage>Plugin is loading</LoadingIndicatorPage>}
101
+ {data?.docVersions.length ? (
102
+ <Table colCount={colCount} rowCount={rowCount}>
103
+ <Thead>
104
+ <Tr>
105
+ <Th>
106
+ <Typography variant="sigma" textColor="neutral600">
107
+ {formatMessage({
108
+ id: getTrad('pages.PluginPage.table.version'),
109
+ defaultMessage: 'Version',
110
+ })}
111
+ </Typography>
112
+ </Th>
113
+ <Th>
114
+ <Typography variant="sigma" textColor="neutral600">
115
+ {formatMessage({
116
+ id: getTrad('pages.PluginPage.table.generated'),
117
+ defaultMessage: 'Last Generated',
118
+ })}
119
+ </Typography>
120
+ </Th>
121
+ </Tr>
122
+ </Thead>
123
+ <Tbody>
124
+ {data.docVersions
125
+ .sort((a, b) => (a.generatedDate < b.generatedDate ? 1 : -1))
126
+ .map((doc) => (
127
+ <Tr key={doc.version}>
128
+ <Td width="50%">
129
+ <Typography>{doc.version}</Typography>
130
+ </Td>
131
+ <Td width="50%">
132
+ <Typography>{doc.generatedDate}</Typography>
133
+ </Td>
134
+ <Td>
135
+ <Flex justifyContent="end" {...stopPropagation}>
136
+ <IconButton
137
+ onClick={openDocVersion}
138
+ noBorder
139
+ icon={<Show />}
140
+ label={formatMessage(
141
+ {
142
+ id: getTrad('pages.PluginPage.table.icon.show'),
143
+ defaultMessage: 'Open {target}',
144
+ },
145
+ { target: `${doc.version}` }
146
+ )}
147
+ />
148
+ <CheckPermissions permissions={permissions.regenerate}>
149
+ <IconButton
150
+ onClick={() => handleRegenerateDoc(doc.version)}
151
+ noBorder
152
+ icon={<Reload />}
153
+ label={formatMessage(
154
+ {
155
+ id: getTrad('pages.PluginPage.table.icon.regenerate'),
156
+ defaultMessage: 'Regenerate {target}',
157
+ },
158
+ { target: `${doc.version}` }
159
+ )}
160
+ />
161
+ </CheckPermissions>
162
+ <CheckPermissions permissions={permissions.update}>
163
+ {doc.version !== data.currentVersion && (
164
+ <IconButton
165
+ onClick={() => handleClickDelete(doc.version)}
166
+ noBorder
167
+ icon={<Trash />}
168
+ label={formatMessage(
169
+ {
170
+ id: 'global.delete-target',
171
+ defaultMessage: 'Delete {target}',
172
+ },
173
+ { target: `${doc.version}` }
174
+ )}
175
+ />
176
+ )}
177
+ </CheckPermissions>
178
+ </Flex>
179
+ </Td>
180
+ </Tr>
181
+ ))}
182
+ </Tbody>
183
+ </Table>
184
+ ) : (
185
+ <EmptyStateLayout />
186
+ )}
187
+ </ContentLayout>
188
+ <ConfirmDialog
189
+ isConfirmButtonLoading={isConfirmButtonLoading}
190
+ onConfirm={handleConfirmDelete}
191
+ onToggleDialog={handleShowConfirmDelete}
192
+ isOpen={showConfirmDelete}
193
+ />
194
+ </Main>
195
+ </Layout>
196
+ );
197
+ };
198
+
199
+ export default PluginPage;