@webiny/app-website-builder 6.4.12-beta.1 → 6.4.12-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 (79) hide show
  1. package/Extension.js +2 -0
  2. package/Extension.js.map +1 -1
  3. package/domain/Page/Page.d.ts +2 -0
  4. package/domain/Page/Page.js +1 -0
  5. package/domain/Page/Page.js.map +1 -1
  6. package/domain/PageRevision/PageRevision.d.ts +11 -0
  7. package/domain/PageRevision/PageRevision.js +20 -0
  8. package/domain/PageRevision/PageRevision.js.map +1 -1
  9. package/features/pages/createPageRevisionFrom/CreatePageRevisionFrom.test.js +41 -1
  10. package/features/pages/createPageRevisionFrom/CreatePageRevisionFrom.test.js.map +1 -1
  11. package/features/pages/createPageRevisionFrom/CreatePageRevisionFromRepository.d.ts +3 -2
  12. package/features/pages/createPageRevisionFrom/CreatePageRevisionFromRepository.js +8 -2
  13. package/features/pages/createPageRevisionFrom/CreatePageRevisionFromRepository.js.map +1 -1
  14. package/features/pages/deletePageRevision/DeletePageRevision.test.d.ts +1 -0
  15. package/features/pages/deletePageRevision/DeletePageRevision.test.js +67 -0
  16. package/features/pages/deletePageRevision/DeletePageRevision.test.js.map +1 -0
  17. package/features/pages/deletePageRevision/DeletePageRevisionGateway.d.ts +1 -1
  18. package/features/pages/deletePageRevision/DeletePageRevisionGateway.js +2 -3
  19. package/features/pages/deletePageRevision/DeletePageRevisionGateway.js.map +1 -1
  20. package/features/pages/deletePageRevision/DeletePageRevisionRepository.d.ts +4 -2
  21. package/features/pages/deletePageRevision/DeletePageRevisionRepository.js +7 -3
  22. package/features/pages/deletePageRevision/DeletePageRevisionRepository.js.map +1 -1
  23. package/features/pages/deletePageRevision/DeletePageRevisionUseCase.js +1 -1
  24. package/features/pages/deletePageRevision/DeletePageRevisionUseCase.js.map +1 -1
  25. package/features/pages/deletePageRevision/abstractions.d.ts +2 -3
  26. package/features/pages/deletePageRevision/abstractions.js.map +1 -1
  27. package/features/pages/getPage/PageGatewayDto.d.ts +2 -0
  28. package/features/pages/publishPage/PublishPage.test.js +41 -1
  29. package/features/pages/publishPage/PublishPage.test.js.map +1 -1
  30. package/features/pages/publishPage/PublishPageRepository.d.ts +3 -2
  31. package/features/pages/publishPage/PublishPageRepository.js +15 -4
  32. package/features/pages/publishPage/PublishPageRepository.js.map +1 -1
  33. package/features/pages/shared/pageGraphQLFields.js +1 -0
  34. package/features/pages/shared/pageGraphQLFields.js.map +1 -1
  35. package/features/pages/unpublishPage/UnpublishPage.test.js +4 -1
  36. package/features/pages/unpublishPage/UnpublishPage.test.js.map +1 -1
  37. package/features/pages/unpublishPage/UnpublishPageRepository.d.ts +3 -2
  38. package/features/pages/unpublishPage/UnpublishPageRepository.js +12 -4
  39. package/features/pages/unpublishPage/UnpublishPageRepository.js.map +1 -1
  40. package/modules/pages/PageEditor/Revisions/RevisionListDrawer.js +4 -0
  41. package/modules/pages/PageEditor/Revisions/RevisionListDrawer.js.map +1 -1
  42. package/modules/pages/PageEditor/Revisions/RevisionListItem.d.ts +3 -3
  43. package/modules/pages/PageEditor/Revisions/RevisionListItem.js +9 -20
  44. package/modules/pages/PageEditor/Revisions/RevisionListItem.js.map +1 -1
  45. package/modules/pages/PageEditor/Revisions/RevisionsList.js +7 -19
  46. package/modules/pages/PageEditor/Revisions/RevisionsList.js.map +1 -1
  47. package/modules/pages/PageEditor/Revisions/useRevision.d.ts +1 -1
  48. package/modules/pages/PageEditor/Revisions/useRevision.js +84 -14
  49. package/modules/pages/PageEditor/Revisions/useRevision.js.map +1 -1
  50. package/modules/pages/PageEditor/Revisions/useRevisionList.d.ts +3 -0
  51. package/modules/pages/PageEditor/Revisions/useRevisionList.js +31 -0
  52. package/modules/pages/PageEditor/Revisions/useRevisionList.js.map +1 -0
  53. package/modules/pages/PageEditor/TopBar/RevisionsMenu.js +9 -21
  54. package/modules/pages/PageEditor/TopBar/RevisionsMenu.js.map +1 -1
  55. package/modules/pages/PagesList/PagesList.js +5 -1
  56. package/modules/pages/PagesList/PagesList.js.map +1 -1
  57. package/modules/pages/PagesList/useDocumentList.d.ts +12 -0
  58. package/modules/pages/PagesList/useDocumentList.js +15 -11
  59. package/modules/pages/PagesList/useDocumentList.js.map +1 -1
  60. package/modules/redirects/RedirectsList/DocumentList.js +7 -2
  61. package/modules/redirects/RedirectsList/DocumentList.js.map +1 -1
  62. package/modules/redirects/RedirectsList/useDocumentList.d.ts +14 -0
  63. package/modules/redirects/RedirectsList/useDocumentList.js +14 -10
  64. package/modules/redirects/RedirectsList/useDocumentList.js.map +1 -1
  65. package/package.json +23 -23
  66. package/presentation/pages/RevisionList/RevisionListPresenter.d.ts +27 -0
  67. package/presentation/pages/RevisionList/RevisionListPresenter.js +73 -0
  68. package/presentation/pages/RevisionList/RevisionListPresenter.js.map +1 -0
  69. package/presentation/pages/RevisionList/RevisionListPresenter.test.d.ts +1 -0
  70. package/presentation/pages/RevisionList/RevisionListPresenter.test.js +219 -0
  71. package/presentation/pages/RevisionList/RevisionListPresenter.test.js.map +1 -0
  72. package/presentation/pages/RevisionList/abstractions.d.ts +34 -0
  73. package/presentation/pages/RevisionList/abstractions.js +5 -0
  74. package/presentation/pages/RevisionList/abstractions.js.map +1 -0
  75. package/presentation/pages/RevisionList/feature.d.ts +3 -0
  76. package/presentation/pages/RevisionList/feature.js +17 -0
  77. package/presentation/pages/RevisionList/feature.js.map +1 -0
  78. package/presentation/pages/RevisionList/index.d.ts +2 -0
  79. package/presentation/pages/RevisionList/index.js +1 -0
@@ -1,29 +1,17 @@
1
- import react, { useEffect, useState } from "react";
1
+ import react from "react";
2
2
  import { List, OverlayLoader } from "@webiny/admin-ui";
3
3
  import RevisionListItem from "./RevisionListItem.js";
4
- import { useGetPageRevisions } from "../../../../presentation/pages/hooks/useGetPageRevisions.js";
5
- import { parseIdentifier } from "@webiny/utils/parseIdentifier.js";
4
+ import { useRevisionList } from "./useRevisionList.js";
6
5
  const RevisionsList = (props)=>{
7
6
  const { page } = props;
8
- const [revisions, setRevisions] = useState([]);
9
- const { loading, getPageRevisions } = useGetPageRevisions();
10
- useEffect(()=>{
11
- const { id: entryId } = parseIdentifier(page.id);
12
- getPageRevisions({
13
- entryId
14
- }).then((revisions)=>{
15
- setRevisions(revisions.sort((a, b)=>new Date(a.savedOn).getTime() - new Date(b.savedOn).getTime()).reverse());
16
- });
17
- }, [
18
- page.id
19
- ]);
7
+ const { vm } = useRevisionList(page.id);
20
8
  return /*#__PURE__*/ react.createElement("div", {
21
9
  className: "relative"
22
- }, loading && /*#__PURE__*/ react.createElement(OverlayLoader, null), revisions?.length ? /*#__PURE__*/ react.createElement(List, {
10
+ }, (vm.isLoading || vm.isMutating) && /*#__PURE__*/ react.createElement(OverlayLoader, null), vm.revisions.length ? /*#__PURE__*/ react.createElement(List, {
23
11
  "data-testid": "cms.content-form.revisions"
24
- }, revisions.map((revision)=>/*#__PURE__*/ react.createElement(RevisionListItem, {
25
- revision: revision,
26
- key: revision.id
12
+ }, vm.revisions.map((item)=>/*#__PURE__*/ react.createElement(RevisionListItem, {
13
+ item: item,
14
+ key: item.revision.id
27
15
  }))) : /*#__PURE__*/ react.createElement("div", {
28
16
  className: "p-lg"
29
17
  }, "No revisions to show."));
@@ -1 +1 @@
1
- {"version":3,"file":"modules/pages/PageEditor/Revisions/RevisionsList.js","sources":["../../../../../src/modules/pages/PageEditor/Revisions/RevisionsList.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { List, OverlayLoader } from \"@webiny/admin-ui\";\nimport RevisionListItem from \"./RevisionListItem.js\";\nimport type { Page } from \"~/domain/Page/index.js\";\nimport type { PageRevision } from \"~/domain/PageRevision/index.js\";\nimport { useGetPageRevisions } from \"~/presentation/pages/hooks/useGetPageRevisions.js\";\nimport { parseIdentifier } from \"@webiny/utils/parseIdentifier.js\";\n\ninterface IRevisionsListProps {\n page: Pick<Page, \"id\">;\n}\n\nexport const RevisionsList = (props: IRevisionsListProps) => {\n const { page } = props;\n\n const [revisions, setRevisions] = useState<PageRevision[]>([]);\n const { loading, getPageRevisions } = useGetPageRevisions();\n\n useEffect(() => {\n const { id: entryId } = parseIdentifier(page.id);\n getPageRevisions({\n entryId\n }).then(revisions => {\n setRevisions(\n revisions\n .sort((a, b) => {\n return new Date(a.savedOn).getTime() - new Date(b.savedOn).getTime();\n })\n .reverse()\n );\n });\n }, [page.id]);\n\n return (\n <div className={\"relative\"}>\n {loading && <OverlayLoader />}\n {revisions?.length ? (\n <List data-testid={\"cms.content-form.revisions\"}>\n {revisions.map(revision => (\n <RevisionListItem revision={revision} key={revision.id} />\n ))}\n </List>\n ) : (\n <div className={\"p-lg\"}>No revisions to show.</div>\n )}\n </div>\n );\n};\n"],"names":["RevisionsList","props","page","revisions","setRevisions","useState","loading","getPageRevisions","useGetPageRevisions","useEffect","entryId","parseIdentifier","a","b","Date","OverlayLoader","List","revision","RevisionListItem"],"mappings":";;;;;AAYO,MAAMA,gBAAgB,CAACC;IAC1B,MAAM,EAAEC,IAAI,EAAE,GAAGD;IAEjB,MAAM,CAACE,WAAWC,aAAa,GAAGC,SAAyB,EAAE;IAC7D,MAAM,EAAEC,OAAO,EAAEC,gBAAgB,EAAE,GAAGC;IAEtCC,UAAU;QACN,MAAM,EAAE,IAAIC,OAAO,EAAE,GAAGC,gBAAgBT,KAAK,EAAE;QAC/CK,iBAAiB;YACbG;QACJ,GAAG,IAAI,CAACP,CAAAA;YACJC,aACID,UACK,IAAI,CAAC,CAACS,GAAGC,IACC,IAAIC,KAAKF,EAAE,OAAO,EAAE,OAAO,KAAK,IAAIE,KAAKD,EAAE,OAAO,EAAE,OAAO,IAErE,OAAO;QAEpB;IACJ,GAAG;QAACX,KAAK,EAAE;KAAC;IAEZ,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;OACXI,WAAW,WAAXA,GAAW,oBAACS,eAAaA,OACzBZ,WAAW,SAAS,WAAT,GACR,oBAACa,MAAIA;QAAC,eAAa;OACdb,UAAU,GAAG,CAACc,CAAAA,WAAAA,WAAAA,GACX,oBAACC,kBAAgBA;YAAC,UAAUD;YAAU,KAAKA,SAAS,EAAE;6BAI9D,oBAAC;QAAI,WAAW;OAAQ;AAIxC"}
1
+ {"version":3,"file":"modules/pages/PageEditor/Revisions/RevisionsList.js","sources":["../../../../../src/modules/pages/PageEditor/Revisions/RevisionsList.tsx"],"sourcesContent":["import React from \"react\";\nimport { List, OverlayLoader } from \"@webiny/admin-ui\";\nimport RevisionListItem from \"./RevisionListItem.js\";\nimport type { Page } from \"~/domain/Page/index.js\";\nimport { useRevisionList } from \"./useRevisionList.js\";\n\ninterface IRevisionsListProps {\n page: Pick<Page, \"id\">;\n}\n\nexport const RevisionsList = (props: IRevisionsListProps) => {\n const { page } = props;\n const { vm } = useRevisionList(page.id);\n\n return (\n <div className={\"relative\"}>\n {(vm.isLoading || vm.isMutating) && <OverlayLoader />}\n {vm.revisions.length ? (\n <List data-testid={\"cms.content-form.revisions\"}>\n {vm.revisions.map(item => (\n <RevisionListItem item={item} key={item.revision.id} />\n ))}\n </List>\n ) : (\n <div className={\"p-lg\"}>No revisions to show.</div>\n )}\n </div>\n );\n};\n"],"names":["RevisionsList","props","page","vm","useRevisionList","OverlayLoader","List","item","RevisionListItem"],"mappings":";;;;AAUO,MAAMA,gBAAgB,CAACC;IAC1B,MAAM,EAAEC,IAAI,EAAE,GAAGD;IACjB,MAAM,EAAEE,EAAE,EAAE,GAAGC,gBAAgBF,KAAK,EAAE;IAEtC,OAAO,WAAP,GACI,oBAAC;QAAI,WAAW;OACVC,AAAAA,CAAAA,GAAG,SAAS,IAAIA,GAAG,UAAS,mBAAM,oBAACE,eAAaA,OACjDF,GAAG,SAAS,CAAC,MAAM,GAAG,WAAH,GAChB,oBAACG,MAAIA;QAAC,eAAa;OACdH,GAAG,SAAS,CAAC,GAAG,CAACI,CAAAA,OAAAA,WAAAA,GACd,oBAACC,kBAAgBA;YAAC,MAAMD;YAAM,KAAKA,KAAK,QAAQ,CAAC,EAAE;6BAI3D,oBAAC;QAAI,WAAW;OAAQ;AAIxC"}
@@ -3,7 +3,7 @@ export interface UseRevisionProps {
3
3
  revision: PageRevision;
4
4
  }
5
5
  export declare const useRevision: (props: UseRevisionProps) => {
6
- createRevision: () => void;
6
+ createRevision: () => Promise<void>;
7
7
  editRevision: () => void;
8
8
  deleteRevision: () => void;
9
9
  publishRevision: () => void;
@@ -1,49 +1,119 @@
1
+ import react, { useCallback } from "react";
1
2
  import { useCreatePageRevisionFrom, useDeletePageRevision, usePublishPage, useUnpublishPage } from "../../../../features/pages/index.js";
2
- import { useCallback } from "react";
3
+ import { Text, useToast } from "@webiny/admin-ui";
4
+ import { useDialogs } from "@webiny/app-admin";
5
+ import { ReactComponent } from "@webiny/icons/visibility.svg";
6
+ import { ReactComponent as visibility_off_svg_ReactComponent } from "@webiny/icons/visibility_off.svg";
7
+ import { ReactComponent as delete_svg_ReactComponent } from "@webiny/icons/delete.svg";
3
8
  import { Routes } from "../../../../routes.js";
4
9
  import { useRouter } from "@webiny/app";
10
+ import { usePageEditorDrawer } from "./usePageEditorDrawer.js";
5
11
  const useRevision = (props)=>{
6
12
  const { revision } = props;
7
13
  const { goToRoute } = useRouter();
14
+ const { openRevisionList } = usePageEditorDrawer();
15
+ const { showDialog } = useDialogs();
16
+ const { showSuccessToast, showWarningToast } = useToast();
8
17
  const { createPageRevisionFrom } = useCreatePageRevisionFrom();
9
18
  const { deletePageRevision } = useDeletePageRevision();
10
19
  const { publishPage } = usePublishPage();
11
20
  const { unpublishPage } = useUnpublishPage();
12
- const createRevision = useCallback(()=>{
13
- createPageRevisionFrom({
21
+ const createRevision = useCallback(async ()=>{
22
+ await createPageRevisionFrom({
14
23
  id: revision.id
15
24
  });
16
25
  }, [
17
26
  revision.id
18
27
  ]);
19
28
  const deleteRevision = useCallback(()=>{
20
- deletePageRevision({
21
- id: revision.id,
22
- permanently: true
29
+ showDialog({
30
+ title: "Delete revision",
31
+ icon: /*#__PURE__*/ react.createElement(delete_svg_ReactComponent, null),
32
+ content: /*#__PURE__*/ react.createElement(Text, null, `You are about to delete revision #${revision.version}. This cannot be undone. Are you sure you want to continue?`),
33
+ acceptLabel: "Yes, delete this revision!",
34
+ cancelLabel: "Cancel",
35
+ onAccept: async ()=>{
36
+ try {
37
+ await deletePageRevision({
38
+ id: revision.id
39
+ });
40
+ showSuccessToast({
41
+ title: `Revision #${revision.version} was deleted successfully!`
42
+ });
43
+ } catch (ex) {
44
+ showWarningToast({
45
+ title: "Could not delete the revision.",
46
+ description: ex.message
47
+ });
48
+ }
49
+ }
23
50
  });
24
51
  }, [
25
- revision.id
52
+ revision.id,
53
+ revision.version
26
54
  ]);
27
55
  const publishRevision = useCallback(()=>{
28
- publishPage({
29
- id: revision.id
56
+ showDialog({
57
+ title: "Publish revision",
58
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
59
+ content: /*#__PURE__*/ react.createElement(Text, null, `You are about to publish revision #${revision.version}. Are you sure you want to continue?`),
60
+ acceptLabel: "Yes, publish this revision!",
61
+ cancelLabel: "Cancel",
62
+ onAccept: async ()=>{
63
+ try {
64
+ await publishPage({
65
+ id: revision.id
66
+ });
67
+ showSuccessToast({
68
+ title: `Revision #${revision.version} was published successfully!`
69
+ });
70
+ } catch (ex) {
71
+ showWarningToast({
72
+ title: "Could not publish the revision.",
73
+ description: ex.message
74
+ });
75
+ }
76
+ }
30
77
  });
31
78
  }, [
32
- revision.id
79
+ revision.id,
80
+ revision.version
33
81
  ]);
34
82
  const unpublishRevision = useCallback(()=>{
35
- unpublishPage({
36
- id: revision.id
83
+ showDialog({
84
+ title: "Unpublish revision",
85
+ icon: /*#__PURE__*/ react.createElement(visibility_off_svg_ReactComponent, null),
86
+ content: /*#__PURE__*/ react.createElement(Text, null, `You are about to unpublish revision #${revision.version}, which will take the page off the live website. Are you sure you want to continue?`),
87
+ acceptLabel: "Yes, unpublish this revision!",
88
+ cancelLabel: "Cancel",
89
+ onAccept: async ()=>{
90
+ try {
91
+ await unpublishPage({
92
+ id: revision.id
93
+ });
94
+ showSuccessToast({
95
+ title: `Revision #${revision.version} was unpublished successfully!`
96
+ });
97
+ } catch (ex) {
98
+ showWarningToast({
99
+ title: "Could not unpublish the revision.",
100
+ description: ex.message
101
+ });
102
+ }
103
+ }
37
104
  });
38
105
  }, [
39
- revision.id
106
+ revision.id,
107
+ revision.version
40
108
  ]);
41
109
  const editRevision = useCallback(()=>{
110
+ openRevisionList(false);
42
111
  goToRoute(Routes.Pages.Editor, {
43
112
  id: revision.id
44
113
  });
45
114
  }, [
46
- revision.id
115
+ revision.id,
116
+ openRevisionList
47
117
  ]);
48
118
  return {
49
119
  createRevision,
@@ -1 +1 @@
1
- {"version":3,"file":"modules/pages/PageEditor/Revisions/useRevision.js","sources":["../../../../../src/modules/pages/PageEditor/Revisions/useRevision.tsx"],"sourcesContent":["import type { PageRevision } from \"~/domain/PageRevision/index.js\";\nimport {\n usePublishPage,\n useUnpublishPage,\n useCreatePageRevisionFrom,\n useDeletePageRevision\n} from \"~/features/pages/index.js\";\nimport { useCallback } from \"react\";\nimport { Routes } from \"~/routes.js\";\nimport { useRouter } from \"@webiny/app\";\n\nexport interface UseRevisionProps {\n revision: PageRevision;\n}\n\nexport const useRevision = (props: UseRevisionProps) => {\n const { revision } = props;\n\n const { goToRoute } = useRouter();\n\n const { createPageRevisionFrom } = useCreatePageRevisionFrom();\n const { deletePageRevision } = useDeletePageRevision();\n const { publishPage } = usePublishPage();\n const { unpublishPage } = useUnpublishPage();\n\n const createRevision = useCallback(() => {\n createPageRevisionFrom({\n id: revision.id\n });\n }, [revision.id]);\n\n const deleteRevision = useCallback(() => {\n deletePageRevision({\n id: revision.id,\n permanently: true\n });\n }, [revision.id]);\n\n const publishRevision = useCallback(() => {\n publishPage({\n id: revision.id\n });\n }, [revision.id]);\n\n const unpublishRevision = useCallback(() => {\n unpublishPage({\n id: revision.id\n });\n }, [revision.id]);\n\n const editRevision = useCallback(() => {\n goToRoute(Routes.Pages.Editor, {\n id: revision.id\n });\n }, [revision.id]);\n\n return {\n createRevision,\n editRevision,\n deleteRevision,\n publishRevision,\n unpublishRevision\n };\n};\n"],"names":["useRevision","props","revision","goToRoute","useRouter","createPageRevisionFrom","useCreatePageRevisionFrom","deletePageRevision","useDeletePageRevision","publishPage","usePublishPage","unpublishPage","useUnpublishPage","createRevision","useCallback","deleteRevision","publishRevision","unpublishRevision","editRevision","Routes"],"mappings":";;;;AAeO,MAAMA,cAAc,CAACC;IACxB,MAAM,EAAEC,QAAQ,EAAE,GAAGD;IAErB,MAAM,EAAEE,SAAS,EAAE,GAAGC;IAEtB,MAAM,EAAEC,sBAAsB,EAAE,GAAGC;IACnC,MAAM,EAAEC,kBAAkB,EAAE,GAAGC;IAC/B,MAAM,EAAEC,WAAW,EAAE,GAAGC;IACxB,MAAM,EAAEC,aAAa,EAAE,GAAGC;IAE1B,MAAMC,iBAAiBC,YAAY;QAC/BT,uBAAuB;YACnB,IAAIH,SAAS,EAAE;QACnB;IACJ,GAAG;QAACA,SAAS,EAAE;KAAC;IAEhB,MAAMa,iBAAiBD,YAAY;QAC/BP,mBAAmB;YACf,IAAIL,SAAS,EAAE;YACf,aAAa;QACjB;IACJ,GAAG;QAACA,SAAS,EAAE;KAAC;IAEhB,MAAMc,kBAAkBF,YAAY;QAChCL,YAAY;YACR,IAAIP,SAAS,EAAE;QACnB;IACJ,GAAG;QAACA,SAAS,EAAE;KAAC;IAEhB,MAAMe,oBAAoBH,YAAY;QAClCH,cAAc;YACV,IAAIT,SAAS,EAAE;QACnB;IACJ,GAAG;QAACA,SAAS,EAAE;KAAC;IAEhB,MAAMgB,eAAeJ,YAAY;QAC7BX,UAAUgB,OAAO,KAAK,CAAC,MAAM,EAAE;YAC3B,IAAIjB,SAAS,EAAE;QACnB;IACJ,GAAG;QAACA,SAAS,EAAE;KAAC;IAEhB,OAAO;QACHW;QACAK;QACAH;QACAC;QACAC;IACJ;AACJ"}
1
+ {"version":3,"file":"modules/pages/PageEditor/Revisions/useRevision.js","sources":["../../../../../src/modules/pages/PageEditor/Revisions/useRevision.tsx"],"sourcesContent":["import React from \"react\";\nimport type { PageRevision } from \"~/domain/PageRevision/index.js\";\nimport {\n usePublishPage,\n useUnpublishPage,\n useCreatePageRevisionFrom,\n useDeletePageRevision\n} from \"~/features/pages/index.js\";\nimport { useCallback } from \"react\";\nimport { Text, useToast } from \"@webiny/admin-ui\";\nimport { useDialogs } from \"@webiny/app-admin\";\nimport { ReactComponent as PublishIcon } from \"@webiny/icons/visibility.svg\";\nimport { ReactComponent as UnpublishIcon } from \"@webiny/icons/visibility_off.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { Routes } from \"~/routes.js\";\nimport { useRouter } from \"@webiny/app\";\nimport { usePageEditorDrawer } from \"./usePageEditorDrawer.js\";\n\nexport interface UseRevisionProps {\n revision: PageRevision;\n}\n\nexport const useRevision = (props: UseRevisionProps) => {\n const { revision } = props;\n\n const { goToRoute } = useRouter();\n const { openRevisionList } = usePageEditorDrawer();\n const { showDialog } = useDialogs();\n const { showSuccessToast, showWarningToast } = useToast();\n\n const { createPageRevisionFrom } = useCreatePageRevisionFrom();\n const { deletePageRevision } = useDeletePageRevision();\n const { publishPage } = usePublishPage();\n const { unpublishPage } = useUnpublishPage();\n\n const createRevision = useCallback(async () => {\n await createPageRevisionFrom({\n id: revision.id\n });\n }, [revision.id]);\n\n const deleteRevision = useCallback(() => {\n showDialog({\n title: \"Delete revision\",\n icon: <DeleteIcon />,\n content: (\n <Text>\n {`You are about to delete revision #${revision.version}. This cannot be undone. Are you sure you want to continue?`}\n </Text>\n ),\n acceptLabel: \"Yes, delete this revision!\",\n cancelLabel: \"Cancel\",\n onAccept: async () => {\n try {\n await deletePageRevision({\n id: revision.id\n });\n\n showSuccessToast({\n title: `Revision #${revision.version} was deleted successfully!`\n });\n } catch (ex) {\n showWarningToast({\n title: \"Could not delete the revision.\",\n description: ex.message\n });\n }\n }\n });\n }, [revision.id, revision.version]);\n\n const publishRevision = useCallback(() => {\n showDialog({\n title: \"Publish revision\",\n icon: <PublishIcon />,\n content: (\n <Text>\n {`You are about to publish revision #${revision.version}. Are you sure you want to continue?`}\n </Text>\n ),\n acceptLabel: \"Yes, publish this revision!\",\n cancelLabel: \"Cancel\",\n onAccept: async () => {\n try {\n await publishPage({\n id: revision.id\n });\n\n showSuccessToast({\n title: `Revision #${revision.version} was published successfully!`\n });\n } catch (ex) {\n showWarningToast({\n title: \"Could not publish the revision.\",\n description: ex.message\n });\n }\n }\n });\n }, [revision.id, revision.version]);\n\n const unpublishRevision = useCallback(() => {\n showDialog({\n title: \"Unpublish revision\",\n icon: <UnpublishIcon />,\n content: (\n <Text>\n {`You are about to unpublish revision #${revision.version}, which will take the page off the live website. Are you sure you want to continue?`}\n </Text>\n ),\n acceptLabel: \"Yes, unpublish this revision!\",\n cancelLabel: \"Cancel\",\n onAccept: async () => {\n try {\n await unpublishPage({\n id: revision.id\n });\n\n showSuccessToast({\n title: `Revision #${revision.version} was unpublished successfully!`\n });\n } catch (ex) {\n showWarningToast({\n title: \"Could not unpublish the revision.\",\n description: ex.message\n });\n }\n }\n });\n }, [revision.id, revision.version]);\n\n const editRevision = useCallback(() => {\n // The drawer lives outside the editor, so it would stay open across the navigation.\n openRevisionList(false);\n\n goToRoute(Routes.Pages.Editor, {\n id: revision.id\n });\n }, [revision.id, openRevisionList]);\n\n return {\n createRevision,\n editRevision,\n deleteRevision,\n publishRevision,\n unpublishRevision\n };\n};\n"],"names":["useRevision","props","revision","goToRoute","useRouter","openRevisionList","usePageEditorDrawer","showDialog","useDialogs","showSuccessToast","showWarningToast","useToast","createPageRevisionFrom","useCreatePageRevisionFrom","deletePageRevision","useDeletePageRevision","publishPage","usePublishPage","unpublishPage","useUnpublishPage","createRevision","useCallback","deleteRevision","DeleteIcon","Text","ex","publishRevision","PublishIcon","unpublishRevision","UnpublishIcon","editRevision","Routes"],"mappings":";;;;;;;;;;AAsBO,MAAMA,cAAc,CAACC;IACxB,MAAM,EAAEC,QAAQ,EAAE,GAAGD;IAErB,MAAM,EAAEE,SAAS,EAAE,GAAGC;IACtB,MAAM,EAAEC,gBAAgB,EAAE,GAAGC;IAC7B,MAAM,EAAEC,UAAU,EAAE,GAAGC;IACvB,MAAM,EAAEC,gBAAgB,EAAEC,gBAAgB,EAAE,GAAGC;IAE/C,MAAM,EAAEC,sBAAsB,EAAE,GAAGC;IACnC,MAAM,EAAEC,kBAAkB,EAAE,GAAGC;IAC/B,MAAM,EAAEC,WAAW,EAAE,GAAGC;IACxB,MAAM,EAAEC,aAAa,EAAE,GAAGC;IAE1B,MAAMC,iBAAiBC,YAAY;QAC/B,MAAMT,uBAAuB;YACzB,IAAIV,SAAS,EAAE;QACnB;IACJ,GAAG;QAACA,SAAS,EAAE;KAAC;IAEhB,MAAMoB,iBAAiBD,YAAY;QAC/Bd,WAAW;YACP,OAAO;YACP,MAAM,WAAN,GAAM,oBAACgB,2BAAUA;YACjB,SAAS,WAAT,GACI,oBAACC,MAAIA,MACA,CAAC,kCAAkC,EAAEtB,SAAS,OAAO,CAAC,2DAA2D,CAAC;YAG3H,aAAa;YACb,aAAa;YACb,UAAU;gBACN,IAAI;oBACA,MAAMY,mBAAmB;wBACrB,IAAIZ,SAAS,EAAE;oBACnB;oBAEAO,iBAAiB;wBACb,OAAO,CAAC,UAAU,EAAEP,SAAS,OAAO,CAAC,0BAA0B,CAAC;oBACpE;gBACJ,EAAE,OAAOuB,IAAI;oBACTf,iBAAiB;wBACb,OAAO;wBACP,aAAae,GAAG,OAAO;oBAC3B;gBACJ;YACJ;QACJ;IACJ,GAAG;QAACvB,SAAS,EAAE;QAAEA,SAAS,OAAO;KAAC;IAElC,MAAMwB,kBAAkBL,YAAY;QAChCd,WAAW;YACP,OAAO;YACP,MAAM,WAAN,GAAM,oBAACoB,gBAAWA;YAClB,SAAS,WAAT,GACI,oBAACH,MAAIA,MACA,CAAC,mCAAmC,EAAEtB,SAAS,OAAO,CAAC,oCAAoC,CAAC;YAGrG,aAAa;YACb,aAAa;YACb,UAAU;gBACN,IAAI;oBACA,MAAMc,YAAY;wBACd,IAAId,SAAS,EAAE;oBACnB;oBAEAO,iBAAiB;wBACb,OAAO,CAAC,UAAU,EAAEP,SAAS,OAAO,CAAC,4BAA4B,CAAC;oBACtE;gBACJ,EAAE,OAAOuB,IAAI;oBACTf,iBAAiB;wBACb,OAAO;wBACP,aAAae,GAAG,OAAO;oBAC3B;gBACJ;YACJ;QACJ;IACJ,GAAG;QAACvB,SAAS,EAAE;QAAEA,SAAS,OAAO;KAAC;IAElC,MAAM0B,oBAAoBP,YAAY;QAClCd,WAAW;YACP,OAAO;YACP,MAAM,WAAN,GAAM,oBAACsB,mCAAaA;YACpB,SAAS,WAAT,GACI,oBAACL,MAAIA,MACA,CAAC,qCAAqC,EAAEtB,SAAS,OAAO,CAAC,mFAAmF,CAAC;YAGtJ,aAAa;YACb,aAAa;YACb,UAAU;gBACN,IAAI;oBACA,MAAMgB,cAAc;wBAChB,IAAIhB,SAAS,EAAE;oBACnB;oBAEAO,iBAAiB;wBACb,OAAO,CAAC,UAAU,EAAEP,SAAS,OAAO,CAAC,8BAA8B,CAAC;oBACxE;gBACJ,EAAE,OAAOuB,IAAI;oBACTf,iBAAiB;wBACb,OAAO;wBACP,aAAae,GAAG,OAAO;oBAC3B;gBACJ;YACJ;QACJ;IACJ,GAAG;QAACvB,SAAS,EAAE;QAAEA,SAAS,OAAO;KAAC;IAElC,MAAM4B,eAAeT,YAAY;QAE7BhB,iBAAiB;QAEjBF,UAAU4B,OAAO,KAAK,CAAC,MAAM,EAAE;YAC3B,IAAI7B,SAAS,EAAE;QACnB;IACJ,GAAG;QAACA,SAAS,EAAE;QAAEG;KAAiB;IAElC,OAAO;QACHe;QACAU;QACAR;QACAI;QACAE;IACJ;AACJ"}
@@ -0,0 +1,3 @@
1
+ export declare const useRevisionList: (pageId: string) => {
2
+ vm: import("../../../../presentation/pages/RevisionList").IRevisionListVm;
3
+ };
@@ -0,0 +1,31 @@
1
+ import { useEffect, useMemo, useState } from "react";
2
+ import { autorun } from "mobx";
3
+ import { useFeature } from "@webiny/app";
4
+ import { parseIdentifier } from "@webiny/utils/parseIdentifier.js";
5
+ import { RevisionListFeature } from "../../../../presentation/pages/RevisionList/feature.js";
6
+ const useRevisionList = (pageId)=>{
7
+ const { presenter } = useFeature(RevisionListFeature);
8
+ const { id: entryId } = useMemo(()=>parseIdentifier(pageId), [
9
+ pageId
10
+ ]);
11
+ useEffect(()=>{
12
+ presenter.init({
13
+ entryId
14
+ });
15
+ }, [
16
+ entryId,
17
+ presenter
18
+ ]);
19
+ const [vm, setVm] = useState(presenter.vm);
20
+ useEffect(()=>autorun(()=>{
21
+ setVm(presenter.vm);
22
+ }), [
23
+ presenter
24
+ ]);
25
+ return {
26
+ vm
27
+ };
28
+ };
29
+ export { useRevisionList };
30
+
31
+ //# sourceMappingURL=useRevisionList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules/pages/PageEditor/Revisions/useRevisionList.js","sources":["../../../../../src/modules/pages/PageEditor/Revisions/useRevisionList.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { autorun } from \"mobx\";\nimport { useFeature } from \"@webiny/app\";\nimport { parseIdentifier } from \"@webiny/utils/parseIdentifier.js\";\nimport { RevisionListFeature } from \"~/presentation/pages/RevisionList/feature.js\";\n\nexport const useRevisionList = (pageId: string) => {\n const { presenter } = useFeature(RevisionListFeature);\n\n const { id: entryId } = useMemo(() => parseIdentifier(pageId), [pageId]);\n\n useEffect(() => {\n presenter.init({ entryId });\n }, [entryId, presenter]);\n\n const [vm, setVm] = useState(presenter.vm);\n\n useEffect(() => {\n return autorun(() => {\n setVm(presenter.vm);\n });\n }, [presenter]);\n\n return { vm };\n};\n"],"names":["useRevisionList","pageId","presenter","useFeature","RevisionListFeature","entryId","useMemo","parseIdentifier","useEffect","vm","setVm","useState","autorun"],"mappings":";;;;;AAMO,MAAMA,kBAAkB,CAACC;IAC5B,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAEjC,MAAM,EAAE,IAAIC,OAAO,EAAE,GAAGC,QAAQ,IAAMC,gBAAgBN,SAAS;QAACA;KAAO;IAEvEO,UAAU;QACNN,UAAU,IAAI,CAAC;YAAEG;QAAQ;IAC7B,GAAG;QAACA;QAASH;KAAU;IAEvB,MAAM,CAACO,IAAIC,MAAM,GAAGC,SAAST,UAAU,EAAE;IAEzCM,UAAU,IACCI,QAAQ;YACXF,MAAMR,UAAU,EAAE;QACtB,IACD;QAACA;KAAU;IAEd,OAAO;QAAEO;IAAG;AAChB"}
@@ -1,11 +1,11 @@
1
- import react, { useCallback, useEffect, useState } from "react";
1
+ import react, { useCallback } from "react";
2
2
  import { Button, DropdownMenu, Text } from "@webiny/admin-ui";
3
3
  import { ReactComponent } from "@webiny/icons/keyboard_arrow_down.svg";
4
4
  import { ReactComponent as draw_svg_ReactComponent } from "@webiny/icons/draw.svg";
5
5
  import { ReactComponent as lock_svg_ReactComponent } from "@webiny/icons/lock.svg";
6
6
  import { ReactComponent as remove_red_eye_svg_ReactComponent } from "@webiny/icons/remove_red_eye.svg";
7
- import { useGetPageRevisions } from "../../../../features/pages/index.js";
8
7
  import { useSelectFromDocument } from "../../../../BaseEditor/hooks/useSelectFromDocument.js";
8
+ import { useRevisionList } from "../Revisions/useRevisionList.js";
9
9
  import { useRouter } from "@webiny/app-admin";
10
10
  import { Routes } from "../../../../routes.js";
11
11
  import { usePageEditorDrawer } from "../Revisions/usePageEditorDrawer.js";
@@ -17,23 +17,11 @@ const statusIcon = {
17
17
  };
18
18
  const RevisionsMenu = ()=>{
19
19
  const { getLink } = useRouter();
20
- const [revisions, setRevisions] = useState([]);
21
- const { loading, getPageRevisions } = useGetPageRevisions();
22
20
  const id = useSelectFromDocument((document)=>document.id);
23
- const status = useSelectFromDocument((document)=>document.status);
24
21
  const { openRevisionList } = usePageEditorDrawer();
25
- useEffect(()=>{
26
- const [entryId] = id.split("#");
27
- getPageRevisions({
28
- entryId
29
- }).then((revisions)=>{
30
- setRevisions(revisions.sort((a, b)=>new Date(a.savedOn).getTime() - new Date(b.savedOn).getTime()).reverse());
31
- });
32
- }, [
33
- id,
34
- status
35
- ]);
36
- const currentRevision = revisions.find((r)=>r.id === id);
22
+ const { vm } = useRevisionList(id);
23
+ const { revisions, isLoading } = vm;
24
+ const currentRevision = revisions.find((item)=>item.revision.id === id)?.revision;
37
25
  const goToRevision = useCallback((id)=>{
38
26
  window.location.pathname = getLink(Routes.Pages.Editor, {
39
27
  id
@@ -44,13 +32,13 @@ const RevisionsMenu = ()=>{
44
32
  }, []);
45
33
  return /*#__PURE__*/ react.createElement(DropdownMenu, {
46
34
  trigger: /*#__PURE__*/ react.createElement(Button, {
47
- disabled: loading,
35
+ disabled: isLoading,
48
36
  variant: "ghost",
49
37
  text: currentRevision ? currentRevision.getLabel() : "Loading...",
50
38
  icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
51
39
  iconPosition: "end"
52
40
  })
53
- }, revisions.slice(0, 5).map((revision)=>/*#__PURE__*/ react.createElement(Item, {
41
+ }, revisions.slice(0, 5).map(({ revision })=>/*#__PURE__*/ react.createElement(Item, {
54
42
  key: revision.id,
55
43
  className: "cursor-pointer",
56
44
  onClick: ()=>goToRevision(revision.id),
@@ -61,13 +49,13 @@ const RevisionsMenu = ()=>{
61
49
  text: /*#__PURE__*/ react.createElement(Text, {
62
50
  size: "sm"
63
51
  }, revision.getLabel())
64
- })), revisions.length > 5 ? /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(DropdownMenu.Separator, null), /*#__PURE__*/ react.createElement(DropdownMenu.Item, {
52
+ })), /*#__PURE__*/ react.createElement(DropdownMenu.Separator, null), /*#__PURE__*/ react.createElement(DropdownMenu.Item, {
65
53
  key: "revisions-all",
66
54
  onClick: onOpenRevisionList,
67
55
  text: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Text, {
68
56
  size: "sm"
69
57
  }, "Show All Revisions"))
70
- })) : null);
58
+ }));
71
59
  };
72
60
  export { RevisionsMenu };
73
61
 
@@ -1 +1 @@
1
- {"version":3,"file":"modules/pages/PageEditor/TopBar/RevisionsMenu.js","sources":["../../../../../src/modules/pages/PageEditor/TopBar/RevisionsMenu.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback } from \"react\";\nimport { Button, DropdownMenu, Text } from \"@webiny/admin-ui\";\nimport { ReactComponent as ArrowDown } from \"@webiny/icons/keyboard_arrow_down.svg\";\nimport { ReactComponent as Draft } from \"@webiny/icons/draw.svg\";\nimport { ReactComponent as Unpublished } from \"@webiny/icons/lock.svg\";\nimport { ReactComponent as Published } from \"@webiny/icons/remove_red_eye.svg\";\nimport { useGetPageRevisions } from \"~/features/pages/index.js\";\nimport { useSelectFromDocument } from \"~/BaseEditor/hooks/useSelectFromDocument.js\";\nimport type { PageRevision } from \"~/domain/PageRevision/index.js\";\nimport type { EditorPage } from \"@webiny/website-builder-sdk\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { Routes } from \"~/routes.js\";\nimport { usePageEditorDrawer } from \"~/modules/pages/PageEditor/Revisions/usePageEditorDrawer.js\";\n\nconst { Item } = DropdownMenu;\n\nconst statusIcon: Record<string, React.JSX.Element> = {\n draft: <Draft />,\n published: <Published />,\n unpublished: <Unpublished />\n};\n\nexport const RevisionsMenu = () => {\n const { getLink } = useRouter();\n const [revisions, setRevisions] = useState<PageRevision[]>([]);\n const { loading, getPageRevisions } = useGetPageRevisions();\n const id = useSelectFromDocument(document => document.id);\n const status = useSelectFromDocument<string, EditorPage>(document => document.status);\n\n const { openRevisionList } = usePageEditorDrawer();\n\n useEffect(() => {\n const [entryId] = id.split(\"#\");\n getPageRevisions({ entryId }).then(revisions => {\n setRevisions(\n revisions\n .sort((a, b) => {\n return new Date(a.savedOn).getTime() - new Date(b.savedOn).getTime();\n })\n .reverse()\n );\n });\n }, [id, status]);\n\n const currentRevision = revisions.find(r => r.id === id);\n\n const goToRevision = useCallback((id: string) => {\n // TODO: make this work without a full app reload\n window.location.pathname = getLink(Routes.Pages.Editor, { id });\n }, []);\n\n const onOpenRevisionList = useCallback(() => {\n openRevisionList(true);\n }, []);\n\n return (\n <DropdownMenu\n trigger={\n <Button\n disabled={loading}\n variant=\"ghost\"\n text={currentRevision ? currentRevision.getLabel() : \"Loading...\"}\n icon={<ArrowDown />}\n iconPosition={\"end\"}\n />\n }\n >\n {revisions.slice(0, 5).map(revision => (\n <Item\n key={revision.id}\n className={\"cursor-pointer\"}\n onClick={() => goToRevision(revision.id)}\n icon={\n <Item.Icon\n label={revision.getLabel()}\n element={statusIcon[revision.status]}\n />\n }\n text={<Text size={\"sm\"}>{revision.getLabel()}</Text>}\n />\n ))}\n {revisions.length > 5 ? (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n key={\"revisions-all\"}\n onClick={onOpenRevisionList}\n text={\n <>\n <Text size={\"sm\"}>Show All Revisions</Text>\n </>\n }\n />\n </>\n ) : null}\n </DropdownMenu>\n );\n};\n"],"names":["Item","DropdownMenu","statusIcon","Draft","Published","Unpublished","RevisionsMenu","getLink","useRouter","revisions","setRevisions","useState","loading","getPageRevisions","useGetPageRevisions","id","useSelectFromDocument","document","status","openRevisionList","usePageEditorDrawer","useEffect","entryId","a","b","Date","currentRevision","r","goToRevision","useCallback","window","Routes","onOpenRevisionList","Button","ArrowDown","revision","Text"],"mappings":";;;;;;;;;;;AAcA,MAAM,EAAEA,MAAAA,IAAI,EAAE,GAAGC;AAEjB,MAAMC,aAAgD;IAClD,OAAO,WAAP,GAAO,oBAACC,yBAAKA;IACb,WAAW,WAAX,GAAW,oBAACC,mCAASA;IACrB,aAAa,WAAb,GAAa,oBAACC,yBAAWA;AAC7B;AAEO,MAAMC,gBAAgB;IACzB,MAAM,EAAEC,OAAO,EAAE,GAAGC;IACpB,MAAM,CAACC,WAAWC,aAAa,GAAGC,SAAyB,EAAE;IAC7D,MAAM,EAAEC,OAAO,EAAEC,gBAAgB,EAAE,GAAGC;IACtC,MAAMC,KAAKC,sBAAsBC,CAAAA,WAAYA,SAAS,EAAE;IACxD,MAAMC,SAASF,sBAA0CC,CAAAA,WAAYA,SAAS,MAAM;IAEpF,MAAM,EAAEE,gBAAgB,EAAE,GAAGC;IAE7BC,UAAU;QACN,MAAM,CAACC,QAAQ,GAAGP,GAAG,KAAK,CAAC;QAC3BF,iBAAiB;YAAES;QAAQ,GAAG,IAAI,CAACb,CAAAA;YAC/BC,aACID,UACK,IAAI,CAAC,CAACc,GAAGC,IACC,IAAIC,KAAKF,EAAE,OAAO,EAAE,OAAO,KAAK,IAAIE,KAAKD,EAAE,OAAO,EAAE,OAAO,IAErE,OAAO;QAEpB;IACJ,GAAG;QAACT;QAAIG;KAAO;IAEf,MAAMQ,kBAAkBjB,UAAU,IAAI,CAACkB,CAAAA,IAAKA,EAAE,EAAE,KAAKZ;IAErD,MAAMa,eAAeC,YAAY,CAACd;QAE9Be,OAAO,QAAQ,CAAC,QAAQ,GAAGvB,QAAQwB,OAAO,KAAK,CAAC,MAAM,EAAE;YAAEhB;QAAG;IACjE,GAAG,EAAE;IAEL,MAAMiB,qBAAqBH,YAAY;QACnCV,iBAAiB;IACrB,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAAClB,cAAYA;QACT,uBACI,oBAACgC,QAAMA;YACH,UAAUrB;YACV,SAAQ;YACR,MAAMc,kBAAkBA,gBAAgB,QAAQ,KAAK;YACrD,oBAAM,oBAACQ,gBAASA;YAChB,cAAc;;OAIrBzB,UAAU,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC0B,CAAAA,WAAAA,WAAAA,GACvB,oBAACnC,MAAIA;YACD,KAAKmC,SAAS,EAAE;YAChB,WAAW;YACX,SAAS,IAAMP,aAAaO,SAAS,EAAE;YACvC,oBACI,oBAACnC,KAAK,IAAI;gBACN,OAAOmC,SAAS,QAAQ;gBACxB,SAASjC,UAAU,CAACiC,SAAS,MAAM,CAAC;;YAG5C,oBAAM,oBAACC,MAAIA;gBAAC,MAAM;eAAOD,SAAS,QAAQ;aAGjD1B,UAAU,MAAM,GAAG,IAAI,WAAJ,GAChB,wDACI,oBAACR,aAAa,SAAS,uBACvB,oBAACA,aAAa,IAAI;QACd,KAAK;QACL,SAAS+B;QACT,oBACI,wDACI,oBAACI,MAAIA;YAAC,MAAM;WAAM;UAKlC;AAGhB"}
1
+ {"version":3,"file":"modules/pages/PageEditor/TopBar/RevisionsMenu.js","sources":["../../../../../src/modules/pages/PageEditor/TopBar/RevisionsMenu.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Button, DropdownMenu, Text } from \"@webiny/admin-ui\";\nimport { ReactComponent as ArrowDown } from \"@webiny/icons/keyboard_arrow_down.svg\";\nimport { ReactComponent as Draft } from \"@webiny/icons/draw.svg\";\nimport { ReactComponent as Unpublished } from \"@webiny/icons/lock.svg\";\nimport { ReactComponent as Published } from \"@webiny/icons/remove_red_eye.svg\";\nimport { useSelectFromDocument } from \"~/BaseEditor/hooks/useSelectFromDocument.js\";\nimport { useRevisionList } from \"~/modules/pages/PageEditor/Revisions/useRevisionList.js\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { Routes } from \"~/routes.js\";\nimport { usePageEditorDrawer } from \"~/modules/pages/PageEditor/Revisions/usePageEditorDrawer.js\";\n\nconst { Item } = DropdownMenu;\n\nconst statusIcon: Record<string, React.JSX.Element> = {\n draft: <Draft />,\n published: <Published />,\n unpublished: <Unpublished />\n};\n\nexport const RevisionsMenu = () => {\n const { getLink } = useRouter();\n const id = useSelectFromDocument(document => document.id);\n\n const { openRevisionList } = usePageEditorDrawer();\n\n // Shares the presenter with the revisions drawer, so mutations made there are reflected here.\n const { vm } = useRevisionList(id);\n const { revisions, isLoading } = vm;\n\n const currentRevision = revisions.find(item => item.revision.id === id)?.revision;\n\n const goToRevision = useCallback((id: string) => {\n // TODO: make this work without a full app reload\n window.location.pathname = getLink(Routes.Pages.Editor, { id });\n }, []);\n\n const onOpenRevisionList = useCallback(() => {\n openRevisionList(true);\n }, []);\n\n return (\n <DropdownMenu\n trigger={\n <Button\n disabled={isLoading}\n variant=\"ghost\"\n text={currentRevision ? currentRevision.getLabel() : \"Loading...\"}\n icon={<ArrowDown />}\n iconPosition={\"end\"}\n />\n }\n >\n {revisions.slice(0, 5).map(({ revision }) => (\n <Item\n key={revision.id}\n className={\"cursor-pointer\"}\n onClick={() => goToRevision(revision.id)}\n icon={\n <Item.Icon\n label={revision.getLabel()}\n element={statusIcon[revision.status]}\n />\n }\n text={<Text size={\"sm\"}>{revision.getLabel()}</Text>}\n />\n ))}\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n key={\"revisions-all\"}\n onClick={onOpenRevisionList}\n text={\n <>\n <Text size={\"sm\"}>Show All Revisions</Text>\n </>\n }\n />\n </DropdownMenu>\n );\n};\n"],"names":["Item","DropdownMenu","statusIcon","Draft","Published","Unpublished","RevisionsMenu","getLink","useRouter","id","useSelectFromDocument","document","openRevisionList","usePageEditorDrawer","vm","useRevisionList","revisions","isLoading","currentRevision","item","goToRevision","useCallback","window","Routes","onOpenRevisionList","Button","ArrowDown","revision","Text"],"mappings":";;;;;;;;;;;AAYA,MAAM,EAAEA,MAAAA,IAAI,EAAE,GAAGC;AAEjB,MAAMC,aAAgD;IAClD,OAAO,WAAP,GAAO,oBAACC,yBAAKA;IACb,WAAW,WAAX,GAAW,oBAACC,mCAASA;IACrB,aAAa,WAAb,GAAa,oBAACC,yBAAWA;AAC7B;AAEO,MAAMC,gBAAgB;IACzB,MAAM,EAAEC,OAAO,EAAE,GAAGC;IACpB,MAAMC,KAAKC,sBAAsBC,CAAAA,WAAYA,SAAS,EAAE;IAExD,MAAM,EAAEC,gBAAgB,EAAE,GAAGC;IAG7B,MAAM,EAAEC,EAAE,EAAE,GAAGC,gBAAgBN;IAC/B,MAAM,EAAEO,SAAS,EAAEC,SAAS,EAAE,GAAGH;IAEjC,MAAMI,kBAAkBF,UAAU,IAAI,CAACG,CAAAA,OAAQA,KAAK,QAAQ,CAAC,EAAE,KAAKV,KAAK;IAEzE,MAAMW,eAAeC,YAAY,CAACZ;QAE9Ba,OAAO,QAAQ,CAAC,QAAQ,GAAGf,QAAQgB,OAAO,KAAK,CAAC,MAAM,EAAE;YAAEd;QAAG;IACjE,GAAG,EAAE;IAEL,MAAMe,qBAAqBH,YAAY;QACnCT,iBAAiB;IACrB,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACX,cAAYA;QACT,uBACI,oBAACwB,QAAMA;YACH,UAAUR;YACV,SAAQ;YACR,MAAMC,kBAAkBA,gBAAgB,QAAQ,KAAK;YACrD,oBAAM,oBAACQ,gBAASA;YAChB,cAAc;;OAIrBV,UAAU,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAEW,QAAQ,EAAE,iBACpC,oBAAC3B,MAAIA;YACD,KAAK2B,SAAS,EAAE;YAChB,WAAW;YACX,SAAS,IAAMP,aAAaO,SAAS,EAAE;YACvC,oBACI,oBAAC3B,KAAK,IAAI;gBACN,OAAO2B,SAAS,QAAQ;gBACxB,SAASzB,UAAU,CAACyB,SAAS,MAAM,CAAC;;YAG5C,oBAAM,oBAACC,MAAIA;gBAAC,MAAM;eAAOD,SAAS,QAAQ;2BAGlD,oBAAC1B,aAAa,SAAS,uBACvB,oBAACA,aAAa,IAAI;QACd,KAAK;QACL,SAASuB;QACT,oBACI,wDACI,oBAACI,MAAIA;YAAC,MAAM;WAAM;;AAM1C"}
@@ -2,10 +2,14 @@ import react from "react";
2
2
  import { Layout } from "./components/Layout/index.js";
3
3
  import { Main } from "./components/Main/index.js";
4
4
  import { Sidebar } from "./components/Sidebar/index.js";
5
- const PagesList = ()=>/*#__PURE__*/ react.createElement(Layout, {
5
+ import { useDocumentListController } from "./useDocumentList.js";
6
+ const PagesList = ()=>{
7
+ useDocumentListController();
8
+ return /*#__PURE__*/ react.createElement(Layout, {
6
9
  main: /*#__PURE__*/ react.createElement(Main, null),
7
10
  sidebar: /*#__PURE__*/ react.createElement(Sidebar, null)
8
11
  });
12
+ };
9
13
  export { PagesList };
10
14
 
11
15
  //# sourceMappingURL=PagesList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modules/pages/PagesList/PagesList.js","sources":["../../../../src/modules/pages/PagesList/PagesList.tsx"],"sourcesContent":["import React from \"react\";\nimport { Layout } from \"~/modules/pages/PagesList/components/Layout/index.js\";\nimport { Main } from \"~/modules/pages/PagesList/components/Main/index.js\";\nimport { Sidebar } from \"~/modules/pages/PagesList/components/Sidebar/index.js\";\n\nexport const PagesList = () => {\n return <Layout main={<Main />} sidebar={<Sidebar />} />;\n};\n"],"names":["PagesList","Layout","Main","Sidebar"],"mappings":";;;;AAKO,MAAMA,YAAY,IACd,WAAP,GAAO,oBAACC,QAAMA;QAAC,oBAAM,oBAACC,MAAIA;QAAK,uBAAS,oBAACC,SAAOA"}
1
+ {"version":3,"file":"modules/pages/PagesList/PagesList.js","sources":["../../../../src/modules/pages/PagesList/PagesList.tsx"],"sourcesContent":["import React from \"react\";\nimport { Layout } from \"~/modules/pages/PagesList/components/Layout/index.js\";\nimport { Main } from \"~/modules/pages/PagesList/components/Main/index.js\";\nimport { Sidebar } from \"~/modules/pages/PagesList/components/Sidebar/index.js\";\nimport { useDocumentListController } from \"~/modules/pages/PagesList/useDocumentList.js\";\n\nexport const PagesList = () => {\n useDocumentListController();\n\n return <Layout main={<Main />} sidebar={<Sidebar />} />;\n};\n"],"names":["PagesList","useDocumentListController","Layout","Main","Sidebar"],"mappings":";;;;;AAMO,MAAMA,YAAY;IACrBC;IAEA,OAAO,WAAP,GAAO,oBAACC,QAAMA;QAAC,oBAAM,oBAACC,MAAIA;QAAK,uBAAS,oBAACC,SAAOA;;AACpD"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Reads the list view model. Safe to call from any number of components: it performs no data
3
+ * loading, so an extra consumer costs nothing.
4
+ *
5
+ * Loading belongs to `useDocumentListController`, which the list root calls exactly once. Keeping it
6
+ * here would mean every consumer issued its own `listPages` request on mount.
7
+ */
1
8
  export declare const useDocumentList: import("@webiny/react-composition").GenericHook<unknown, {
2
9
  vm: import("../../../presentation/pages/PageList").IDocumentListVm;
3
10
  showFilters: (show: boolean) => void;
@@ -13,3 +20,8 @@ export declare const useDocumentList: import("@webiny/react-composition").Generi
13
20
  showFilters: (show: boolean) => void;
14
21
  }>) => () => React.JSX.Element;
15
22
  };
23
+ /**
24
+ * Owns the loading of the current folder. Must be called exactly once, by the list root - every call
25
+ * site runs its own copy of the effect below, and each copy issues a `listPages` request.
26
+ */
27
+ export declare const useDocumentListController: () => void;
@@ -7,13 +7,8 @@ import { makeDecoratableHook } from "@webiny/react-composition";
7
7
  import { useFeature } from "@webiny/app";
8
8
  import { PageListFeature } from "../../../presentation/pages/PageList/feature.js";
9
9
  const useDocumentList = makeDecoratableHook(()=>{
10
- const isFirstLoad = useRef(true);
11
- const { folders, loadFolderHierarchy } = useLoadFolderHierarchy();
12
- const { listFoldersByParentIds } = useListFoldersByParentIds();
13
10
  const { currentFolderId } = useNavigateFolder();
14
- const { loadPages: listDocuments } = useLoadPages();
15
11
  const { filterPages: filterDocuments } = useFilterPages();
16
- const { selectPages: selectDocuments } = useSelectPages();
17
12
  const { presenter } = useFeature(PageListFeature);
18
13
  const params = useMemo(()=>({
19
14
  folderId: currentFolderId
@@ -38,6 +33,19 @@ const useDocumentList = makeDecoratableHook(()=>{
38
33
  }, [
39
34
  presenter
40
35
  ]);
36
+ return {
37
+ vm,
38
+ showFilters
39
+ };
40
+ });
41
+ const useDocumentListController = ()=>{
42
+ const isFirstLoad = useRef(true);
43
+ const { folders, loadFolderHierarchy } = useLoadFolderHierarchy();
44
+ const { listFoldersByParentIds } = useListFoldersByParentIds();
45
+ const { loadPages: listDocuments } = useLoadPages();
46
+ const { selectPages: selectDocuments } = useSelectPages();
47
+ const { presenter } = useFeature(PageListFeature);
48
+ const { vm } = useDocumentList();
41
49
  useEffect(()=>{
42
50
  if (0 === folders.length) loadFolderHierarchy(vm.folderId);
43
51
  else listFoldersByParentIds([
@@ -53,11 +61,7 @@ const useDocumentList = makeDecoratableHook(()=>{
53
61
  }, [
54
62
  vm.folderId
55
63
  ]);
56
- return {
57
- vm,
58
- showFilters
59
- };
60
- });
61
- export { useDocumentList };
64
+ };
65
+ export { useDocumentList, useDocumentListController };
62
66
 
63
67
  //# sourceMappingURL=useDocumentList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modules/pages/PagesList/useDocumentList.js","sources":["../../../../src/modules/pages/PagesList/useDocumentList.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { autorun } from \"mobx\";\nimport {\n useListFoldersByParentIds,\n useLoadFolderHierarchy,\n useNavigateFolder\n} from \"@webiny/app-aco\";\nimport { useFilterPages, useLoadPages } from \"~/features/pages/index.js\";\nimport { useSelectPages } from \"~/features/pages/selectPages/useSelectPages.js\";\nimport { makeDecoratableHook } from \"@webiny/react-composition\";\nimport { useFeature } from \"@webiny/app\";\nimport { PageListFeature } from \"~/presentation/pages/PageList/feature.js\";\n\nexport const useDocumentList = makeDecoratableHook(() => {\n const isFirstLoad = useRef(true);\n const { folders, loadFolderHierarchy } = useLoadFolderHierarchy();\n const { listFoldersByParentIds } = useListFoldersByParentIds();\n const { currentFolderId } = useNavigateFolder();\n const { loadPages: listDocuments } = useLoadPages();\n const { filterPages: filterDocuments } = useFilterPages();\n const { selectPages: selectDocuments } = useSelectPages();\n const { presenter } = useFeature(PageListFeature);\n\n const params = useMemo(\n () => ({\n folderId: currentFolderId\n }),\n [currentFolderId]\n );\n\n useEffect(() => {\n presenter.init(params);\n }, [params, presenter]);\n\n const [vm, setVm] = useState(presenter.vm);\n\n useEffect(() => {\n return autorun(() => {\n setVm(presenter.vm);\n });\n }, [presenter]);\n\n const showFilters = useCallback(\n (show: boolean) => {\n presenter.showFilters(show);\n\n // When set to false, it will also clear any applied document filters for the current folder.\n if (!show) {\n filterDocuments({}, currentFolderId);\n }\n },\n [presenter]\n );\n\n useEffect(() => {\n // The folders collection is empty, it must be the first render, let's load the full hierarchy.\n if (folders.length === 0) {\n loadFolderHierarchy(vm.folderId);\n } else {\n // Otherwise let's load only the current folder sub-tree\n listFoldersByParentIds([vm.folderId]);\n }\n\n // Close the filter list\n presenter.showFilters(false);\n\n // Unselect any selected items\n selectDocuments([]);\n\n // List all documents when the current folder changes.\n listDocuments({\n folderId: vm.folderId,\n resetSearch: !isFirstLoad.current\n });\n isFirstLoad.current = false;\n }, [vm.folderId]);\n\n return {\n vm,\n showFilters\n };\n});\n"],"names":["useDocumentList","makeDecoratableHook","isFirstLoad","useRef","folders","loadFolderHierarchy","useLoadFolderHierarchy","listFoldersByParentIds","useListFoldersByParentIds","currentFolderId","useNavigateFolder","listDocuments","useLoadPages","filterDocuments","useFilterPages","selectDocuments","useSelectPages","presenter","useFeature","PageListFeature","params","useMemo","useEffect","vm","setVm","useState","autorun","showFilters","useCallback","show"],"mappings":";;;;;;;;AAaO,MAAMA,kBAAkBC,oBAAoB;IAC/C,MAAMC,cAAcC,OAAO;IAC3B,MAAM,EAAEC,OAAO,EAAEC,mBAAmB,EAAE,GAAGC;IACzC,MAAM,EAAEC,sBAAsB,EAAE,GAAGC;IACnC,MAAM,EAAEC,eAAe,EAAE,GAAGC;IAC5B,MAAM,EAAE,WAAWC,aAAa,EAAE,GAAGC;IACrC,MAAM,EAAE,aAAaC,eAAe,EAAE,GAAGC;IACzC,MAAM,EAAE,aAAaC,eAAe,EAAE,GAAGC;IACzC,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAEjC,MAAMC,SAASC,QACX,IAAO;YACH,UAAUZ;QACd,IACA;QAACA;KAAgB;IAGrBa,UAAU;QACNL,UAAU,IAAI,CAACG;IACnB,GAAG;QAACA;QAAQH;KAAU;IAEtB,MAAM,CAACM,IAAIC,MAAM,GAAGC,SAASR,UAAU,EAAE;IAEzCK,UAAU,IACCI,QAAQ;YACXF,MAAMP,UAAU,EAAE;QACtB,IACD;QAACA;KAAU;IAEd,MAAMU,cAAcC,YAChB,CAACC;QACGZ,UAAU,WAAW,CAACY;QAGtB,IAAI,CAACA,MACDhB,gBAAgB,CAAC,GAAGJ;IAE5B,GACA;QAACQ;KAAU;IAGfK,UAAU;QAEN,IAAIlB,AAAmB,MAAnBA,QAAQ,MAAM,EACdC,oBAAoBkB,GAAG,QAAQ;aAG/BhB,uBAAuB;YAACgB,GAAG,QAAQ;SAAC;QAIxCN,UAAU,WAAW,CAAC;QAGtBF,gBAAgB,EAAE;QAGlBJ,cAAc;YACV,UAAUY,GAAG,QAAQ;YACrB,aAAa,CAACrB,YAAY,OAAO;QACrC;QACAA,YAAY,OAAO,GAAG;IAC1B,GAAG;QAACqB,GAAG,QAAQ;KAAC;IAEhB,OAAO;QACHA;QACAI;IACJ;AACJ"}
1
+ {"version":3,"file":"modules/pages/PagesList/useDocumentList.js","sources":["../../../../src/modules/pages/PagesList/useDocumentList.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { autorun } from \"mobx\";\nimport {\n useListFoldersByParentIds,\n useLoadFolderHierarchy,\n useNavigateFolder\n} from \"@webiny/app-aco\";\nimport { useFilterPages, useLoadPages } from \"~/features/pages/index.js\";\nimport { useSelectPages } from \"~/features/pages/selectPages/useSelectPages.js\";\nimport { makeDecoratableHook } from \"@webiny/react-composition\";\nimport { useFeature } from \"@webiny/app\";\nimport { PageListFeature } from \"~/presentation/pages/PageList/feature.js\";\n\n/**\n * Reads the list view model. Safe to call from any number of components: it performs no data\n * loading, so an extra consumer costs nothing.\n *\n * Loading belongs to `useDocumentListController`, which the list root calls exactly once. Keeping it\n * here would mean every consumer issued its own `listPages` request on mount.\n */\nexport const useDocumentList = makeDecoratableHook(() => {\n const { currentFolderId } = useNavigateFolder();\n const { filterPages: filterDocuments } = useFilterPages();\n const { presenter } = useFeature(PageListFeature);\n\n const params = useMemo(\n () => ({\n folderId: currentFolderId\n }),\n [currentFolderId]\n );\n\n /**\n * Stays here rather than in the controller: it is idempotent and makes no request, and child\n * effects run before the parent's - so a consumer would otherwise render one frame against an\n * uninitialized view model.\n */\n useEffect(() => {\n presenter.init(params);\n }, [params, presenter]);\n\n const [vm, setVm] = useState(presenter.vm);\n\n useEffect(() => {\n return autorun(() => {\n setVm(presenter.vm);\n });\n }, [presenter]);\n\n const showFilters = useCallback(\n (show: boolean) => {\n presenter.showFilters(show);\n\n // When set to false, it will also clear any applied document filters for the current folder.\n if (!show) {\n filterDocuments({}, currentFolderId);\n }\n },\n [presenter]\n );\n\n return {\n vm,\n showFilters\n };\n});\n\n/**\n * Owns the loading of the current folder. Must be called exactly once, by the list root - every call\n * site runs its own copy of the effect below, and each copy issues a `listPages` request.\n */\nexport const useDocumentListController = () => {\n const isFirstLoad = useRef(true);\n const { folders, loadFolderHierarchy } = useLoadFolderHierarchy();\n const { listFoldersByParentIds } = useListFoldersByParentIds();\n const { loadPages: listDocuments } = useLoadPages();\n const { selectPages: selectDocuments } = useSelectPages();\n const { presenter } = useFeature(PageListFeature);\n const { vm } = useDocumentList();\n\n useEffect(() => {\n // The folders collection is empty, it must be the first render, let's load the full hierarchy.\n if (folders.length === 0) {\n loadFolderHierarchy(vm.folderId);\n } else {\n // Otherwise let's load only the current folder sub-tree\n listFoldersByParentIds([vm.folderId]);\n }\n\n // Close the filter list\n presenter.showFilters(false);\n\n // Unselect any selected items\n selectDocuments([]);\n\n // List all documents when the current folder changes.\n listDocuments({\n folderId: vm.folderId,\n resetSearch: !isFirstLoad.current\n });\n isFirstLoad.current = false;\n }, [vm.folderId]);\n};\n"],"names":["useDocumentList","makeDecoratableHook","currentFolderId","useNavigateFolder","filterDocuments","useFilterPages","presenter","useFeature","PageListFeature","params","useMemo","useEffect","vm","setVm","useState","autorun","showFilters","useCallback","show","useDocumentListController","isFirstLoad","useRef","folders","loadFolderHierarchy","useLoadFolderHierarchy","listFoldersByParentIds","useListFoldersByParentIds","listDocuments","useLoadPages","selectDocuments","useSelectPages"],"mappings":";;;;;;;;AAoBO,MAAMA,kBAAkBC,oBAAoB;IAC/C,MAAM,EAAEC,eAAe,EAAE,GAAGC;IAC5B,MAAM,EAAE,aAAaC,eAAe,EAAE,GAAGC;IACzC,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAEjC,MAAMC,SAASC,QACX,IAAO;YACH,UAAUR;QACd,IACA;QAACA;KAAgB;IAQrBS,UAAU;QACNL,UAAU,IAAI,CAACG;IACnB,GAAG;QAACA;QAAQH;KAAU;IAEtB,MAAM,CAACM,IAAIC,MAAM,GAAGC,SAASR,UAAU,EAAE;IAEzCK,UAAU,IACCI,QAAQ;YACXF,MAAMP,UAAU,EAAE;QACtB,IACD;QAACA;KAAU;IAEd,MAAMU,cAAcC,YAChB,CAACC;QACGZ,UAAU,WAAW,CAACY;QAGtB,IAAI,CAACA,MACDd,gBAAgB,CAAC,GAAGF;IAE5B,GACA;QAACI;KAAU;IAGf,OAAO;QACHM;QACAI;IACJ;AACJ;AAMO,MAAMG,4BAA4B;IACrC,MAAMC,cAAcC,OAAO;IAC3B,MAAM,EAAEC,OAAO,EAAEC,mBAAmB,EAAE,GAAGC;IACzC,MAAM,EAAEC,sBAAsB,EAAE,GAAGC;IACnC,MAAM,EAAE,WAAWC,aAAa,EAAE,GAAGC;IACrC,MAAM,EAAE,aAAaC,eAAe,EAAE,GAAGC;IACzC,MAAM,EAAExB,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAM,EAAEI,EAAE,EAAE,GAAGZ;IAEfW,UAAU;QAEN,IAAIW,AAAmB,MAAnBA,QAAQ,MAAM,EACdC,oBAAoBX,GAAG,QAAQ;aAG/Ba,uBAAuB;YAACb,GAAG,QAAQ;SAAC;QAIxCN,UAAU,WAAW,CAAC;QAGtBuB,gBAAgB,EAAE;QAGlBF,cAAc;YACV,UAAUf,GAAG,QAAQ;YACrB,aAAa,CAACQ,YAAY,OAAO;QACrC;QACAA,YAAY,OAAO,GAAG;IAC1B,GAAG;QAACR,GAAG,QAAQ;KAAC;AACpB"}
@@ -3,10 +3,15 @@ import { Layout } from "./components/Layout/index.js";
3
3
  import { Main } from "./components/Main/index.js";
4
4
  import { Sidebar } from "./components/Sidebar/index.js";
5
5
  import { DocumentListPresenterProvider } from "./presenters/DocumentListPresenterContext.js";
6
- const DocumentList = ()=>/*#__PURE__*/ react.createElement(DocumentListPresenterProvider, null, /*#__PURE__*/ react.createElement(Layout, {
6
+ import { useDocumentListController } from "./useDocumentList.js";
7
+ const DocumentListContent = ()=>{
8
+ useDocumentListController();
9
+ return /*#__PURE__*/ react.createElement(Layout, {
7
10
  main: /*#__PURE__*/ react.createElement(Main, null),
8
11
  sidebar: /*#__PURE__*/ react.createElement(Sidebar, null)
9
- }));
12
+ });
13
+ };
14
+ const DocumentList = ()=>/*#__PURE__*/ react.createElement(DocumentListPresenterProvider, null, /*#__PURE__*/ react.createElement(DocumentListContent, null));
10
15
  export { DocumentList };
11
16
 
12
17
  //# sourceMappingURL=DocumentList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modules/redirects/RedirectsList/DocumentList.js","sources":["../../../../src/modules/redirects/RedirectsList/DocumentList.tsx"],"sourcesContent":["import React from \"react\";\nimport { Layout } from \"~/modules/redirects/RedirectsList/components/Layout/index.js\";\nimport { Main } from \"~/modules/redirects/RedirectsList/components/Main/index.js\";\nimport { Sidebar } from \"~/modules/redirects/RedirectsList/components/Sidebar/index.js\";\nimport { DocumentListPresenterProvider } from \"~/modules/redirects/RedirectsList/presenters/DocumentListPresenterContext.js\";\n\nexport const DocumentList = () => {\n return (\n <DocumentListPresenterProvider>\n <Layout main={<Main />} sidebar={<Sidebar />} />\n </DocumentListPresenterProvider>\n );\n};\n"],"names":["DocumentList","DocumentListPresenterProvider","Layout","Main","Sidebar"],"mappings":";;;;;AAMO,MAAMA,eAAe,IACjB,WAAP,GACI,oBAACC,+BAA6BA,MAAAA,WAAAA,GAC1B,oBAACC,QAAMA;QAAC,oBAAM,oBAACC,MAAIA;QAAK,uBAAS,oBAACC,SAAOA"}
1
+ {"version":3,"file":"modules/redirects/RedirectsList/DocumentList.js","sources":["../../../../src/modules/redirects/RedirectsList/DocumentList.tsx"],"sourcesContent":["import React from \"react\";\nimport { Layout } from \"~/modules/redirects/RedirectsList/components/Layout/index.js\";\nimport { Main } from \"~/modules/redirects/RedirectsList/components/Main/index.js\";\nimport { Sidebar } from \"~/modules/redirects/RedirectsList/components/Sidebar/index.js\";\nimport { DocumentListPresenterProvider } from \"~/modules/redirects/RedirectsList/presenters/DocumentListPresenterContext.js\";\nimport { useDocumentListController } from \"~/modules/redirects/RedirectsList/useDocumentList.js\";\n\n/**\n * Separate component because the controller reads the presenter from context, so it has to run\n * below the provider.\n */\nconst DocumentListContent = () => {\n useDocumentListController();\n\n return <Layout main={<Main />} sidebar={<Sidebar />} />;\n};\n\nexport const DocumentList = () => {\n return (\n <DocumentListPresenterProvider>\n <DocumentListContent />\n </DocumentListPresenterProvider>\n );\n};\n"],"names":["DocumentListContent","useDocumentListController","Layout","Main","Sidebar","DocumentList","DocumentListPresenterProvider"],"mappings":";;;;;;AAWA,MAAMA,sBAAsB;IACxBC;IAEA,OAAO,WAAP,GAAO,oBAACC,QAAMA;QAAC,oBAAM,oBAACC,MAAIA;QAAK,uBAAS,oBAACC,SAAOA;;AACpD;AAEO,MAAMC,eAAe,IACjB,WAAP,GACI,oBAACC,+BAA6BA,MAAAA,WAAAA,GAC1B,oBAACN,qBAAmBA"}
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Reads the list view model. Safe to call from any number of components: it performs no data
3
+ * loading, so an extra consumer costs nothing.
4
+ *
5
+ * Loading belongs to `useDocumentListController`, which the list root calls exactly once. Keeping it
6
+ * here would mean every consumer issued its own `listRedirects` request on mount - Apollo's query
7
+ * deduplication collapses those into a single network request, so the cost is invisible rather than
8
+ * absent.
9
+ */
1
10
  export declare const useDocumentList: () => {
2
11
  vm: {
3
12
  folderId: string;
@@ -20,3 +29,8 @@ export declare const useDocumentList: () => {
20
29
  };
21
30
  showFilters: (show: boolean) => void;
22
31
  };
32
+ /**
33
+ * Owns the loading of the current folder. Must be called exactly once, by the list root - every call
34
+ * site runs its own copy of the effect below, and each copy issues a `listRedirects` request.
35
+ */
36
+ export declare const useDocumentListController: () => void;
@@ -5,13 +5,8 @@ import { useDocumentListPresenter } from "./presenters/DocumentListPresenterCont
5
5
  import { useFilterRedirects, useLoadRedirects } from "../../../features/redirects/index.js";
6
6
  import { useSelectRedirects } from "../../../features/redirects/selectRedirects/useSelectRedirects.js";
7
7
  const useDocumentList = ()=>{
8
- const isFirstLoad = useRef(true);
9
- const { folders, loadFolderHierarchy } = useLoadFolderHierarchy();
10
- const { listFoldersByParentIds } = useListFoldersByParentIds();
11
8
  const { currentFolderId } = useNavigateFolder();
12
- const { loadRedirects: listDocuments } = useLoadRedirects();
13
9
  const { filterRedirects: filterDocuments } = useFilterRedirects();
14
- const { selectRedirects: selectDocuments } = useSelectRedirects();
15
10
  const presenter = useDocumentListPresenter();
16
11
  const params = useMemo(()=>({
17
12
  folderId: currentFolderId
@@ -36,6 +31,19 @@ const useDocumentList = ()=>{
36
31
  }, [
37
32
  presenter
38
33
  ]);
34
+ return {
35
+ vm,
36
+ showFilters
37
+ };
38
+ };
39
+ const useDocumentListController = ()=>{
40
+ const isFirstLoad = useRef(true);
41
+ const { folders, loadFolderHierarchy } = useLoadFolderHierarchy();
42
+ const { listFoldersByParentIds } = useListFoldersByParentIds();
43
+ const { loadRedirects: listDocuments } = useLoadRedirects();
44
+ const { selectRedirects: selectDocuments } = useSelectRedirects();
45
+ const presenter = useDocumentListPresenter();
46
+ const { vm } = useDocumentList();
39
47
  useEffect(()=>{
40
48
  if (0 === folders.length) loadFolderHierarchy(vm.folderId);
41
49
  else listFoldersByParentIds([
@@ -51,11 +59,7 @@ const useDocumentList = ()=>{
51
59
  }, [
52
60
  vm.folderId
53
61
  ]);
54
- return {
55
- vm,
56
- showFilters
57
- };
58
62
  };
59
- export { useDocumentList };
63
+ export { useDocumentList, useDocumentListController };
60
64
 
61
65
  //# sourceMappingURL=useDocumentList.js.map