@strapi/plugin-documentation 5.0.0-alpha.2 → 5.0.0-alpha.4

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 (53) hide show
  1. package/admin/src/hooks/useDocumentation.js +3 -1
  2. package/admin/src/pages/PluginPage/index.jsx +1 -3
  3. package/admin/src/pages/PluginPage/tests/index.test.jsx +13 -58
  4. package/admin/src/pages/SettingsPage/index.jsx +1 -2
  5. package/admin/src/pages/SettingsPage/tests/index.test.jsx +5 -50
  6. package/dist/_chunks/index-8uT14PpA.mjs +161 -0
  7. package/dist/_chunks/index-8uT14PpA.mjs.map +1 -0
  8. package/dist/_chunks/{index-vkMtbOUa.mjs → index-BBeMFgXr.mjs} +7 -8
  9. package/dist/_chunks/{index-vkMtbOUa.mjs.map → index-BBeMFgXr.mjs.map} +1 -1
  10. package/dist/_chunks/{index-Qe1yXTJr.mjs → index-JNCjUbFJ.mjs} +4 -5
  11. package/dist/_chunks/index-JNCjUbFJ.mjs.map +1 -0
  12. package/dist/_chunks/index-K7c1R5xR.js +163 -0
  13. package/dist/_chunks/index-K7c1R5xR.js.map +1 -0
  14. package/dist/_chunks/{index-fMs5UEhq.js → index-cbKJtSsb.js} +9 -10
  15. package/dist/_chunks/{index-fMs5UEhq.js.map → index-cbKJtSsb.js.map} +1 -1
  16. package/dist/_chunks/{index-t0HziKWe.js → index-x6T2TAff.js} +9 -10
  17. package/dist/_chunks/index-x6T2TAff.js.map +1 -0
  18. package/dist/_chunks/{useDocumentation-xDcgWV5k.js → useDocumentation-0uMqNczK.js} +5 -5
  19. package/dist/_chunks/useDocumentation-0uMqNczK.js.map +1 -0
  20. package/dist/_chunks/{useDocumentation-6NfW7vH_.mjs → useDocumentation-PhZRkSFj.mjs} +3 -3
  21. package/dist/_chunks/useDocumentation-PhZRkSFj.mjs.map +1 -0
  22. package/dist/admin/index.js +1 -1
  23. package/dist/admin/index.mjs +1 -1
  24. package/package.json +5 -6
  25. package/dist/_chunks/EditViewPage-JFzIJClS-IWpUoy9m.js +0 -84410
  26. package/dist/_chunks/EditViewPage-JFzIJClS-IWpUoy9m.js.map +0 -1
  27. package/dist/_chunks/EditViewPage-JFzIJClS-wgqliPP3.mjs +0 -84382
  28. package/dist/_chunks/EditViewPage-JFzIJClS-wgqliPP3.mjs.map +0 -1
  29. package/dist/_chunks/ListViewPage-1VNVP9Rw-NpsAq5kD.js +0 -1617
  30. package/dist/_chunks/ListViewPage-1VNVP9Rw-NpsAq5kD.js.map +0 -1
  31. package/dist/_chunks/ListViewPage-1VNVP9Rw-pe2DvVcA.mjs +0 -1594
  32. package/dist/_chunks/ListViewPage-1VNVP9Rw-pe2DvVcA.mjs.map +0 -1
  33. package/dist/_chunks/ReviewWorkflowsColumn-sPZxvFUd-Tnpp_Ad0.mjs +0 -33
  34. package/dist/_chunks/ReviewWorkflowsColumn-sPZxvFUd-Tnpp_Ad0.mjs.map +0 -1
  35. package/dist/_chunks/ReviewWorkflowsColumn-sPZxvFUd-YJhb1Nw6.js +0 -33
  36. package/dist/_chunks/ReviewWorkflowsColumn-sPZxvFUd-YJhb1Nw6.js.map +0 -1
  37. package/dist/_chunks/constants-0OGkpIzK-bvNr9cfm.js +0 -209
  38. package/dist/_chunks/constants-0OGkpIzK-bvNr9cfm.js.map +0 -1
  39. package/dist/_chunks/constants-0OGkpIzK-fURlr3te.mjs +0 -190
  40. package/dist/_chunks/constants-0OGkpIzK-fURlr3te.mjs.map +0 -1
  41. package/dist/_chunks/index--h5HRJXN.mjs +0 -17909
  42. package/dist/_chunks/index--h5HRJXN.mjs.map +0 -1
  43. package/dist/_chunks/index-Qe1yXTJr.mjs.map +0 -1
  44. package/dist/_chunks/index-XxWFAaxW.js +0 -17934
  45. package/dist/_chunks/index-XxWFAaxW.js.map +0 -1
  46. package/dist/_chunks/index-t0HziKWe.js.map +0 -1
  47. package/dist/_chunks/useDocumentation-6NfW7vH_.mjs.map +0 -1
  48. package/dist/_chunks/useDocumentation-xDcgWV5k.js.map +0 -1
  49. package/dist/_chunks/useSyncRbac-JNQibLFa-qTsqKP_7.mjs +0 -39
  50. package/dist/_chunks/useSyncRbac-JNQibLFa-qTsqKP_7.mjs.map +0 -1
  51. package/dist/_chunks/useSyncRbac-JNQibLFa-xqTnRORv.js +0 -57
  52. package/dist/_chunks/useSyncRbac-JNQibLFa-xqTnRORv.js.map +0 -1
  53. package/dist/style.css +0 -84
@@ -27,7 +27,9 @@ export const useDocumentation = () => {
27
27
  if (isError && error) {
28
28
  toggleNotification({
29
29
  type: 'danger',
30
- message: error ? formatAPIError(error) : formatMessage({ id: 'notification.error' }),
30
+ message: error
31
+ ? formatAPIError(error)
32
+ : formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),
31
33
  });
32
34
  }
33
35
  }, [isError, error, toggleNotification, formatAPIError, formatMessage]);
@@ -1,6 +1,5 @@
1
1
  import React, { useState } from 'react';
2
2
 
3
- import { ConfirmDialog } from '@strapi/admin/strapi-admin';
4
3
  import {
5
4
  LinkButton,
6
5
  ContentLayout,
@@ -17,9 +16,8 @@ import {
17
16
  Typography,
18
17
  EmptyStateLayout,
19
18
  } from '@strapi/design-system';
20
- import { useRBAC } from '@strapi/helper-plugin';
21
19
  import { Eye as Show, Refresh as Reload, Trash } from '@strapi/icons';
22
- import { Page } from '@strapi/strapi/admin';
20
+ import { ConfirmDialog, useRBAC, Page } from '@strapi/strapi/admin';
23
21
  import { Helmet } from 'react-helmet';
24
22
  import { useIntl } from 'react-intl';
25
23
  import styled from 'styled-components';
@@ -1,59 +1,14 @@
1
1
  import React from 'react';
2
2
 
3
- import { fixtures } from '@strapi/admin-test-utils';
4
- import { lightTheme, ThemeProvider } from '@strapi/design-system';
5
- import { RBACContext } from '@strapi/helper-plugin';
6
- import { NotificationsProvider } from '@strapi/strapi/admin';
7
- import { render as renderRTL, waitFor } from '@testing-library/react';
8
- import userEvent from '@testing-library/user-event';
9
- import { IntlProvider } from 'react-intl';
10
- import { QueryClient, QueryClientProvider } from 'react-query';
11
- import { MemoryRouter } from 'react-router-dom';
3
+ import { render, waitFor } from '@strapi/strapi/admin/test';
12
4
 
13
5
  import PluginPage from '../index';
14
6
 
15
- const render = ({ permissions } = { permissions: fixtures.permissions.allPermissions }) => ({
16
- ...renderRTL(<PluginPage />, {
17
- wrapper({ children }) {
18
- const client = new QueryClient({
19
- defaultOptions: {
20
- queries: {
21
- retry: false,
22
- },
23
- },
24
- });
25
-
26
- // eslint-disable-next-line react-hooks/rules-of-hooks
27
- const rbacContextValue = React.useMemo(
28
- () => ({
29
- allPermissions: permissions,
30
- }),
31
- []
32
- );
33
-
34
- return (
35
- <MemoryRouter>
36
- <ThemeProvider theme={lightTheme}>
37
- <QueryClientProvider client={client}>
38
- <IntlProvider locale="en" messages={{}} textComponent="span">
39
- <NotificationsProvider>
40
- <RBACContext.Provider value={rbacContextValue}>{children}</RBACContext.Provider>
41
- </NotificationsProvider>
42
- </IntlProvider>
43
- </QueryClientProvider>
44
- </ThemeProvider>
45
- </MemoryRouter>
46
- );
47
- },
48
- }),
49
- user: userEvent.setup(),
50
- });
51
-
52
7
  const versions = ['2.0.0', '1.2.0', '1.0.0'];
53
8
 
54
9
  describe('PluginPage', () => {
55
10
  it('render the plugin page correctly', async () => {
56
- const { getByRole, queryByText, getByText } = render();
11
+ const { getByRole, queryByText, getByText } = render(<PluginPage />);
57
12
 
58
13
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
59
14
 
@@ -88,7 +43,7 @@ describe('PluginPage', () => {
88
43
 
89
44
  describe('actions', () => {
90
45
  it('should open the documentation', async () => {
91
- const { getByRole, queryByText, user } = render();
46
+ const { getByRole, queryByText, user } = render(<PluginPage />);
92
47
 
93
48
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
94
49
 
@@ -108,7 +63,7 @@ describe('PluginPage', () => {
108
63
  });
109
64
 
110
65
  it('should regenerate the documentation', async () => {
111
- const { getByRole, queryByText, user, getByText } = render();
66
+ const { getByRole, queryByText, user, getByText } = render(<PluginPage />);
112
67
 
113
68
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
114
69
 
@@ -120,7 +75,7 @@ describe('PluginPage', () => {
120
75
  });
121
76
 
122
77
  it('should delete the documentation', async () => {
123
- const { getByRole, queryByText, user, getByText } = render();
78
+ const { getByRole, queryByText, user, getByText } = render(<PluginPage />);
124
79
 
125
80
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
126
81
 
@@ -140,8 +95,8 @@ describe('PluginPage', () => {
140
95
 
141
96
  describe('permissions', () => {
142
97
  it("should always disable the 'Open Documentation' link if the user cannot open", async () => {
143
- const { getByRole, queryByText } = render({
144
- permissions: [],
98
+ const { getByRole, queryByText } = render(<PluginPage />, {
99
+ providerOptions: { permissions: () => [] },
145
100
  });
146
101
 
147
102
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
@@ -158,8 +113,8 @@ describe('PluginPage', () => {
158
113
  });
159
114
 
160
115
  it('should disabled the open documentation version link in the table if the user cannot open', async () => {
161
- const { getByRole, queryByText } = render({
162
- permissions: [],
116
+ const { getByRole, queryByText } = render(<PluginPage />, {
117
+ providerOptions: { permissions: () => [] },
163
118
  });
164
119
 
165
120
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
@@ -175,8 +130,8 @@ describe('PluginPage', () => {
175
130
  });
176
131
 
177
132
  it('should not render the regenerate buttons if the user cannot regenerate', async () => {
178
- const { queryByRole, getByRole, queryByText } = render({
179
- permissions: [],
133
+ const { queryByRole, getByRole, queryByText } = render(<PluginPage />, {
134
+ providerOptions: { permissions: () => [] },
180
135
  });
181
136
 
182
137
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
@@ -189,8 +144,8 @@ describe('PluginPage', () => {
189
144
  });
190
145
 
191
146
  it('should not render the delete buttons if the user cannot delete', async () => {
192
- const { queryByRole, getByRole, queryByText } = render({
193
- permissions: [],
147
+ const { queryByRole, getByRole, queryByText } = render(<PluginPage />, {
148
+ providerOptions: { permissions: () => [] },
194
149
  });
195
150
 
196
151
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
@@ -13,9 +13,8 @@ import {
13
13
  Typography,
14
14
  FieldAction,
15
15
  } from '@strapi/design-system';
16
- import { useRBAC } from '@strapi/helper-plugin';
17
16
  import { Check, Eye as Show, EyeStriked as Hide } from '@strapi/icons';
18
- import { translatedErrors, Page } from '@strapi/strapi/admin';
17
+ import { translatedErrors, Page, useRBAC } from '@strapi/strapi/admin';
19
18
  import { Form, Formik } from 'formik';
20
19
  import { useIntl } from 'react-intl';
21
20
  import styled from 'styled-components';
@@ -1,59 +1,14 @@
1
1
  import React from 'react';
2
2
 
3
- import { fixtures } from '@strapi/admin-test-utils';
4
- import { lightTheme, ThemeProvider } from '@strapi/design-system';
5
- import { RBACContext } from '@strapi/helper-plugin';
6
- import { NotificationsProvider } from '@strapi/strapi/admin';
7
- import { fireEvent, render as renderRTL, waitFor } from '@testing-library/react';
8
- import userEvent from '@testing-library/user-event';
3
+ import { fireEvent, render, waitFor } from '@strapi/strapi/admin/test';
9
4
  import { rest } from 'msw';
10
- import { IntlProvider } from 'react-intl';
11
- import { QueryClient, QueryClientProvider } from 'react-query';
12
- import { MemoryRouter } from 'react-router-dom';
13
5
 
14
6
  import { server } from '../../../../../tests/server';
15
7
  import SettingsPage from '../index';
16
8
 
17
- const render = ({ permissions } = { permissions: fixtures.permissions.allPermissions }) => ({
18
- ...renderRTL(<SettingsPage />, {
19
- wrapper({ children }) {
20
- const client = new QueryClient({
21
- defaultOptions: {
22
- queries: {
23
- retry: false,
24
- },
25
- },
26
- });
27
-
28
- // eslint-disable-next-line react-hooks/rules-of-hooks
29
- const rbacContextValue = React.useMemo(
30
- () => ({
31
- allPermissions: permissions,
32
- }),
33
- []
34
- );
35
-
36
- return (
37
- <MemoryRouter>
38
- <ThemeProvider theme={lightTheme}>
39
- <QueryClientProvider client={client}>
40
- <IntlProvider locale="en" messages={{}} textComponent="span">
41
- <NotificationsProvider>
42
- <RBACContext.Provider value={rbacContextValue}>{children}</RBACContext.Provider>
43
- </NotificationsProvider>
44
- </IntlProvider>
45
- </QueryClientProvider>
46
- </ThemeProvider>
47
- </MemoryRouter>
48
- );
49
- },
50
- }),
51
- user: userEvent.setup(),
52
- });
53
-
54
9
  describe('SettingsPage', () => {
55
10
  it('renders the setting page correctly', async () => {
56
- const { getByRole, queryByText, getByText } = render();
11
+ const { getByRole, queryByText, getByText } = render(<SettingsPage />);
57
12
 
58
13
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
59
14
 
@@ -78,7 +33,7 @@ describe('SettingsPage', () => {
78
33
  })
79
34
  );
80
35
 
81
- const { getByLabelText, queryByText } = render();
36
+ const { getByLabelText, queryByText } = render(<SettingsPage />);
82
37
 
83
38
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
84
39
 
@@ -88,7 +43,7 @@ describe('SettingsPage', () => {
88
43
  });
89
44
 
90
45
  it('should render the password field when the Restricted Access checkbox is checked', async () => {
91
- const { getByRole, getByLabelText, queryByText } = render();
46
+ const { getByRole, getByLabelText, queryByText } = render(<SettingsPage />);
92
47
 
93
48
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
94
49
 
@@ -100,7 +55,7 @@ describe('SettingsPage', () => {
100
55
  });
101
56
 
102
57
  it('should allow me to type a password and save that settings change successfully', async () => {
103
- const { getByRole, getByLabelText, queryByText, user, getByText } = render();
58
+ const { getByRole, getByLabelText, queryByText, user, getByText } = render(<SettingsPage />);
104
59
 
105
60
  await waitFor(() => expect(queryByText('Loading content.')).not.toBeInTheDocument());
106
61
 
@@ -0,0 +1,161 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Layout, HeaderLayout, ContentLayout, Table, Thead, Tr, Th, Typography, Tbody, Td, Flex, IconButton, EmptyStateLayout, LinkButton } from "@strapi/design-system";
4
+ import { Eye, Refresh, Trash } from "@strapi/icons";
5
+ import { useRBAC, Page, ConfirmDialog } from "@strapi/strapi/admin";
6
+ import { Helmet } from "react-helmet";
7
+ import { useIntl } from "react-intl";
8
+ import styled from "styled-components";
9
+ import { P as PERMISSIONS } from "./index-BBeMFgXr.mjs";
10
+ import { u as useDocumentation, g as getTrad } from "./useDocumentation-PhZRkSFj.mjs";
11
+ const PluginPage = () => {
12
+ const { formatMessage } = useIntl();
13
+ const { data, isLoading, isError, remove, regenerate } = useDocumentation();
14
+ const [showConfirmDelete, setShowConfirmDelete] = useState(false);
15
+ const [versionToDelete, setVersionToDelete] = useState();
16
+ const { allowedActions } = useRBAC(PERMISSIONS);
17
+ const colCount = 4;
18
+ const rowCount = (data?.docVersions?.length || 0) + 1;
19
+ const handleRegenerateDoc = (version) => {
20
+ regenerate.mutate({ version, prefix: data?.prefix });
21
+ };
22
+ const handleShowConfirmDelete = () => {
23
+ setShowConfirmDelete(!showConfirmDelete);
24
+ };
25
+ const handleConfirmDelete = async () => {
26
+ await remove.mutateAsync({ prefix: data?.prefix, version: versionToDelete });
27
+ setShowConfirmDelete(!showConfirmDelete);
28
+ };
29
+ const handleClickDelete = (version) => {
30
+ setVersionToDelete(version);
31
+ setShowConfirmDelete(!showConfirmDelete);
32
+ };
33
+ const title = formatMessage({
34
+ id: getTrad("plugin.name"),
35
+ defaultMessage: "Documentation"
36
+ });
37
+ if (isLoading) {
38
+ return /* @__PURE__ */ jsx(Page.Loading, {});
39
+ }
40
+ if (isError) {
41
+ return /* @__PURE__ */ jsx(Page.Error, {});
42
+ }
43
+ return /* @__PURE__ */ jsxs(Layout, { children: [
44
+ /* @__PURE__ */ jsx(Helmet, { title }),
45
+ /* @__PURE__ */ jsxs(Page.Main, { children: [
46
+ /* @__PURE__ */ jsx(
47
+ HeaderLayout,
48
+ {
49
+ title,
50
+ subtitle: formatMessage({
51
+ id: getTrad("pages.PluginPage.header.description"),
52
+ defaultMessage: "Configure the documentation plugin"
53
+ }),
54
+ primaryAction: /* @__PURE__ */ jsx(
55
+ OpenDocLink,
56
+ {
57
+ disabled: !allowedActions.canOpen || !data?.currentVersion || !data?.prefix,
58
+ href: createDocumentationHref(`${data?.prefix}/v${data?.currentVersion}`),
59
+ startIcon: /* @__PURE__ */ jsx(Eye, {}),
60
+ children: formatMessage({
61
+ id: getTrad("pages.PluginPage.Button.open"),
62
+ defaultMessage: "Open Documentation"
63
+ })
64
+ }
65
+ )
66
+ }
67
+ ),
68
+ /* @__PURE__ */ jsx(ContentLayout, { children: data?.docVersions.length ? /* @__PURE__ */ jsxs(Table, { colCount, rowCount, children: [
69
+ /* @__PURE__ */ jsx(Thead, { children: /* @__PURE__ */ jsxs(Tr, { children: [
70
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", children: formatMessage({
71
+ id: getTrad("pages.PluginPage.table.version"),
72
+ defaultMessage: "Version"
73
+ }) }) }),
74
+ /* @__PURE__ */ jsx(Th, { children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", textColor: "neutral600", children: formatMessage({
75
+ id: getTrad("pages.PluginPage.table.generated"),
76
+ defaultMessage: "Last Generated"
77
+ }) }) })
78
+ ] }) }),
79
+ /* @__PURE__ */ jsx(Tbody, { children: data.docVersions.sort((a, b) => a.generatedDate < b.generatedDate ? 1 : -1).map((doc) => /* @__PURE__ */ jsxs(Tr, { children: [
80
+ /* @__PURE__ */ jsx(Td, { width: "50%", children: /* @__PURE__ */ jsx(Typography, { children: doc.version }) }),
81
+ /* @__PURE__ */ jsx(Td, { width: "50%", children: /* @__PURE__ */ jsx(Typography, { children: doc.generatedDate }) }),
82
+ /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsxs(Flex, { justifyContent: "end", onClick: (e) => e.stopPropagation(), children: [
83
+ /* @__PURE__ */ jsx(
84
+ IconButton,
85
+ {
86
+ forwardedAs: "a",
87
+ disabled: !allowedActions.canOpen,
88
+ href: createDocumentationHref(`${data.prefix}/v${doc.version}`),
89
+ noBorder: true,
90
+ icon: /* @__PURE__ */ jsx(Eye, {}),
91
+ target: "_blank",
92
+ rel: "noopener noreferrer",
93
+ label: formatMessage(
94
+ {
95
+ id: getTrad("pages.PluginPage.table.icon.show"),
96
+ defaultMessage: "Open {target}"
97
+ },
98
+ { target: `${doc.version}` }
99
+ )
100
+ }
101
+ ),
102
+ allowedActions.canRegenerate ? /* @__PURE__ */ jsx(
103
+ IconButton,
104
+ {
105
+ onClick: () => handleRegenerateDoc(doc.version),
106
+ noBorder: true,
107
+ icon: /* @__PURE__ */ jsx(Refresh, {}),
108
+ label: formatMessage(
109
+ {
110
+ id: getTrad("pages.PluginPage.table.icon.regenerate"),
111
+ defaultMessage: "Regenerate {target}"
112
+ },
113
+ { target: `${doc.version}` }
114
+ )
115
+ }
116
+ ) : null,
117
+ allowedActions.canUpdate && doc.version !== data.currentVersion ? /* @__PURE__ */ jsx(
118
+ IconButton,
119
+ {
120
+ onClick: () => handleClickDelete(doc.version),
121
+ noBorder: true,
122
+ icon: /* @__PURE__ */ jsx(Trash, {}),
123
+ label: formatMessage(
124
+ {
125
+ id: "global.delete-target",
126
+ defaultMessage: "Delete {target}"
127
+ },
128
+ { target: `${doc.version}` }
129
+ )
130
+ }
131
+ ) : null
132
+ ] }) })
133
+ ] }, doc.version)) })
134
+ ] }) : /* @__PURE__ */ jsx(EmptyStateLayout, {}) }),
135
+ /* @__PURE__ */ jsx(
136
+ ConfirmDialog,
137
+ {
138
+ onConfirm: handleConfirmDelete,
139
+ onClose: handleShowConfirmDelete,
140
+ isOpen: showConfirmDelete
141
+ }
142
+ )
143
+ ] })
144
+ ] });
145
+ };
146
+ const OpenDocLink = styled(LinkButton)`
147
+ text-decoration: none;
148
+ `;
149
+ const createDocumentationHref = (path) => {
150
+ if (path.startsWith("http")) {
151
+ return path;
152
+ }
153
+ if (path.startsWith("/")) {
154
+ return `${window.strapi.backendURL}${path}`;
155
+ }
156
+ return `${window.strapi.backendURL}/${path}`;
157
+ };
158
+ export {
159
+ PluginPage as default
160
+ };
161
+ //# sourceMappingURL=index-8uT14PpA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-8uT14PpA.mjs","sources":["../../admin/src/pages/PluginPage/index.jsx"],"sourcesContent":["import React, { useState } from 'react';\n\nimport {\n LinkButton,\n ContentLayout,\n Flex,\n HeaderLayout,\n IconButton,\n Layout,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n EmptyStateLayout,\n} from '@strapi/design-system';\nimport { Eye as Show, Refresh as Reload, Trash } from '@strapi/icons';\nimport { ConfirmDialog, useRBAC, Page } from '@strapi/strapi/admin';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { PERMISSIONS } from '../../constants';\nimport { useDocumentation } from '../../hooks/useDocumentation';\nimport { getTrad } from '../../utils';\n\nconst PluginPage = () => {\n const { formatMessage } = useIntl();\n const { data, isLoading, isError, remove, regenerate } = useDocumentation();\n const [showConfirmDelete, setShowConfirmDelete] = useState(false);\n const [versionToDelete, setVersionToDelete] = useState();\n const { allowedActions } = useRBAC(PERMISSIONS);\n\n const colCount = 4;\n const rowCount = (data?.docVersions?.length || 0) + 1;\n\n const handleRegenerateDoc = (version) => {\n regenerate.mutate({ version, prefix: data?.prefix });\n };\n\n const handleShowConfirmDelete = () => {\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleConfirmDelete = async () => {\n await remove.mutateAsync({ prefix: data?.prefix, version: versionToDelete });\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const handleClickDelete = (version) => {\n setVersionToDelete(version);\n setShowConfirmDelete(!showConfirmDelete);\n };\n\n const title = formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n });\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (isError) {\n return <Page.Error />;\n }\n\n return (\n <Layout>\n <Helmet title={title} />\n <Page.Main>\n <HeaderLayout\n title={title}\n subtitle={formatMessage({\n id: getTrad('pages.PluginPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <OpenDocLink\n disabled={!allowedActions.canOpen || !data?.currentVersion || !data?.prefix}\n href={createDocumentationHref(`${data?.prefix}/v${data?.currentVersion}`)}\n startIcon={<Show />}\n >\n {formatMessage({\n id: getTrad('pages.PluginPage.Button.open'),\n defaultMessage: 'Open Documentation',\n })}\n </OpenDocLink>\n }\n />\n <ContentLayout>\n {data?.docVersions.length ? (\n <Table colCount={colCount} rowCount={rowCount}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.version'),\n defaultMessage: 'Version',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('pages.PluginPage.table.generated'),\n defaultMessage: 'Last Generated',\n })}\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {data.docVersions\n .sort((a, b) => (a.generatedDate < b.generatedDate ? 1 : -1))\n .map((doc) => (\n <Tr key={doc.version}>\n <Td width=\"50%\">\n <Typography>{doc.version}</Typography>\n </Td>\n <Td width=\"50%\">\n <Typography>{doc.generatedDate}</Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" onClick={(e) => e.stopPropagation()}>\n <IconButton\n forwardedAs=\"a\"\n disabled={!allowedActions.canOpen}\n href={createDocumentationHref(`${data.prefix}/v${doc.version}`)}\n noBorder\n icon={<Show />}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.show'),\n defaultMessage: 'Open {target}',\n },\n { target: `${doc.version}` }\n )}\n />\n {allowedActions.canRegenerate ? (\n <IconButton\n onClick={() => handleRegenerateDoc(doc.version)}\n noBorder\n icon={<Reload />}\n label={formatMessage(\n {\n id: getTrad('pages.PluginPage.table.icon.regenerate'),\n defaultMessage: 'Regenerate {target}',\n },\n { target: `${doc.version}` }\n )}\n />\n ) : null}\n {allowedActions.canUpdate && doc.version !== data.currentVersion ? (\n <IconButton\n onClick={() => handleClickDelete(doc.version)}\n noBorder\n icon={<Trash />}\n label={formatMessage(\n {\n id: 'global.delete-target',\n defaultMessage: 'Delete {target}',\n },\n { target: `${doc.version}` }\n )}\n />\n ) : null}\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n ) : (\n <EmptyStateLayout />\n )}\n </ContentLayout>\n <ConfirmDialog\n onConfirm={handleConfirmDelete}\n onClose={handleShowConfirmDelete}\n isOpen={showConfirmDelete}\n />\n </Page.Main>\n </Layout>\n );\n};\n\n/**\n * TODO: should this be fixed in the DS?\n */\nconst OpenDocLink = styled(LinkButton)`\n text-decoration: none;\n`;\n\nconst createDocumentationHref = (path) => {\n if (path.startsWith('http')) {\n return path;\n }\n\n if (path.startsWith('/')) {\n return `${window.strapi.backendURL}${path}`;\n }\n\n return `${window.strapi.backendURL}/${path}`;\n};\n\nexport default PluginPage;\n"],"names":["Show","Reload"],"mappings":";;;;;;;;;;AA4BA,MAAM,aAAa,MAAM;AACjB,QAAA,EAAE,kBAAkB;AAC1B,QAAM,EAAE,MAAM,WAAW,SAAS,QAAQ,WAAA,IAAe;AACzD,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,KAAK;AAChE,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS;AACvD,QAAM,EAAE,eAAA,IAAmB,QAAQ,WAAW;AAE9C,QAAM,WAAW;AACjB,QAAM,YAAY,MAAM,aAAa,UAAU,KAAK;AAE9C,QAAA,sBAAsB,CAAC,YAAY;AACvC,eAAW,OAAO,EAAE,SAAS,QAAQ,MAAM,QAAQ;AAAA,EAAA;AAGrD,QAAM,0BAA0B,MAAM;AACpC,yBAAqB,CAAC,iBAAiB;AAAA,EAAA;AAGzC,QAAM,sBAAsB,YAAY;AAChC,UAAA,OAAO,YAAY,EAAE,QAAQ,MAAM,QAAQ,SAAS,iBAAiB;AAC3E,yBAAqB,CAAC,iBAAiB;AAAA,EAAA;AAGnC,QAAA,oBAAoB,CAAC,YAAY;AACrC,uBAAmB,OAAO;AAC1B,yBAAqB,CAAC,iBAAiB;AAAA,EAAA;AAGzC,QAAM,QAAQ,cAAc;AAAA,IAC1B,IAAI,QAAQ,aAAa;AAAA,IACzB,gBAAgB;AAAA,EAAA,CACjB;AAED,MAAI,WAAW;AACN,WAAA,oBAAC,KAAK,SAAL,CAAa,CAAA;AAAA,EACvB;AAEA,MAAI,SAAS;AACJ,WAAA,oBAAC,KAAK,OAAL,CAAW,CAAA;AAAA,EACrB;AAEA,8BACG,QACC,EAAA,UAAA;AAAA,IAAA,oBAAC,UAAO,OAAc;AAAA,IACtB,qBAAC,KAAK,MAAL,EACC,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC;AAAA,UACA,UAAU,cAAc;AAAA,YACtB,IAAI,QAAQ,qCAAqC;AAAA,YACjD,gBAAgB;AAAA,UAAA,CACjB;AAAA,UACD,eACE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,UAAU,CAAC,eAAe,WAAW,CAAC,MAAM,kBAAkB,CAAC,MAAM;AAAA,cACrE,MAAM,wBAAwB,GAAG,MAAM,MAAM,KAAK,MAAM,cAAc,EAAE;AAAA,cACxE,+BAAYA,KAAK,EAAA;AAAA,cAEhB,UAAc,cAAA;AAAA,gBACb,IAAI,QAAQ,8BAA8B;AAAA,gBAC1C,gBAAgB;AAAA,cAAA,CACjB;AAAA,YAAA;AAAA,UACH;AAAA,QAAA;AAAA,MAEJ;AAAA,MACA,oBAAC,iBACE,UAAM,MAAA,YAAY,SAChB,qBAAA,OAAA,EAAM,UAAoB,UACzB,UAAA;AAAA,QAAC,oBAAA,OAAA,EACC,+BAAC,IACC,EAAA,UAAA;AAAA,UAAA,oBAAC,MACC,UAAC,oBAAA,YAAA,EAAW,SAAQ,SAAQ,WAAU,cACnC,UAAc,cAAA;AAAA,YACb,IAAI,QAAQ,gCAAgC;AAAA,YAC5C,gBAAgB;AAAA,UAAA,CACjB,GACH,EACF,CAAA;AAAA,UACA,oBAAC,MACC,UAAC,oBAAA,YAAA,EAAW,SAAQ,SAAQ,WAAU,cACnC,UAAc,cAAA;AAAA,YACb,IAAI,QAAQ,kCAAkC;AAAA,YAC9C,gBAAgB;AAAA,UAAA,CACjB,GACH,EACF,CAAA;AAAA,QAAA,EAAA,CACF,EACF,CAAA;AAAA,4BACC,OACE,EAAA,UAAA,KAAK,YACH,KAAK,CAAC,GAAG,MAAO,EAAE,gBAAgB,EAAE,gBAAgB,IAAI,EAAG,EAC3D,IAAI,CAAC,6BACH,IACC,EAAA,UAAA;AAAA,UAAA,oBAAC,MAAG,OAAM,OACR,8BAAC,YAAY,EAAA,UAAA,IAAI,SAAQ,EAC3B,CAAA;AAAA,UACA,oBAAC,MAAG,OAAM,OACR,8BAAC,YAAY,EAAA,UAAA,IAAI,eAAc,EACjC,CAAA;AAAA,UACA,oBAAC,IACC,EAAA,UAAA,qBAAC,MAAK,EAAA,gBAAe,OAAM,SAAS,CAAC,MAAM,EAAE,gBAAA,GAC3C,UAAA;AAAA,YAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,aAAY;AAAA,gBACZ,UAAU,CAAC,eAAe;AAAA,gBAC1B,MAAM,wBAAwB,GAAG,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAAA,gBAC9D,UAAQ;AAAA,gBACR,0BAAOA,KAAK,EAAA;AAAA,gBACZ,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,OAAO;AAAA,kBACL;AAAA,oBACE,IAAI,QAAQ,kCAAkC;AAAA,oBAC9C,gBAAgB;AAAA,kBAClB;AAAA,kBACA,EAAE,QAAQ,GAAG,IAAI,OAAO,GAAG;AAAA,gBAC7B;AAAA,cAAA;AAAA,YACF;AAAA,YACC,eAAe,gBACd;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM,oBAAoB,IAAI,OAAO;AAAA,gBAC9C,UAAQ;AAAA,gBACR,0BAAOC,SAAO,EAAA;AAAA,gBACd,OAAO;AAAA,kBACL;AAAA,oBACE,IAAI,QAAQ,wCAAwC;AAAA,oBACpD,gBAAgB;AAAA,kBAClB;AAAA,kBACA,EAAE,QAAQ,GAAG,IAAI,OAAO,GAAG;AAAA,gBAC7B;AAAA,cAAA;AAAA,YAAA,IAEA;AAAA,YACH,eAAe,aAAa,IAAI,YAAY,KAAK,iBAChD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM,kBAAkB,IAAI,OAAO;AAAA,gBAC5C,UAAQ;AAAA,gBACR,0BAAO,OAAM,EAAA;AAAA,gBACb,OAAO;AAAA,kBACL;AAAA,oBACE,IAAI;AAAA,oBACJ,gBAAgB;AAAA,kBAClB;AAAA,kBACA,EAAE,QAAQ,GAAG,IAAI,OAAO,GAAG;AAAA,gBAC7B;AAAA,cAAA;AAAA,YAAA,IAEA;AAAA,UAAA,EAAA,CACN,EACF,CAAA;AAAA,QAtDO,EAAA,GAAA,IAAI,OAuDb,CACD,GACL;AAAA,MACF,EAAA,CAAA,IAEC,oBAAA,kBAAA,CAAA,CAAiB,EAEtB,CAAA;AAAA,MACA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,UACX,SAAS;AAAA,UACT,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,IAAA,GACF;AAAA,EACF,EAAA,CAAA;AAEJ;AAKA,MAAM,cAAc,OAAO,UAAU;AAAA;AAAA;AAIrC,MAAM,0BAA0B,CAAC,SAAS;AACpC,MAAA,KAAK,WAAW,MAAM,GAAG;AACpB,WAAA;AAAA,EACT;AAEI,MAAA,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,GAAG,OAAO,OAAO,UAAU,GAAG,IAAI;AAAA,EAC3C;AAEA,SAAO,GAAG,OAAO,OAAO,UAAU,IAAI,IAAI;AAC5C;"}
@@ -9,7 +9,7 @@ const __variableDynamicImportRuntimeHelper = (glob, path) => {
9
9
  });
10
10
  };
11
11
  const name$1 = "@strapi/plugin-documentation";
12
- const version = "5.0.0-alpha.1";
12
+ const version = "5.0.0-alpha.3";
13
13
  const description = "Create an OpenAPI Document and visualize your API with SWAGGER UI.";
14
14
  const repository = {
15
15
  type: "git",
@@ -55,9 +55,8 @@ const scripts = {
55
55
  };
56
56
  const dependencies = {
57
57
  "@strapi/design-system": "1.16.0",
58
- "@strapi/helper-plugin": "5.0.0-alpha.1",
59
58
  "@strapi/icons": "1.16.0",
60
- "@strapi/utils": "5.0.0-alpha.1",
59
+ "@strapi/utils": "5.0.0-alpha.3",
61
60
  bcryptjs: "2.4.3",
62
61
  cheerio: "^1.0.0-rc.12",
63
62
  formik: "2.4.5",
@@ -75,8 +74,8 @@ const dependencies = {
75
74
  };
76
75
  const devDependencies = {
77
76
  "@apidevtools/swagger-parser": "^10.1.0",
78
- "@strapi/pack-up": "5.0.0-alpha.1",
79
- "@strapi/strapi": "5.0.0-alpha.1",
77
+ "@strapi/pack-up": "5.0.0-alpha.3",
78
+ "@strapi/strapi": "5.0.0-alpha.3",
80
79
  "@testing-library/react": "14.0.0",
81
80
  "@testing-library/user-event": "14.4.3",
82
81
  msw: "1.3.0",
@@ -156,7 +155,7 @@ const index = {
156
155
  defaultMessage: "Documentation"
157
156
  },
158
157
  permissions: PERMISSIONS.main,
159
- Component: () => import("./index--h5HRJXN.mjs").then((n) => n.aq)
158
+ Component: () => import("./index-8uT14PpA.mjs")
160
159
  });
161
160
  app.registerPlugin({
162
161
  id: pluginId,
@@ -171,7 +170,7 @@ const index = {
171
170
  },
172
171
  id: "documentation",
173
172
  to: pluginId,
174
- Component: () => import("./index-Qe1yXTJr.mjs"),
173
+ Component: () => import("./index-JNCjUbFJ.mjs"),
175
174
  permissions: PERMISSIONS.main
176
175
  });
177
176
  },
@@ -199,4 +198,4 @@ export {
199
198
  index as i,
200
199
  pluginId as p
201
200
  };
202
- //# sourceMappingURL=index-vkMtbOUa.mjs.map
201
+ //# sourceMappingURL=index-BBeMFgXr.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-vkMtbOUa.mjs","sources":["../../admin/src/constants.js","../../admin/src/pluginId.js","../../admin/src/utils/prefixPluginTranslations.js","../../admin/src/index.js"],"sourcesContent":["export const PERMISSIONS = {\n // This permission regards the main component (App) and is used to tell\n // If the plugin link should be displayed in the menu\n // And also if the plugin is accessible. This use case is found when a user types the url of the\n // plugin directly in the browser\n main: [\n { action: 'plugin::documentation.read', subject: null },\n { action: 'plugin::documentation.settings.regenerate', subject: null },\n { action: 'plugin::documentation.settings.update', subject: null },\n ],\n open: [\n { action: 'plugin::documentation.read', subject: null },\n { action: 'plugin::documentation.settings.regenerate', subject: null },\n ],\n regenerate: [{ action: 'plugin::documentation.settings.regenerate', subject: null }],\n update: [{ action: 'plugin::documentation.settings.update', subject: null }],\n};\n","import pluginPkg from '../../package.json';\n\nconst pluginId = pluginPkg.name.replace(/^@strapi\\/plugin-/i, '');\n\nexport default pluginId;\n","const prefixPluginTranslations = (trad, pluginId) => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n\n return Object.keys(trad).reduce((acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n\n return acc;\n }, {});\n};\n\nexport { prefixPluginTranslations };\n","import { Information } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { PERMISSIONS } from './constants';\nimport pluginId from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\nconst name = pluginPkg.strapi.name;\n\nexport default {\n register(app) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Information,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n permissions: PERMISSIONS.main,\n Component: () => import('./pages/PluginPage'),\n });\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n bootstrap(app) {\n app.addSettingsLink('global', {\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n id: 'documentation',\n to: pluginId,\n Component: () => import('./pages/SettingsPage'),\n permissions: PERMISSIONS.main,\n });\n },\n async registerTrads({ locales }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["pluginId"],"mappings":"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"}
1
+ {"version":3,"file":"index-BBeMFgXr.mjs","sources":["../../admin/src/constants.js","../../admin/src/pluginId.js","../../admin/src/utils/prefixPluginTranslations.js","../../admin/src/index.js"],"sourcesContent":["export const PERMISSIONS = {\n // This permission regards the main component (App) and is used to tell\n // If the plugin link should be displayed in the menu\n // And also if the plugin is accessible. This use case is found when a user types the url of the\n // plugin directly in the browser\n main: [\n { action: 'plugin::documentation.read', subject: null },\n { action: 'plugin::documentation.settings.regenerate', subject: null },\n { action: 'plugin::documentation.settings.update', subject: null },\n ],\n open: [\n { action: 'plugin::documentation.read', subject: null },\n { action: 'plugin::documentation.settings.regenerate', subject: null },\n ],\n regenerate: [{ action: 'plugin::documentation.settings.regenerate', subject: null }],\n update: [{ action: 'plugin::documentation.settings.update', subject: null }],\n};\n","import pluginPkg from '../../package.json';\n\nconst pluginId = pluginPkg.name.replace(/^@strapi\\/plugin-/i, '');\n\nexport default pluginId;\n","const prefixPluginTranslations = (trad, pluginId) => {\n if (!pluginId) {\n throw new TypeError(\"pluginId can't be empty\");\n }\n\n return Object.keys(trad).reduce((acc, current) => {\n acc[`${pluginId}.${current}`] = trad[current];\n\n return acc;\n }, {});\n};\n\nexport { prefixPluginTranslations };\n","import { Information } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { PERMISSIONS } from './constants';\nimport pluginId from './pluginId';\nimport { prefixPluginTranslations } from './utils/prefixPluginTranslations';\n\nconst name = pluginPkg.strapi.name;\n\nexport default {\n register(app) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Information,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n permissions: PERMISSIONS.main,\n Component: () => import('./pages/PluginPage'),\n });\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n bootstrap(app) {\n app.addSettingsLink('global', {\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Documentation',\n },\n id: 'documentation',\n to: pluginId,\n Component: () => import('./pages/SettingsPage'),\n permissions: PERMISSIONS.main,\n });\n },\n async registerTrads({ locales }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n"],"names":["pluginId"],"mappings":"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"}
@@ -1,15 +1,14 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useState } from "react";
3
3
  import { HeaderLayout, Button, ContentLayout, Box, Flex, Typography, Grid, GridItem, ToggleInput, TextInput, FieldAction } from "@strapi/design-system";
4
- import { useRBAC } from "@strapi/helper-plugin";
5
4
  import { Check, Eye, EyeStriked } from "@strapi/icons";
6
- import { translatedErrors, Page } from "@strapi/strapi/admin";
5
+ import { translatedErrors, useRBAC, Page } from "@strapi/strapi/admin";
7
6
  import { Formik, Form } from "formik";
8
7
  import { useIntl } from "react-intl";
9
8
  import styled from "styled-components";
10
9
  import * as yup from "yup";
11
- import { P as PERMISSIONS } from "./index-vkMtbOUa.mjs";
12
- import { u as useDocumentation, g as getTrad } from "./useDocumentation-6NfW7vH_.mjs";
10
+ import { P as PERMISSIONS } from "./index-BBeMFgXr.mjs";
11
+ import { u as useDocumentation, g as getTrad } from "./useDocumentation-PhZRkSFj.mjs";
13
12
  const schema = yup.object().shape({
14
13
  restrictedAccess: yup.boolean(),
15
14
  password: yup.string().when("restrictedAccess", (value, initSchema) => {
@@ -172,4 +171,4 @@ const FieldActionWrapper = styled(FieldAction)`
172
171
  export {
173
172
  SettingsPage as default
174
173
  };
175
- //# sourceMappingURL=index-Qe1yXTJr.mjs.map
174
+ //# sourceMappingURL=index-JNCjUbFJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-JNCjUbFJ.mjs","sources":["../../admin/src/pages/SettingsPage/index.jsx"],"sourcesContent":["import React, { useState } from 'react';\n\nimport {\n Box,\n Button,\n ContentLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n TextInput,\n ToggleInput,\n Typography,\n FieldAction,\n} from '@strapi/design-system';\nimport { Check, Eye as Show, EyeStriked as Hide } from '@strapi/icons';\nimport { translatedErrors, Page, useRBAC } from '@strapi/strapi/admin';\nimport { Form, Formik } from 'formik';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport * as yup from 'yup';\n\nimport { PERMISSIONS } from '../../constants';\nimport { useDocumentation } from '../../hooks/useDocumentation';\nimport { getTrad } from '../../utils';\n\nconst schema = yup.object().shape({\n restrictedAccess: yup.boolean(),\n password: yup.string().when('restrictedAccess', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required.id) : initSchema;\n }),\n});\n\nconst SettingsPage = () => {\n const { formatMessage } = useIntl();\n const { submit, data, isLoading } = useDocumentation();\n const [passwordShown, setPasswordShown] = useState(false);\n const { allowedActions } = useRBAC(PERMISSIONS);\n\n const handleUpdateSettingsSubmit = (body) => {\n submit.mutate({\n prefix: data?.prefix,\n body,\n });\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <Page.Main>\n <Formik\n initialValues={{\n restrictedAccess: data?.documentationAccess.restrictedAccess || false,\n password: '',\n }}\n onSubmit={handleUpdateSettingsSubmit}\n validationSchema={schema}\n >\n {({\n handleSubmit,\n values,\n handleChange,\n errors,\n setFieldTouched,\n setFieldValue,\n dirty,\n }) => {\n return (\n <Form noValidate onSubmit={handleSubmit}>\n <HeaderLayout\n title={formatMessage({\n id: getTrad('plugin.name'),\n defaultMessage: 'Documentation',\n })}\n subtitle={formatMessage({\n id: getTrad('pages.SettingsPage.header.description'),\n defaultMessage: 'Configure the documentation plugin',\n })}\n primaryAction={\n <Button\n type=\"submit\"\n startIcon={<Check />}\n disabled={!dirty && allowedActions.canUpdate}\n >\n {formatMessage({\n id: getTrad('pages.SettingsPage.Button.save'),\n defaultMessage: 'Save',\n })}\n </Button>\n }\n />\n <ContentLayout>\n <Box\n background=\"neutral0\"\n hasRadius\n shadow=\"filterShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid gap={4}>\n <GridItem col={6} s={12}>\n <ToggleInput\n name=\"restrictedAccess\"\n label={formatMessage({\n id: getTrad('pages.SettingsPage.toggle.label'),\n defaultMessage: 'Restricted Access',\n })}\n hint={formatMessage({\n id: getTrad('pages.SettingsPage.toggle.hint'),\n defaultMessage: 'Make the documentation endpoint private',\n })}\n checked={values.restrictedAccess}\n onChange={() => {\n if (values.restrictedAccess === true) {\n setFieldValue('password', '', false);\n setFieldTouched('password', false, false);\n }\n\n setFieldValue('restrictedAccess', !values.restrictedAccess, false);\n }}\n onLabel=\"On\"\n offLabel=\"Off\"\n />\n </GridItem>\n {values.restrictedAccess && (\n <GridItem col={6} s={12}>\n <TextInput\n label={formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n })}\n name=\"password\"\n placeholder=\"**********\"\n type={passwordShown ? 'text' : 'password'}\n value={values.password}\n onChange={handleChange}\n error={\n errors.password\n ? formatMessage({\n id: errors.password,\n defaultMessage: 'Invalid value',\n })\n : null\n }\n endAction={\n <FieldActionWrapper\n onClick={(e) => {\n e.stopPropagation();\n setPasswordShown((prev) => !prev);\n }}\n label={formatMessage(\n passwordShown\n ? {\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n }\n : {\n id: 'Auth.form.password.hide-password',\n defaultMessage: 'Hide password',\n }\n )}\n >\n {passwordShown ? <Show /> : <Hide />}\n </FieldActionWrapper>\n }\n />\n </GridItem>\n )}\n </Grid>\n </Flex>\n </Box>\n </ContentLayout>\n </Form>\n );\n }}\n </Formik>\n </Page.Main>\n );\n};\n\nconst FieldActionWrapper = styled(FieldAction)`\n svg {\n height: 1rem;\n width: 1rem;\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n`;\n\nexport default SettingsPage;\n"],"names":["Show","Hide"],"mappings":"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"}