@webiny/app-website-builder 6.4.3-beta.0 → 6.4.3-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/features/pages/publishPage/PublishPage.test.js +43 -0
- package/features/pages/publishPage/PublishPage.test.js.map +1 -1
- package/features/pages/publishPage/PublishPageGateway.js +4 -1
- package/features/pages/publishPage/PublishPageGateway.js.map +1 -1
- package/features/pages/publishPage/PublishPageRepository.js +1 -5
- package/features/pages/publishPage/PublishPageRepository.js.map +1 -1
- package/features/pages/unpublishPage/UnpublishPage.test.js +38 -0
- package/features/pages/unpublishPage/UnpublishPage.test.js.map +1 -1
- package/features/pages/unpublishPage/UnpublishPageGateway.js +4 -1
- package/features/pages/unpublishPage/UnpublishPageGateway.js.map +1 -1
- package/features/pages/unpublishPage/UnpublishPageRepository.js +1 -5
- package/features/pages/unpublishPage/UnpublishPageRepository.js.map +1 -1
- package/features/pages/updatePage/UpdatePage.test.js +12 -2
- package/features/pages/updatePage/UpdatePage.test.js.map +1 -1
- package/features/pages/updatePage/UpdatePageGateway.js +4 -1
- package/features/pages/updatePage/UpdatePageGateway.js.map +1 -1
- package/features/pages/updatePage/UpdatePageRepository.js +1 -5
- package/features/pages/updatePage/UpdatePageRepository.js.map +1 -1
- package/modules/pages/PageEditor/TopBar/Title.js +10 -36
- package/modules/pages/PageEditor/TopBar/Title.js.map +1 -1
- package/package.json +23 -23
|
@@ -26,13 +26,18 @@ describe("PublishPage", ()=>{
|
|
|
26
26
|
},
|
|
27
27
|
bindings: {
|
|
28
28
|
data: "any-data"
|
|
29
|
+
},
|
|
30
|
+
extensions: {
|
|
31
|
+
ext1: "ext-data"
|
|
29
32
|
}
|
|
30
33
|
})
|
|
31
34
|
};
|
|
32
35
|
const pagesCache = pageListCache;
|
|
36
|
+
const detailsCache = fullPageCache;
|
|
33
37
|
beforeEach(()=>{
|
|
34
38
|
vi.clearAllMocks();
|
|
35
39
|
pagesCache.clear();
|
|
40
|
+
detailsCache.clear();
|
|
36
41
|
pagesCache.addItems([
|
|
37
42
|
Page.create({
|
|
38
43
|
id: "page-1#0001",
|
|
@@ -55,6 +60,31 @@ describe("PublishPage", ()=>{
|
|
|
55
60
|
}
|
|
56
61
|
})
|
|
57
62
|
]);
|
|
63
|
+
detailsCache.addItems([
|
|
64
|
+
Page.create({
|
|
65
|
+
id: "page-1#0001",
|
|
66
|
+
entryId: "page-1",
|
|
67
|
+
status: WbPageStatus.Draft,
|
|
68
|
+
location: {
|
|
69
|
+
folderId: "folder-1"
|
|
70
|
+
},
|
|
71
|
+
properties: {
|
|
72
|
+
title: "Page 1"
|
|
73
|
+
},
|
|
74
|
+
metadata: {
|
|
75
|
+
metadata: "data-1"
|
|
76
|
+
},
|
|
77
|
+
elements: {
|
|
78
|
+
element1: "element"
|
|
79
|
+
},
|
|
80
|
+
bindings: {
|
|
81
|
+
data: "any-data"
|
|
82
|
+
},
|
|
83
|
+
extensions: {
|
|
84
|
+
ext1: "ext-data"
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
]);
|
|
58
88
|
});
|
|
59
89
|
it("should be able to publish a page", async ()=>{
|
|
60
90
|
const container = new Container();
|
|
@@ -76,6 +106,19 @@ describe("PublishPage", ()=>{
|
|
|
76
106
|
const publishedItem = pagesCache.getItem((page)=>"page-1" === page.entryId);
|
|
77
107
|
expect(publishedItem?.id).toEqual("page-1#0001");
|
|
78
108
|
expect(publishedItem?.status).toEqual(WbPageStatus.Published);
|
|
109
|
+
const detailItem = detailsCache.getItem((page)=>"page-1" === page.entryId);
|
|
110
|
+
expect(detailItem).toBeDefined();
|
|
111
|
+
expect(detailItem?.id).toEqual("page-1#0001");
|
|
112
|
+
expect(detailItem?.status).toEqual(WbPageStatus.Published);
|
|
113
|
+
expect(detailItem?.elements).toMatchObject({
|
|
114
|
+
element1: "element"
|
|
115
|
+
});
|
|
116
|
+
expect(detailItem?.bindings).toMatchObject({
|
|
117
|
+
data: "any-data"
|
|
118
|
+
});
|
|
119
|
+
expect(detailItem?.extensions).toMatchObject({
|
|
120
|
+
ext1: "ext-data"
|
|
121
|
+
});
|
|
79
122
|
});
|
|
80
123
|
it("should not publish a page if id is missing", async ()=>{
|
|
81
124
|
const container = new Container();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/pages/publishPage/PublishPage.test.js","sources":["../../../../src/features/pages/publishPage/PublishPage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport {\n PublishPageUseCase as UseCaseAbstraction,\n PublishPageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { PublishPageUseCase } from \"./PublishPageUseCase.js\";\nimport { PublishPageRepository } from \"./PublishPageRepository.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"PublishPage\", () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n };\n\n const pagesCache = pageListCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n ]);\n });\n\n it(\"should be able to publish a page\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, fullPageCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCase);\n\n const publishPage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.id === \"page-1#0001\");\n expect(item?.id).toEqual(\"page-1#0001\");\n\n await publishPage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n expect(gateway.execute).toHaveBeenLastCalledWith(\"page-1#0001\");\n\n expect(pagesCache.hasItems()).toBeTrue();\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Published);\n });\n\n it(\"should not publish a page if id is missing\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, fullPageCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCase);\n\n const publishPage = container.resolve(UseCaseAbstraction);\n\n await publishPage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Draft);\n });\n});\n"],"names":["describe","gateway","vi","WbPageStatus","pagesCache","pageListCache","beforeEach","Page","it","container","Container","PageListCache","FullPageCache","
|
|
1
|
+
{"version":3,"file":"features/pages/publishPage/PublishPage.test.js","sources":["../../../../src/features/pages/publishPage/PublishPage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport {\n PublishPageUseCase as UseCaseAbstraction,\n PublishPageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { PublishPageUseCase } from \"./PublishPageUseCase.js\";\nimport { PublishPageRepository } from \"./PublishPageRepository.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"PublishPage\", () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n };\n\n const pagesCache = pageListCache;\n const detailsCache = fullPageCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n detailsCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n ]);\n detailsCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n ]);\n });\n\n it(\"should be able to publish a page\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, fullPageCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCase);\n\n const publishPage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.id === \"page-1#0001\");\n expect(item?.id).toEqual(\"page-1#0001\");\n\n await publishPage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n expect(gateway.execute).toHaveBeenLastCalledWith(\"page-1#0001\");\n\n expect(pagesCache.hasItems()).toBeTrue();\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Published);\n\n // Details cache is updated with the full gateway result including document fields\n const detailItem = detailsCache.getItem(page => page.entryId === \"page-1\");\n expect(detailItem).toBeDefined();\n expect(detailItem?.id).toEqual(\"page-1#0001\");\n expect(detailItem?.status).toEqual(WbPageStatus.Published);\n expect(detailItem?.elements).toMatchObject({ element1: \"element\" });\n expect(detailItem?.bindings).toMatchObject({ data: \"any-data\" });\n expect(detailItem?.extensions).toMatchObject({ ext1: \"ext-data\" });\n });\n\n it(\"should not publish a page if id is missing\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, fullPageCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(PublishPageRepository).inSingletonScope();\n container.register(PublishPageUseCase);\n\n const publishPage = container.resolve(UseCaseAbstraction);\n\n await publishPage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Draft);\n });\n});\n"],"names":["describe","gateway","vi","WbPageStatus","pagesCache","pageListCache","detailsCache","fullPageCache","beforeEach","Page","it","container","Container","PageListCache","FullPageCache","GatewayAbstraction","PublishPageRepository","PublishPageUseCase","publishPage","UseCaseAbstraction","expect","item","page","publishedItem","detailItem"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/pages/publishPage/PublishPageGateway.js","sources":["../../../../src/features/pages/publishPage/PublishPageGateway.ts"],"sourcesContent":["import { PublishPageGateway as GatewayAbstraction } from \"./abstractions.js\";\nimport type { PageGatewayDto } from \"~/features/pages/getPage/PageGatewayDto.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient\";\nimport { getPageGraphQLFields } from \"~/features/pages/shared/pageGraphQLFields.js\";\n\nconst PUBLISH_PAGE = /* GraphQL */ `\n mutation PublishPage($id: ID!) {\n websiteBuilder {\n publishPage(id: $id) {\n data {\n ${getPageGraphQLFields([\"properties\", \"metadata\"]).join(\"\\n\")}\n }\n error {\n code\n data\n message\n }\n }\n }\n }\n`;\n\ntype PublishPageResponse = {\n websiteBuilder: {\n publishPage:\n | { data: PageGatewayDto; error: null }\n | { data: null; error: { code: string; message: string; data: any } };\n };\n};\n\nclass PublishPageGatewayImpl implements GatewayAbstraction.Interface {\n constructor(private client: MainGraphQLClient.Interface) {}\n\n async execute(id: string): Promise<PageGatewayDto> {\n const response = await this.client.execute<PublishPageResponse>({\n query: PUBLISH_PAGE,\n variables: { id }\n });\n\n const envelope = response.websiteBuilder.publishPage;\n if (envelope.error) {\n throw new Error(envelope.error.message || \"Could not publish page.\");\n }\n\n return envelope.data;\n }\n}\n\nexport const PublishPageGateway = GatewayAbstraction.createImplementation({\n implementation: PublishPageGatewayImpl,\n dependencies: [MainGraphQLClient]\n});\n"],"names":["PUBLISH_PAGE","getPageGraphQLFields","PublishPageGatewayImpl","client","id","response","envelope","Error","PublishPageGateway","GatewayAbstraction","MainGraphQLClient"],"mappings":";;;AAKA,MAAMA,eAA6B,CAAC;;;;;oBAKhB,EAAEC,qBAAqB;IAAC;IAAc;
|
|
1
|
+
{"version":3,"file":"features/pages/publishPage/PublishPageGateway.js","sources":["../../../../src/features/pages/publishPage/PublishPageGateway.ts"],"sourcesContent":["import { PublishPageGateway as GatewayAbstraction } from \"./abstractions.js\";\nimport type { PageGatewayDto } from \"~/features/pages/getPage/PageGatewayDto.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient\";\nimport { getPageGraphQLFields } from \"~/features/pages/shared/pageGraphQLFields.js\";\n\nconst PUBLISH_PAGE = /* GraphQL */ `\n mutation PublishPage($id: ID!) {\n websiteBuilder {\n publishPage(id: $id) {\n data {\n ${getPageGraphQLFields([\"properties\", \"metadata\", \"bindings\", \"elements\", \"extensions\"]).join(\"\\n\")}\n }\n error {\n code\n data\n message\n }\n }\n }\n }\n`;\n\ntype PublishPageResponse = {\n websiteBuilder: {\n publishPage:\n | { data: PageGatewayDto; error: null }\n | { data: null; error: { code: string; message: string; data: any } };\n };\n};\n\nclass PublishPageGatewayImpl implements GatewayAbstraction.Interface {\n constructor(private client: MainGraphQLClient.Interface) {}\n\n async execute(id: string): Promise<PageGatewayDto> {\n const response = await this.client.execute<PublishPageResponse>({\n query: PUBLISH_PAGE,\n variables: { id }\n });\n\n const envelope = response.websiteBuilder.publishPage;\n if (envelope.error) {\n throw new Error(envelope.error.message || \"Could not publish page.\");\n }\n\n return envelope.data;\n }\n}\n\nexport const PublishPageGateway = GatewayAbstraction.createImplementation({\n implementation: PublishPageGatewayImpl,\n dependencies: [MainGraphQLClient]\n});\n"],"names":["PUBLISH_PAGE","getPageGraphQLFields","PublishPageGatewayImpl","client","id","response","envelope","Error","PublishPageGateway","GatewayAbstraction","MainGraphQLClient"],"mappings":";;;AAKA,MAAMA,eAA6B,CAAC;;;;;oBAKhB,EAAEC,qBAAqB;IAAC;IAAc;IAAY;IAAY;IAAY;CAAa,EAAE,IAAI,CAAC,MAAM;;;;;;;;;;AAUxH,CAAC;AAUD,MAAMC;IACF,YAAoBC,MAAmC,CAAE;aAArCA,MAAM,GAANA;IAAsC;IAE1D,MAAM,QAAQC,EAAU,EAA2B;QAC/C,MAAMC,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAsB;YAC5D,OAAOL;YACP,WAAW;gBAAEI;YAAG;QACpB;QAEA,MAAME,WAAWD,SAAS,cAAc,CAAC,WAAW;QACpD,IAAIC,SAAS,KAAK,EACd,MAAM,IAAIC,MAAMD,SAAS,KAAK,CAAC,OAAO,IAAI;QAG9C,OAAOA,SAAS,IAAI;IACxB;AACJ;AAEO,MAAME,wCAAqBC,mBAAAA,oBAAuC,CAAC;IACtE,gBAAgBP;IAChB,cAAc;QAACQ;KAAkB;AACrC"}
|
|
@@ -14,11 +14,7 @@ class PublishPageRepositoryImpl {
|
|
|
14
14
|
return existingPage;
|
|
15
15
|
});
|
|
16
16
|
this.detailsCache.updateItems((existingPage)=>{
|
|
17
|
-
if (existingPage.id === page.id) return Page.create(
|
|
18
|
-
...result,
|
|
19
|
-
elements: page.elements,
|
|
20
|
-
bindings: page.bindings
|
|
21
|
-
});
|
|
17
|
+
if (existingPage.id === page.id) return Page.create(result);
|
|
22
18
|
return existingPage;
|
|
23
19
|
});
|
|
24
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/pages/publishPage/PublishPageRepository.js","sources":["../../../../src/features/pages/publishPage/PublishPageRepository.ts"],"sourcesContent":["import {\n PublishPageRepository as RepositoryAbstraction,\n PublishPageGateway\n} from \"./abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\nclass PublishPageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private gateway: PublishPageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const result = await this.gateway.execute(page.id);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(
|
|
1
|
+
{"version":3,"file":"features/pages/publishPage/PublishPageRepository.js","sources":["../../../../src/features/pages/publishPage/PublishPageRepository.ts"],"sourcesContent":["import {\n PublishPageRepository as RepositoryAbstraction,\n PublishPageGateway\n} from \"./abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\nclass PublishPageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private gateway: PublishPageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const result = await this.gateway.execute(page.id);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n }\n}\n\nexport const PublishPageRepository = RepositoryAbstraction.createImplementation({\n implementation: PublishPageRepositoryImpl,\n dependencies: [PageListCache, FullPageCache, PublishPageGateway]\n});\n"],"names":["PublishPageRepositoryImpl","listCache","detailsCache","gateway","page","result","existingPage","Page","PublishPageRepository","RepositoryAbstraction","PageListCache","FullPageCache","PublishPageGateway"],"mappings":";;;AAOA,MAAMA;IACF,YACYC,SAAkC,EAClCC,YAAqC,EACrCC,OAAqC,CAC/C;aAHUF,SAAS,GAATA;aACAC,YAAY,GAAZA;aACAC,OAAO,GAAPA;IACT;IAEH,MAAM,QAAQC,IAAU,EAAE;QACtB,MAAMC,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAACD,KAAK,EAAE;QAEjD,IAAI,CAAC,SAAS,CAAC,WAAW,CAACE,CAAAA;YACvB,IAAIA,aAAa,EAAE,KAAKF,KAAK,EAAE,EAC3B,OAAOG,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;QAEA,IAAI,CAAC,YAAY,CAAC,WAAW,CAACA,CAAAA;YAC1B,IAAIA,aAAa,EAAE,KAAKF,KAAK,EAAE,EAC3B,OAAOG,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;IACJ;AACJ;AAEO,MAAME,8CAAwBC,sBAAAA,oBAA0C,CAAC;IAC5E,gBAAgBT;IAChB,cAAc;QAACU;QAAeC;QAAeC;KAAmB;AACpE"}
|
|
@@ -26,6 +26,9 @@ describe("UnpublishPage", ()=>{
|
|
|
26
26
|
},
|
|
27
27
|
bindings: {
|
|
28
28
|
data: "any-data"
|
|
29
|
+
},
|
|
30
|
+
extensions: {
|
|
31
|
+
ext1: "ext-data"
|
|
29
32
|
}
|
|
30
33
|
})
|
|
31
34
|
};
|
|
@@ -54,6 +57,28 @@ describe("UnpublishPage", ()=>{
|
|
|
54
57
|
}
|
|
55
58
|
})
|
|
56
59
|
]);
|
|
60
|
+
detailsCache.addItems([
|
|
61
|
+
Page.create({
|
|
62
|
+
id: "page-1#0001",
|
|
63
|
+
entryId: "page-1",
|
|
64
|
+
status: WbPageStatus.Published,
|
|
65
|
+
location: {
|
|
66
|
+
folderId: "folder-1"
|
|
67
|
+
},
|
|
68
|
+
properties: {
|
|
69
|
+
title: "Page 1"
|
|
70
|
+
},
|
|
71
|
+
elements: {
|
|
72
|
+
element1: "element"
|
|
73
|
+
},
|
|
74
|
+
bindings: {
|
|
75
|
+
data: "any-data"
|
|
76
|
+
},
|
|
77
|
+
extensions: {
|
|
78
|
+
ext1: "ext-data"
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
]);
|
|
57
82
|
});
|
|
58
83
|
it("should be able to unpublish a page", async ()=>{
|
|
59
84
|
const container = new Container();
|
|
@@ -75,6 +100,19 @@ describe("UnpublishPage", ()=>{
|
|
|
75
100
|
const publishedItem = pagesCache.getItem((page)=>"page-1" === page.entryId);
|
|
76
101
|
expect(publishedItem?.id).toEqual("page-1#0001");
|
|
77
102
|
expect(publishedItem?.status).toEqual(WbPageStatus.Unpublished);
|
|
103
|
+
const detailItem = detailsCache.getItem((page)=>"page-1" === page.entryId);
|
|
104
|
+
expect(detailItem).toBeDefined();
|
|
105
|
+
expect(detailItem?.id).toEqual("page-1#0001");
|
|
106
|
+
expect(detailItem?.status).toEqual(WbPageStatus.Unpublished);
|
|
107
|
+
expect(detailItem?.elements).toMatchObject({
|
|
108
|
+
element1: "element"
|
|
109
|
+
});
|
|
110
|
+
expect(detailItem?.bindings).toMatchObject({
|
|
111
|
+
data: "any-data"
|
|
112
|
+
});
|
|
113
|
+
expect(detailItem?.extensions).toMatchObject({
|
|
114
|
+
ext1: "ext-data"
|
|
115
|
+
});
|
|
78
116
|
});
|
|
79
117
|
it("should not unpublish a page if id is missing", async ()=>{
|
|
80
118
|
const container = new Container();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/pages/unpublishPage/UnpublishPage.test.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport {\n UnpublishPageUseCase as UseCaseAbstraction,\n UnpublishPageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { UnpublishPageUseCase } from \"./UnpublishPageUseCase.js\";\nimport { UnpublishPageRepository } from \"./UnpublishPageRepository.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"UnpublishPage\", () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Unpublished,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n };\n\n const pagesCache = pageListCache;\n const detailsCache = fullPageCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n detailsCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n ]);\n });\n\n it(\"should be able to unpublish a page\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UnpublishPageRepository).inSingletonScope();\n container.register(UnpublishPageUseCase);\n\n const unpublishPage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.id === \"page-1#0001\");\n expect(item?.id).toEqual(\"page-1#0001\");\n\n await unpublishPage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n expect(gateway.execute).toHaveBeenLastCalledWith(\"page-1#0001\");\n\n expect(pagesCache.hasItems()).toBeTrue();\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Unpublished);\n });\n\n it(\"should not unpublish a page if id is missing\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UnpublishPageRepository).inSingletonScope();\n container.register(UnpublishPageUseCase);\n\n const unpublishPage = container.resolve(UseCaseAbstraction);\n\n await unpublishPage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Published);\n });\n});\n"],"names":["describe","gateway","vi","WbPageStatus","pagesCache","pageListCache","detailsCache","fullPageCache","beforeEach","Page","it","container","Container","PageListCache","FullPageCache","GatewayAbstraction","UnpublishPageRepository","UnpublishPageUseCase","unpublishPage","UseCaseAbstraction","expect","item","page","publishedItem"],"mappings":";;;;;;;;AAYAA,SAAS,iBAAiB;IACtB,MAAMC,UAAU;QACZ,SAASC,GAAG,EAAE,GAAG,iBAAiB,CAAC;YAC/B,IAAI;YACJ,SAAS;YACT,QAAQC,aAAa,WAAW;YAChC,UAAU;gBACN,UAAU;YACd;YACA,YAAY;gBACR,OAAO;YACX;YACA,UAAU;gBACN,UAAU;YACd;YACA,UAAU;gBACN,UAAU;YACd;YACA,UAAU;gBACN,MAAM;YACV;QACJ;IACJ;IAEA,MAAMC,aAAaC;IACnB,MAAMC,eAAeC;IAErBC,WAAW;QACPN,GAAG,aAAa;QAChBE,WAAW,KAAK;QAChBE,aAAa,KAAK;QAClBF,WAAW,QAAQ,CAAC;YAChBK,KAAK,MAAM,CAAC;gBACR,IAAI;gBACJ,SAAS;gBACT,QAAQN,aAAa,SAAS;gBAC9B,UAAU;oBACN,UAAU;gBACd;gBACA,YAAY;oBACR,OAAO;gBACX;gBACA,UAAU;oBACN,UAAU;gBACd;gBACA,UAAU;oBACN,MAAM;gBACV;YACJ;SACH;IACL;IAEAO,GAAG,sCAAsC;QACrC,MAAMC,YAAY,IAAIC;QACtBD,UAAU,gBAAgB,CAACE,eAAeT;QAC1CO,UAAU,gBAAgB,CAACG,eAAeR;QAC1CK,UAAU,gBAAgB,CAACI,sBAAoBd;QAC/CU,UAAU,QAAQ,CAACK,yBAAyB,gBAAgB;QAC5DL,UAAU,QAAQ,CAACM;QAEnB,MAAMC,gBAAgBP,UAAU,OAAO,CAACQ;QAExCC,OAAOhB,WAAW,QAAQ,IAAI,QAAQ;QACtC,MAAMiB,OAAOjB,WAAW,OAAO,CAACkB,CAAAA,OAAQA,AAAY,kBAAZA,KAAK,EAAE;QAC/CF,OAAOC,MAAM,IAAI,OAAO,CAAC;QAEzB,MAAMH,cAAc,OAAO,CAAC;YACxB,IAAI;QACR;QAEAE,OAAOnB,QAAQ,OAAO,EAAE,qBAAqB,CAAC;QAC9CmB,OAAOnB,QAAQ,OAAO,EAAE,wBAAwB,CAAC;QAEjDmB,OAAOhB,WAAW,QAAQ,IAAI,QAAQ;QACtC,MAAMmB,gBAAgBnB,WAAW,OAAO,CAACkB,CAAAA,OAAQA,AAAiB,aAAjBA,KAAK,OAAO;QAE7DF,OAAOG,eAAe,IAAI,OAAO,CAAC;QAClCH,OAAOG,eAAe,QAAQ,OAAO,CAACpB,aAAa,WAAW;
|
|
1
|
+
{"version":3,"file":"features/pages/unpublishPage/UnpublishPage.test.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport {\n UnpublishPageUseCase as UseCaseAbstraction,\n UnpublishPageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { UnpublishPageUseCase } from \"./UnpublishPageUseCase.js\";\nimport { UnpublishPageRepository } from \"./UnpublishPageRepository.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"UnpublishPage\", () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Unpublished,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n metadata: \"data-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n };\n\n const pagesCache = pageListCache;\n const detailsCache = fullPageCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n detailsCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n }\n })\n ]);\n detailsCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Published,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n extensions: {\n ext1: \"ext-data\"\n }\n })\n ]);\n });\n\n it(\"should be able to unpublish a page\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UnpublishPageRepository).inSingletonScope();\n container.register(UnpublishPageUseCase);\n\n const unpublishPage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.id === \"page-1#0001\");\n expect(item?.id).toEqual(\"page-1#0001\");\n\n await unpublishPage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n expect(gateway.execute).toHaveBeenLastCalledWith(\"page-1#0001\");\n\n expect(pagesCache.hasItems()).toBeTrue();\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Unpublished);\n\n // Details cache is updated with the full gateway result including document fields\n const detailItem = detailsCache.getItem(page => page.entryId === \"page-1\");\n expect(detailItem).toBeDefined();\n expect(detailItem?.id).toEqual(\"page-1#0001\");\n expect(detailItem?.status).toEqual(WbPageStatus.Unpublished);\n expect(detailItem?.elements).toMatchObject({ element1: \"element\" });\n expect(detailItem?.bindings).toMatchObject({ data: \"any-data\" });\n expect(detailItem?.extensions).toMatchObject({ ext1: \"ext-data\" });\n });\n\n it(\"should not unpublish a page if id is missing\", async () => {\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UnpublishPageRepository).inSingletonScope();\n container.register(UnpublishPageUseCase);\n\n const unpublishPage = container.resolve(UseCaseAbstraction);\n\n await unpublishPage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n const publishedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(publishedItem?.id).toEqual(\"page-1#0001\");\n expect(publishedItem?.status).toEqual(WbPageStatus.Published);\n });\n});\n"],"names":["describe","gateway","vi","WbPageStatus","pagesCache","pageListCache","detailsCache","fullPageCache","beforeEach","Page","it","container","Container","PageListCache","FullPageCache","GatewayAbstraction","UnpublishPageRepository","UnpublishPageUseCase","unpublishPage","UseCaseAbstraction","expect","item","page","publishedItem","detailItem"],"mappings":";;;;;;;;AAYAA,SAAS,iBAAiB;IACtB,MAAMC,UAAU;QACZ,SAASC,GAAG,EAAE,GAAG,iBAAiB,CAAC;YAC/B,IAAI;YACJ,SAAS;YACT,QAAQC,aAAa,WAAW;YAChC,UAAU;gBACN,UAAU;YACd;YACA,YAAY;gBACR,OAAO;YACX;YACA,UAAU;gBACN,UAAU;YACd;YACA,UAAU;gBACN,UAAU;YACd;YACA,UAAU;gBACN,MAAM;YACV;YACA,YAAY;gBACR,MAAM;YACV;QACJ;IACJ;IAEA,MAAMC,aAAaC;IACnB,MAAMC,eAAeC;IAErBC,WAAW;QACPN,GAAG,aAAa;QAChBE,WAAW,KAAK;QAChBE,aAAa,KAAK;QAClBF,WAAW,QAAQ,CAAC;YAChBK,KAAK,MAAM,CAAC;gBACR,IAAI;gBACJ,SAAS;gBACT,QAAQN,aAAa,SAAS;gBAC9B,UAAU;oBACN,UAAU;gBACd;gBACA,YAAY;oBACR,OAAO;gBACX;gBACA,UAAU;oBACN,UAAU;gBACd;gBACA,UAAU;oBACN,MAAM;gBACV;YACJ;SACH;QACDG,aAAa,QAAQ,CAAC;YAClBG,KAAK,MAAM,CAAC;gBACR,IAAI;gBACJ,SAAS;gBACT,QAAQN,aAAa,SAAS;gBAC9B,UAAU;oBACN,UAAU;gBACd;gBACA,YAAY;oBACR,OAAO;gBACX;gBACA,UAAU;oBACN,UAAU;gBACd;gBACA,UAAU;oBACN,MAAM;gBACV;gBACA,YAAY;oBACR,MAAM;gBACV;YACJ;SACH;IACL;IAEAO,GAAG,sCAAsC;QACrC,MAAMC,YAAY,IAAIC;QACtBD,UAAU,gBAAgB,CAACE,eAAeT;QAC1CO,UAAU,gBAAgB,CAACG,eAAeR;QAC1CK,UAAU,gBAAgB,CAACI,sBAAoBd;QAC/CU,UAAU,QAAQ,CAACK,yBAAyB,gBAAgB;QAC5DL,UAAU,QAAQ,CAACM;QAEnB,MAAMC,gBAAgBP,UAAU,OAAO,CAACQ;QAExCC,OAAOhB,WAAW,QAAQ,IAAI,QAAQ;QACtC,MAAMiB,OAAOjB,WAAW,OAAO,CAACkB,CAAAA,OAAQA,AAAY,kBAAZA,KAAK,EAAE;QAC/CF,OAAOC,MAAM,IAAI,OAAO,CAAC;QAEzB,MAAMH,cAAc,OAAO,CAAC;YACxB,IAAI;QACR;QAEAE,OAAOnB,QAAQ,OAAO,EAAE,qBAAqB,CAAC;QAC9CmB,OAAOnB,QAAQ,OAAO,EAAE,wBAAwB,CAAC;QAEjDmB,OAAOhB,WAAW,QAAQ,IAAI,QAAQ;QACtC,MAAMmB,gBAAgBnB,WAAW,OAAO,CAACkB,CAAAA,OAAQA,AAAiB,aAAjBA,KAAK,OAAO;QAE7DF,OAAOG,eAAe,IAAI,OAAO,CAAC;QAClCH,OAAOG,eAAe,QAAQ,OAAO,CAACpB,aAAa,WAAW;QAG9D,MAAMqB,aAAalB,aAAa,OAAO,CAACgB,CAAAA,OAAQA,AAAiB,aAAjBA,KAAK,OAAO;QAC5DF,OAAOI,YAAY,WAAW;QAC9BJ,OAAOI,YAAY,IAAI,OAAO,CAAC;QAC/BJ,OAAOI,YAAY,QAAQ,OAAO,CAACrB,aAAa,WAAW;QAC3DiB,OAAOI,YAAY,UAAU,aAAa,CAAC;YAAE,UAAU;QAAU;QACjEJ,OAAOI,YAAY,UAAU,aAAa,CAAC;YAAE,MAAM;QAAW;QAC9DJ,OAAOI,YAAY,YAAY,aAAa,CAAC;YAAE,MAAM;QAAW;IACpE;IAEAd,GAAG,gDAAgD;QAC/C,MAAMC,YAAY,IAAIC;QACtBD,UAAU,gBAAgB,CAACE,eAAeT;QAC1CO,UAAU,gBAAgB,CAACG,eAAeR;QAC1CK,UAAU,gBAAgB,CAACI,sBAAoBd;QAC/CU,UAAU,QAAQ,CAACK,yBAAyB,gBAAgB;QAC5DL,UAAU,QAAQ,CAACM;QAEnB,MAAMC,gBAAgBP,UAAU,OAAO,CAACQ;QAExC,MAAMD,cAAc,OAAO,CAAC;YACxB,IAAI;QACR;QAEAE,OAAOnB,QAAQ,OAAO,EAAE,qBAAqB,CAAC;QAE9C,MAAMsB,gBAAgBnB,WAAW,OAAO,CAACkB,CAAAA,OAAQA,AAAiB,aAAjBA,KAAK,OAAO;QAE7DF,OAAOG,eAAe,IAAI,OAAO,CAAC;QAClCH,OAAOG,eAAe,QAAQ,OAAO,CAACpB,aAAa,SAAS;IAChE;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/pages/unpublishPage/UnpublishPageGateway.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPageGateway.ts"],"sourcesContent":["import { UnpublishPageGateway as GatewayAbstraction } from \"./abstractions.js\";\nimport type { PageGatewayDto } from \"~/features/pages/getPage/PageGatewayDto.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient\";\nimport { getPageGraphQLFields } from \"~/features/pages/shared/pageGraphQLFields.js\";\n\nconst UNPUBLISH_PAGE = /* GraphQL */ `\n mutation UnpublishPage($id: ID!) {\n websiteBuilder {\n unpublishPage(id: $id) {\n data {\n ${getPageGraphQLFields([\"properties\", \"metadata\"]).join(\"\\n\")}\n }\n error {\n code\n data\n message\n }\n }\n }\n }\n`;\n\ntype UnpublishPageResponse = {\n websiteBuilder: {\n unpublishPage:\n | { data: PageGatewayDto; error: null }\n | { data: null; error: { code: string; message: string; data: any } };\n };\n};\n\nclass UnpublishPageGatewayImpl implements GatewayAbstraction.Interface {\n constructor(private client: MainGraphQLClient.Interface) {}\n\n async execute(id: string): Promise<PageGatewayDto> {\n const response = await this.client.execute<UnpublishPageResponse>({\n query: UNPUBLISH_PAGE,\n variables: { id }\n });\n\n const envelope = response.websiteBuilder.unpublishPage;\n if (envelope.error) {\n throw new Error(envelope.error.message || \"Could not unpublish page.\");\n }\n\n return envelope.data;\n }\n}\n\nexport const UnpublishPageGateway = GatewayAbstraction.createImplementation({\n implementation: UnpublishPageGatewayImpl,\n dependencies: [MainGraphQLClient]\n});\n"],"names":["UNPUBLISH_PAGE","getPageGraphQLFields","UnpublishPageGatewayImpl","client","id","response","envelope","Error","UnpublishPageGateway","GatewayAbstraction","MainGraphQLClient"],"mappings":";;;AAKA,MAAMA,iBAA+B,CAAC;;;;;oBAKlB,EAAEC,qBAAqB;IAAC;IAAc;
|
|
1
|
+
{"version":3,"file":"features/pages/unpublishPage/UnpublishPageGateway.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPageGateway.ts"],"sourcesContent":["import { UnpublishPageGateway as GatewayAbstraction } from \"./abstractions.js\";\nimport type { PageGatewayDto } from \"~/features/pages/getPage/PageGatewayDto.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient\";\nimport { getPageGraphQLFields } from \"~/features/pages/shared/pageGraphQLFields.js\";\n\nconst UNPUBLISH_PAGE = /* GraphQL */ `\n mutation UnpublishPage($id: ID!) {\n websiteBuilder {\n unpublishPage(id: $id) {\n data {\n ${getPageGraphQLFields([\"properties\", \"metadata\", \"bindings\", \"elements\", \"extensions\"]).join(\"\\n\")}\n }\n error {\n code\n data\n message\n }\n }\n }\n }\n`;\n\ntype UnpublishPageResponse = {\n websiteBuilder: {\n unpublishPage:\n | { data: PageGatewayDto; error: null }\n | { data: null; error: { code: string; message: string; data: any } };\n };\n};\n\nclass UnpublishPageGatewayImpl implements GatewayAbstraction.Interface {\n constructor(private client: MainGraphQLClient.Interface) {}\n\n async execute(id: string): Promise<PageGatewayDto> {\n const response = await this.client.execute<UnpublishPageResponse>({\n query: UNPUBLISH_PAGE,\n variables: { id }\n });\n\n const envelope = response.websiteBuilder.unpublishPage;\n if (envelope.error) {\n throw new Error(envelope.error.message || \"Could not unpublish page.\");\n }\n\n return envelope.data;\n }\n}\n\nexport const UnpublishPageGateway = GatewayAbstraction.createImplementation({\n implementation: UnpublishPageGatewayImpl,\n dependencies: [MainGraphQLClient]\n});\n"],"names":["UNPUBLISH_PAGE","getPageGraphQLFields","UnpublishPageGatewayImpl","client","id","response","envelope","Error","UnpublishPageGateway","GatewayAbstraction","MainGraphQLClient"],"mappings":";;;AAKA,MAAMA,iBAA+B,CAAC;;;;;oBAKlB,EAAEC,qBAAqB;IAAC;IAAc;IAAY;IAAY;IAAY;CAAa,EAAE,IAAI,CAAC,MAAM;;;;;;;;;;AAUxH,CAAC;AAUD,MAAMC;IACF,YAAoBC,MAAmC,CAAE;aAArCA,MAAM,GAANA;IAAsC;IAE1D,MAAM,QAAQC,EAAU,EAA2B;QAC/C,MAAMC,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAwB;YAC9D,OAAOL;YACP,WAAW;gBAAEI;YAAG;QACpB;QAEA,MAAME,WAAWD,SAAS,cAAc,CAAC,aAAa;QACtD,IAAIC,SAAS,KAAK,EACd,MAAM,IAAIC,MAAMD,SAAS,KAAK,CAAC,OAAO,IAAI;QAG9C,OAAOA,SAAS,IAAI;IACxB;AACJ;AAEO,MAAME,4CAAuBC,qBAAAA,oBAAuC,CAAC;IACxE,gBAAgBP;IAChB,cAAc;QAACQ;KAAkB;AACrC"}
|
|
@@ -14,11 +14,7 @@ class UnpublishPageRepositoryImpl {
|
|
|
14
14
|
return existingPage;
|
|
15
15
|
});
|
|
16
16
|
this.detailsCache.updateItems((existingPage)=>{
|
|
17
|
-
if (existingPage.id === page.id) return Page.create(
|
|
18
|
-
...result,
|
|
19
|
-
elements: page.elements,
|
|
20
|
-
bindings: page.bindings
|
|
21
|
-
});
|
|
17
|
+
if (existingPage.id === page.id) return Page.create(result);
|
|
22
18
|
return existingPage;
|
|
23
19
|
});
|
|
24
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/pages/unpublishPage/UnpublishPageRepository.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPageRepository.ts"],"sourcesContent":["import {\n UnpublishPageRepository as RepositoryAbstraction,\n UnpublishPageGateway\n} from \"./abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\nclass UnpublishPageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private gateway: UnpublishPageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const result = await this.gateway.execute(page.id);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(
|
|
1
|
+
{"version":3,"file":"features/pages/unpublishPage/UnpublishPageRepository.js","sources":["../../../../src/features/pages/unpublishPage/UnpublishPageRepository.ts"],"sourcesContent":["import {\n UnpublishPageRepository as RepositoryAbstraction,\n UnpublishPageGateway\n} from \"./abstractions.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\nclass UnpublishPageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private gateway: UnpublishPageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const result = await this.gateway.execute(page.id);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n }\n}\n\nexport const UnpublishPageRepository = RepositoryAbstraction.createImplementation({\n implementation: UnpublishPageRepositoryImpl,\n dependencies: [PageListCache, FullPageCache, UnpublishPageGateway]\n});\n"],"names":["UnpublishPageRepositoryImpl","listCache","detailsCache","gateway","page","result","existingPage","Page","UnpublishPageRepository","RepositoryAbstraction","PageListCache","FullPageCache","UnpublishPageGateway"],"mappings":";;;AAOA,MAAMA;IACF,YACYC,SAAkC,EAClCC,YAAqC,EACrCC,OAAuC,CACjD;aAHUF,SAAS,GAATA;aACAC,YAAY,GAAZA;aACAC,OAAO,GAAPA;IACT;IAEH,MAAM,QAAQC,IAAU,EAAE;QACtB,MAAMC,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAACD,KAAK,EAAE;QAEjD,IAAI,CAAC,SAAS,CAAC,WAAW,CAACE,CAAAA;YACvB,IAAIA,aAAa,EAAE,KAAKF,KAAK,EAAE,EAC3B,OAAOG,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;QAEA,IAAI,CAAC,YAAY,CAAC,WAAW,CAACA,CAAAA;YAC1B,IAAIA,aAAa,EAAE,KAAKF,KAAK,EAAE,EAC3B,OAAOG,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;IACJ;AACJ;AAEO,MAAME,kDAA0BC,wBAAAA,oBAA0C,CAAC;IAC9E,gBAAgBT;IAChB,cAAc;QAACU;QAAeC;QAAeC;KAAqB;AACtE"}
|
|
@@ -80,6 +80,9 @@ describe("UpdatePage", ()=>{
|
|
|
80
80
|
},
|
|
81
81
|
bindings: {
|
|
82
82
|
data: "any-data-updated"
|
|
83
|
+
},
|
|
84
|
+
extensions: {
|
|
85
|
+
ext1: "ext-data-updated"
|
|
83
86
|
}
|
|
84
87
|
})
|
|
85
88
|
};
|
|
@@ -135,8 +138,15 @@ describe("UpdatePage", ()=>{
|
|
|
135
138
|
expect(detailItem?.metadata).toMatchObject({
|
|
136
139
|
data: "metadata-1-updated"
|
|
137
140
|
});
|
|
138
|
-
expect(detailItem?.elements).toMatchObject({
|
|
139
|
-
|
|
141
|
+
expect(detailItem?.elements).toMatchObject({
|
|
142
|
+
element1: "element-updated"
|
|
143
|
+
});
|
|
144
|
+
expect(detailItem?.bindings).toMatchObject({
|
|
145
|
+
data: "any-data-updated"
|
|
146
|
+
});
|
|
147
|
+
expect(detailItem?.extensions).toMatchObject({
|
|
148
|
+
ext1: "ext-data-updated"
|
|
149
|
+
});
|
|
140
150
|
});
|
|
141
151
|
it("should not update a page if id is missing", async ()=>{
|
|
142
152
|
const gateway = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/pages/updatePage/UpdatePage.test.js","sources":["../../../../src/features/pages/updatePage/UpdatePage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport {\n UpdatePageUseCase as UseCaseAbstraction,\n UpdatePageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { UpdatePageUseCase } from \"./UpdatePageUseCase.js\";\nimport { UpdatePageRepository } from \"./UpdatePageRepository.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"UpdatePage\", () => {\n const pagesCache = pageListCache;\n const detailsCache = fullPageCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n detailsCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n data: \"metadata-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n revisionDescription: undefined\n })\n ]);\n detailsCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n data: \"metadata-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n revisionDescription: undefined\n })\n ]);\n });\n\n it(\"should be able to update a page\", async () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1 - Updated\"\n },\n metadata: {\n data: \"metadata-1-updated\"\n },\n elements: {\n element1: \"element-updated\"\n },\n bindings: {\n data: \"any-data-updated\"\n }\n })\n };\n\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UpdatePageRepository).inSingletonScope();\n container.register(UpdatePageUseCase);\n\n const updatePage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(item?.id).toEqual(\"page-1#0001\");\n expect(item?.entryId).toEqual(\"page-1\");\n expect(item?.properties).toMatchObject({\n title: \"Page 1\"\n });\n expect(item?.elements).toMatchObject({\n element1: \"element\"\n });\n expect(item?.metadata).toMatchObject({\n data: \"metadata-1\"\n });\n expect(item?.bindings).toMatchObject({\n data: \"any-data\"\n });\n\n await updatePage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n // List cache gets full replacement from gateway result\n const updatedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n expect(updatedItem).toBeDefined();\n expect(updatedItem?.id).toEqual(\"page-1#0001\");\n expect(updatedItem?.entryId).toEqual(\"page-1\");\n expect(updatedItem?.properties).toMatchObject({\n title: \"Page 1 - Updated\"\n });\n expect(updatedItem?.elements).toMatchObject({\n element1: \"element-updated\"\n });\n expect(updatedItem?.metadata).toMatchObject({\n data: \"metadata-1-updated\"\n });\n expect(updatedItem?.bindings).toMatchObject({\n data: \"any-data-updated\"\n });\n\n // Details cache preserves elements and bindings from the DTO (sent data)\n const detailItem = detailsCache.getItem(page => page.entryId === \"page-1\");\n expect(detailItem).toBeDefined();\n expect(detailItem?.id).toEqual(\"page-1#0001\");\n expect(detailItem?.properties).toMatchObject({\n title: \"Page 1 - Updated\"\n });\n expect(detailItem?.metadata).toMatchObject({\n data: \"metadata-1-updated\"\n });\n // elements and bindings come from the DTO (sent data), not the gateway result\n expect(detailItem?.elements).toMatchObject({});\n expect(detailItem?.bindings).toMatchObject({});\n });\n\n it(\"should not update a page if id is missing\", async () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue(null)\n };\n\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UpdatePageRepository).inSingletonScope();\n container.register(UpdatePageUseCase);\n\n const updatePage = container.resolve(UseCaseAbstraction);\n\n await updatePage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n const updatedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(updatedItem).toBeDefined();\n expect(updatedItem?.id).toEqual(\"page-1#0001\");\n expect(updatedItem?.entryId).toEqual(\"page-1\");\n expect(updatedItem?.properties).toMatchObject({\n title: \"Page 1\"\n });\n expect(updatedItem?.elements).toMatchObject({\n element1: \"element\"\n });\n expect(updatedItem?.metadata).toMatchObject({\n data: \"metadata-1\"\n });\n expect(updatedItem?.bindings).toMatchObject({\n data: \"any-data\"\n });\n });\n\n it(\"should handle gateway errors gracefully\", async () => {\n const gateway = {\n execute: vi.fn().mockRejectedValue(new Error(\"Gateway error\"))\n };\n\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UpdatePageRepository).inSingletonScope();\n container.register(UpdatePageUseCase);\n\n const updatePage = container.resolve(UseCaseAbstraction);\n\n await expect(\n updatePage.execute({\n id: \"page-1#0001\"\n })\n ).rejects.toThrow(\"Gateway error\");\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n });\n});\n"],"names":["describe","pagesCache","pageListCache","detailsCache","fullPageCache","beforeEach","vi","Page","WbPageStatus","undefined","it","gateway","container","Container","PageListCache","FullPageCache","GatewayAbstraction","UpdatePageRepository","UpdatePageUseCase","updatePage","UseCaseAbstraction","expect","item","page","updatedItem","detailItem","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"features/pages/updatePage/UpdatePage.test.js","sources":["../../../../src/features/pages/updatePage/UpdatePage.test.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { WbPageStatus } from \"~/constants.js\";\nimport { Page, pageListCache, fullPageCache } from \"~/domain/Page/index.js\";\nimport {\n UpdatePageUseCase as UseCaseAbstraction,\n UpdatePageGateway as GatewayAbstraction\n} from \"./abstractions.js\";\nimport { UpdatePageUseCase } from \"./UpdatePageUseCase.js\";\nimport { UpdatePageRepository } from \"./UpdatePageRepository.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\ndescribe(\"UpdatePage\", () => {\n const pagesCache = pageListCache;\n const detailsCache = fullPageCache;\n\n beforeEach(() => {\n vi.clearAllMocks();\n pagesCache.clear();\n detailsCache.clear();\n pagesCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n data: \"metadata-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n revisionDescription: undefined\n })\n ]);\n detailsCache.addItems([\n Page.create({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1\"\n },\n metadata: {\n data: \"metadata-1\"\n },\n elements: {\n element1: \"element\"\n },\n bindings: {\n data: \"any-data\"\n },\n revisionDescription: undefined\n })\n ]);\n });\n\n it(\"should be able to update a page\", async () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue({\n id: \"page-1#0001\",\n entryId: \"page-1\",\n status: WbPageStatus.Draft,\n location: {\n folderId: \"folder-1\"\n },\n properties: {\n title: \"Page 1 - Updated\"\n },\n metadata: {\n data: \"metadata-1-updated\"\n },\n elements: {\n element1: \"element-updated\"\n },\n bindings: {\n data: \"any-data-updated\"\n },\n extensions: {\n ext1: \"ext-data-updated\"\n }\n })\n };\n\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UpdatePageRepository).inSingletonScope();\n container.register(UpdatePageUseCase);\n\n const updatePage = container.resolve(UseCaseAbstraction);\n\n expect(pagesCache.hasItems()).toBeTrue();\n const item = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(item?.id).toEqual(\"page-1#0001\");\n expect(item?.entryId).toEqual(\"page-1\");\n expect(item?.properties).toMatchObject({\n title: \"Page 1\"\n });\n expect(item?.elements).toMatchObject({\n element1: \"element\"\n });\n expect(item?.metadata).toMatchObject({\n data: \"metadata-1\"\n });\n expect(item?.bindings).toMatchObject({\n data: \"any-data\"\n });\n\n await updatePage.execute({\n id: \"page-1#0001\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n\n // List cache gets full replacement from gateway result\n const updatedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n expect(updatedItem).toBeDefined();\n expect(updatedItem?.id).toEqual(\"page-1#0001\");\n expect(updatedItem?.entryId).toEqual(\"page-1\");\n expect(updatedItem?.properties).toMatchObject({\n title: \"Page 1 - Updated\"\n });\n expect(updatedItem?.elements).toMatchObject({\n element1: \"element-updated\"\n });\n expect(updatedItem?.metadata).toMatchObject({\n data: \"metadata-1-updated\"\n });\n expect(updatedItem?.bindings).toMatchObject({\n data: \"any-data-updated\"\n });\n\n // Details cache is updated with the full gateway result including document fields\n const detailItem = detailsCache.getItem(page => page.entryId === \"page-1\");\n expect(detailItem).toBeDefined();\n expect(detailItem?.id).toEqual(\"page-1#0001\");\n expect(detailItem?.properties).toMatchObject({\n title: \"Page 1 - Updated\"\n });\n expect(detailItem?.metadata).toMatchObject({\n data: \"metadata-1-updated\"\n });\n expect(detailItem?.elements).toMatchObject({\n element1: \"element-updated\"\n });\n expect(detailItem?.bindings).toMatchObject({\n data: \"any-data-updated\"\n });\n expect(detailItem?.extensions).toMatchObject({\n ext1: \"ext-data-updated\"\n });\n });\n\n it(\"should not update a page if id is missing\", async () => {\n const gateway = {\n execute: vi.fn().mockResolvedValue(null)\n };\n\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UpdatePageRepository).inSingletonScope();\n container.register(UpdatePageUseCase);\n\n const updatePage = container.resolve(UseCaseAbstraction);\n\n await updatePage.execute({\n id: \"\"\n });\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n const updatedItem = pagesCache.getItem(page => page.entryId === \"page-1\");\n\n expect(updatedItem).toBeDefined();\n expect(updatedItem?.id).toEqual(\"page-1#0001\");\n expect(updatedItem?.entryId).toEqual(\"page-1\");\n expect(updatedItem?.properties).toMatchObject({\n title: \"Page 1\"\n });\n expect(updatedItem?.elements).toMatchObject({\n element1: \"element\"\n });\n expect(updatedItem?.metadata).toMatchObject({\n data: \"metadata-1\"\n });\n expect(updatedItem?.bindings).toMatchObject({\n data: \"any-data\"\n });\n });\n\n it(\"should handle gateway errors gracefully\", async () => {\n const gateway = {\n execute: vi.fn().mockRejectedValue(new Error(\"Gateway error\"))\n };\n\n const container = new Container();\n container.registerInstance(PageListCache, pagesCache);\n container.registerInstance(FullPageCache, detailsCache);\n container.registerInstance(GatewayAbstraction, gateway);\n container.register(UpdatePageRepository).inSingletonScope();\n container.register(UpdatePageUseCase);\n\n const updatePage = container.resolve(UseCaseAbstraction);\n\n await expect(\n updatePage.execute({\n id: \"page-1#0001\"\n })\n ).rejects.toThrow(\"Gateway error\");\n\n expect(gateway.execute).toHaveBeenCalledTimes(1);\n });\n});\n"],"names":["describe","pagesCache","pageListCache","detailsCache","fullPageCache","beforeEach","vi","Page","WbPageStatus","undefined","it","gateway","container","Container","PageListCache","FullPageCache","GatewayAbstraction","UpdatePageRepository","UpdatePageUseCase","updatePage","UseCaseAbstraction","expect","item","page","updatedItem","detailItem","Error"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/pages/updatePage/UpdatePageGateway.js","sources":["../../../../src/features/pages/updatePage/UpdatePageGateway.ts"],"sourcesContent":["import { UpdatePageGateway as GatewayAbstraction } from \"./abstractions.js\";\nimport type { PageDto } from \"./PageDto.js\";\nimport type { PageGqlDto } from \"./PageGqlDto.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient\";\nimport { getPageGraphQLFields } from \"~/features/pages/shared/pageGraphQLFields.js\";\n\nconst UPDATE_PAGE = /* GraphQL */ `\n mutation UpdatePage($id: ID!, $data: WbPageUpdateInput!) {\n websiteBuilder {\n updatePage(id: $id, data: $data) {\n data {\n ${getPageGraphQLFields([\"properties\", \"metadata\"]).join(\"\\n\")}\n }\n error {\n code\n data\n message\n }\n }\n }\n }\n`;\n\ntype UpdatePageResponse = {\n websiteBuilder: {\n updatePage:\n | { data: PageGqlDto; error: null }\n | { data: null; error: { code: string; message: string; data: any } };\n };\n};\n\nclass UpdatePageGatewayImpl implements GatewayAbstraction.Interface {\n constructor(private client: MainGraphQLClient.Interface) {}\n\n async execute(page: PageDto): Promise<PageGqlDto> {\n const { id, properties, metadata, elements, bindings, extensions } = page;\n\n const response = await this.client.execute<UpdatePageResponse>({\n query: UPDATE_PAGE,\n variables: {\n id,\n data: {\n properties,\n metadata,\n elements,\n bindings,\n extensions\n }\n }\n });\n\n const envelope = response.websiteBuilder.updatePage;\n if (envelope.error) {\n throw new Error(envelope.error.message || \"Could not update page.\");\n }\n\n return envelope.data;\n }\n}\n\nexport const UpdatePageGateway = GatewayAbstraction.createImplementation({\n implementation: UpdatePageGatewayImpl,\n dependencies: [MainGraphQLClient]\n});\n"],"names":["UPDATE_PAGE","getPageGraphQLFields","UpdatePageGatewayImpl","client","page","id","properties","metadata","elements","bindings","extensions","response","envelope","Error","UpdatePageGateway","GatewayAbstraction","MainGraphQLClient"],"mappings":";;;AAMA,MAAMA,cAA4B,CAAC;;;;;oBAKf,EAAEC,qBAAqB;IAAC;IAAc;
|
|
1
|
+
{"version":3,"file":"features/pages/updatePage/UpdatePageGateway.js","sources":["../../../../src/features/pages/updatePage/UpdatePageGateway.ts"],"sourcesContent":["import { UpdatePageGateway as GatewayAbstraction } from \"./abstractions.js\";\nimport type { PageDto } from \"./PageDto.js\";\nimport type { PageGqlDto } from \"./PageGqlDto.js\";\nimport { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient\";\nimport { getPageGraphQLFields } from \"~/features/pages/shared/pageGraphQLFields.js\";\n\nconst UPDATE_PAGE = /* GraphQL */ `\n mutation UpdatePage($id: ID!, $data: WbPageUpdateInput!) {\n websiteBuilder {\n updatePage(id: $id, data: $data) {\n data {\n ${getPageGraphQLFields([\"properties\", \"metadata\", \"bindings\", \"elements\", \"extensions\"]).join(\"\\n\")}\n }\n error {\n code\n data\n message\n }\n }\n }\n }\n`;\n\ntype UpdatePageResponse = {\n websiteBuilder: {\n updatePage:\n | { data: PageGqlDto; error: null }\n | { data: null; error: { code: string; message: string; data: any } };\n };\n};\n\nclass UpdatePageGatewayImpl implements GatewayAbstraction.Interface {\n constructor(private client: MainGraphQLClient.Interface) {}\n\n async execute(page: PageDto): Promise<PageGqlDto> {\n const { id, properties, metadata, elements, bindings, extensions } = page;\n\n const response = await this.client.execute<UpdatePageResponse>({\n query: UPDATE_PAGE,\n variables: {\n id,\n data: {\n properties,\n metadata,\n elements,\n bindings,\n extensions\n }\n }\n });\n\n const envelope = response.websiteBuilder.updatePage;\n if (envelope.error) {\n throw new Error(envelope.error.message || \"Could not update page.\");\n }\n\n return envelope.data;\n }\n}\n\nexport const UpdatePageGateway = GatewayAbstraction.createImplementation({\n implementation: UpdatePageGatewayImpl,\n dependencies: [MainGraphQLClient]\n});\n"],"names":["UPDATE_PAGE","getPageGraphQLFields","UpdatePageGatewayImpl","client","page","id","properties","metadata","elements","bindings","extensions","response","envelope","Error","UpdatePageGateway","GatewayAbstraction","MainGraphQLClient"],"mappings":";;;AAMA,MAAMA,cAA4B,CAAC;;;;;oBAKf,EAAEC,qBAAqB;IAAC;IAAc;IAAY;IAAY;IAAY;CAAa,EAAE,IAAI,CAAC,MAAM;;;;;;;;;;AAUxH,CAAC;AAUD,MAAMC;IACF,YAAoBC,MAAmC,CAAE;aAArCA,MAAM,GAANA;IAAsC;IAE1D,MAAM,QAAQC,IAAa,EAAuB;QAC9C,MAAM,EAAEC,EAAE,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,UAAU,EAAE,GAAGN;QAErE,MAAMO,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAqB;YAC3D,OAAOX;YACP,WAAW;gBACPK;gBACA,MAAM;oBACFC;oBACAC;oBACAC;oBACAC;oBACAC;gBACJ;YACJ;QACJ;QAEA,MAAME,WAAWD,SAAS,cAAc,CAAC,UAAU;QACnD,IAAIC,SAAS,KAAK,EACd,MAAM,IAAIC,MAAMD,SAAS,KAAK,CAAC,OAAO,IAAI;QAG9C,OAAOA,SAAS,IAAI;IACxB;AACJ;AAEO,MAAME,sCAAoBC,kBAAAA,oBAAuC,CAAC;IACrE,gBAAgBb;IAChB,cAAc;QAACc;KAAkB;AACrC"}
|
|
@@ -22,11 +22,7 @@ class UpdatePageRepositoryImpl {
|
|
|
22
22
|
return existingPage;
|
|
23
23
|
});
|
|
24
24
|
this.detailsCache.updateItems((existingPage)=>{
|
|
25
|
-
if (existingPage.id === page.id) return Page.create(
|
|
26
|
-
...result,
|
|
27
|
-
elements: dto.elements,
|
|
28
|
-
bindings: dto.bindings
|
|
29
|
-
});
|
|
25
|
+
if (existingPage.id === page.id) return Page.create(result);
|
|
30
26
|
return existingPage;
|
|
31
27
|
});
|
|
32
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/pages/updatePage/UpdatePageRepository.js","sources":["../../../../src/features/pages/updatePage/UpdatePageRepository.ts"],"sourcesContent":["import {\n UpdatePageRepository as RepositoryAbstraction,\n UpdatePageGateway\n} from \"./abstractions.js\";\nimport type { PageDto } from \"./PageDto.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\nclass UpdatePageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private gateway: UpdatePageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const dto: PageDto = {\n id: page.id,\n properties: page.properties,\n metadata: page.metadata,\n elements: page.elements,\n bindings: page.bindings,\n extensions: page.extensions\n };\n\n const result = await this.gateway.execute(dto);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(
|
|
1
|
+
{"version":3,"file":"features/pages/updatePage/UpdatePageRepository.js","sources":["../../../../src/features/pages/updatePage/UpdatePageRepository.ts"],"sourcesContent":["import {\n UpdatePageRepository as RepositoryAbstraction,\n UpdatePageGateway\n} from \"./abstractions.js\";\nimport type { PageDto } from \"./PageDto.js\";\nimport { Page } from \"~/domain/Page/Page.js\";\nimport { PageListCache, FullPageCache } from \"~/features/pages/shared/abstractions.js\";\n\nclass UpdatePageRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listCache: PageListCache.Interface,\n private detailsCache: FullPageCache.Interface,\n private gateway: UpdatePageGateway.Interface\n ) {}\n\n async execute(page: Page) {\n const dto: PageDto = {\n id: page.id,\n properties: page.properties,\n metadata: page.metadata,\n elements: page.elements,\n bindings: page.bindings,\n extensions: page.extensions\n };\n\n const result = await this.gateway.execute(dto);\n\n this.listCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n\n this.detailsCache.updateItems(existingPage => {\n if (existingPage.id === page.id) {\n return Page.create(result);\n }\n return existingPage;\n });\n }\n}\n\nexport const UpdatePageRepository = RepositoryAbstraction.createImplementation({\n implementation: UpdatePageRepositoryImpl,\n dependencies: [PageListCache, FullPageCache, UpdatePageGateway]\n});\n"],"names":["UpdatePageRepositoryImpl","listCache","detailsCache","gateway","page","dto","result","existingPage","Page","UpdatePageRepository","RepositoryAbstraction","PageListCache","FullPageCache","UpdatePageGateway"],"mappings":";;;AAQA,MAAMA;IACF,YACYC,SAAkC,EAClCC,YAAqC,EACrCC,OAAoC,CAC9C;aAHUF,SAAS,GAATA;aACAC,YAAY,GAAZA;aACAC,OAAO,GAAPA;IACT;IAEH,MAAM,QAAQC,IAAU,EAAE;QACtB,MAAMC,MAAe;YACjB,IAAID,KAAK,EAAE;YACX,YAAYA,KAAK,UAAU;YAC3B,UAAUA,KAAK,QAAQ;YACvB,UAAUA,KAAK,QAAQ;YACvB,UAAUA,KAAK,QAAQ;YACvB,YAAYA,KAAK,UAAU;QAC/B;QAEA,MAAME,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAACD;QAE1C,IAAI,CAAC,SAAS,CAAC,WAAW,CAACE,CAAAA;YACvB,IAAIA,aAAa,EAAE,KAAKH,KAAK,EAAE,EAC3B,OAAOI,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;QAEA,IAAI,CAAC,YAAY,CAAC,WAAW,CAACA,CAAAA;YAC1B,IAAIA,aAAa,EAAE,KAAKH,KAAK,EAAE,EAC3B,OAAOI,KAAK,MAAM,CAACF;YAEvB,OAAOC;QACX;IACJ;AACJ;AAEO,MAAME,4CAAuBC,qBAAAA,oBAA0C,CAAC;IAC3E,gBAAgBV;IAChB,cAAc;QAACW;QAAeC;QAAeC;KAAkB;AACnE"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import react, { useCallback
|
|
2
|
-
import {
|
|
1
|
+
import react, { useCallback } from "react";
|
|
2
|
+
import { EditableTitle } from "@webiny/admin-ui";
|
|
3
3
|
import { useDocumentEditor } from "../../../../DocumentEditor/index.js";
|
|
4
4
|
import { useSelectFromDocument } from "../../../../BaseEditor/hooks/useSelectFromDocument.js";
|
|
5
5
|
import { useSelectFromEditor } from "../../../../BaseEditor/hooks/useSelectFromEditor.js";
|
|
6
6
|
import { LanguageCodeTag } from "../../../../presentation/components/LanguageCodeTag.js";
|
|
7
7
|
function Title() {
|
|
8
|
-
const [localValue, setLocalValue] = useState();
|
|
9
|
-
const [isEditing, setIsEditing] = useState(false);
|
|
10
8
|
const isEditorReadOnly = useSelectFromEditor((state)=>state.isReadOnly);
|
|
11
9
|
const editor = useDocumentEditor();
|
|
12
10
|
const { title, language } = useSelectFromDocument((document)=>({
|
|
@@ -17,39 +15,15 @@ function Title() {
|
|
|
17
15
|
editor.updateDocument((document)=>{
|
|
18
16
|
document.properties.title = value;
|
|
19
17
|
});
|
|
20
|
-
setLocalValue(void 0);
|
|
21
|
-
setIsEditing(false);
|
|
22
18
|
}, []);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
size: "lg"
|
|
32
|
-
}, title));
|
|
33
|
-
return /*#__PURE__*/ react.createElement("div", {
|
|
34
|
-
className: "flex flex-row min-w-0"
|
|
35
|
-
}, /*#__PURE__*/ react.createElement(LanguageCodeTag, {
|
|
36
|
-
code: language
|
|
37
|
-
}), isEditing ? null : /*#__PURE__*/ react.createElement(Text, {
|
|
38
|
-
onClick: ()=>setIsEditing(true),
|
|
39
|
-
className: "cursor-pointer text-accent-primary font-bold mx-sm truncate",
|
|
40
|
-
size: "lg"
|
|
41
|
-
}, title), isEditing ? /*#__PURE__*/ react.createElement(Input, {
|
|
42
|
-
autoFocus: true,
|
|
43
|
-
autoSelect: true,
|
|
44
|
-
size: "md",
|
|
45
|
-
variant: "secondary",
|
|
46
|
-
className: "mx-sm",
|
|
47
|
-
value: localValue ?? title,
|
|
48
|
-
onChange: setLocalValue,
|
|
49
|
-
onBlur: (e)=>commitValue(e.currentTarget.value),
|
|
50
|
-
onEnter: (e)=>commitValue(e.currentTarget.value),
|
|
51
|
-
onEscape: cancelEditing
|
|
52
|
-
}) : null);
|
|
19
|
+
return /*#__PURE__*/ react.createElement(EditableTitle, {
|
|
20
|
+
value: title,
|
|
21
|
+
onCommit: commitValue,
|
|
22
|
+
readOnly: isEditorReadOnly,
|
|
23
|
+
startContent: /*#__PURE__*/ react.createElement(LanguageCodeTag, {
|
|
24
|
+
code: language
|
|
25
|
+
})
|
|
26
|
+
});
|
|
53
27
|
}
|
|
54
28
|
export { Title };
|
|
55
29
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modules/pages/PageEditor/TopBar/Title.js","sources":["../../../../../src/modules/pages/PageEditor/TopBar/Title.tsx"],"sourcesContent":["import React, { useCallback
|
|
1
|
+
{"version":3,"file":"modules/pages/PageEditor/TopBar/Title.js","sources":["../../../../../src/modules/pages/PageEditor/TopBar/Title.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { EditableTitle } from \"@webiny/admin-ui\";\nimport { useDocumentEditor } from \"~/DocumentEditor/index.js\";\nimport { useSelectFromDocument } from \"~/BaseEditor/hooks/useSelectFromDocument.js\";\nimport { useSelectFromEditor } from \"~/BaseEditor/hooks/useSelectFromEditor.js\";\nimport { LanguageCodeTag } from \"~/presentation/components/LanguageCodeTag.js\";\n\nexport function Title() {\n const isEditorReadOnly = useSelectFromEditor(state => state.isReadOnly);\n const editor = useDocumentEditor();\n\n const { title, language } = useSelectFromDocument(document => {\n return {\n title: document.properties.title ?? \"Untitled\",\n language: document.properties.language ?? undefined\n };\n });\n\n const commitValue = useCallback((value: string) => {\n editor.updateDocument(document => {\n document.properties.title = value;\n });\n }, []);\n\n return (\n <EditableTitle\n value={title}\n onCommit={commitValue}\n readOnly={isEditorReadOnly}\n startContent={<LanguageCodeTag code={language} />}\n />\n );\n}\n"],"names":["Title","isEditorReadOnly","useSelectFromEditor","state","editor","useDocumentEditor","title","language","useSelectFromDocument","document","undefined","commitValue","useCallback","value","EditableTitle","LanguageCodeTag"],"mappings":";;;;;;AAOO,SAASA;IACZ,MAAMC,mBAAmBC,oBAAoBC,CAAAA,QAASA,MAAM,UAAU;IACtE,MAAMC,SAASC;IAEf,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGC,sBAAsBC,CAAAA,WACvC;YACH,OAAOA,SAAS,UAAU,CAAC,KAAK,IAAI;YACpC,UAAUA,SAAS,UAAU,CAAC,QAAQ,IAAIC;QAC9C;IAGJ,MAAMC,cAAcC,YAAY,CAACC;QAC7BT,OAAO,cAAc,CAACK,CAAAA;YAClBA,SAAS,UAAU,CAAC,KAAK,GAAGI;QAChC;IACJ,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACC,eAAaA;QACV,OAAOR;QACP,UAAUK;QACV,UAAUV;QACV,4BAAc,oBAACc,iBAAeA;YAAC,MAAMR;;;AAGjD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/app-website-builder",
|
|
3
|
-
"version": "6.4.3-beta.
|
|
3
|
+
"version": "6.4.3-beta.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -21,28 +21,28 @@
|
|
|
21
21
|
"@monaco-editor/react": "4.7.0",
|
|
22
22
|
"@svgr/webpack": "8.1.0",
|
|
23
23
|
"@types/react": "18.3.29",
|
|
24
|
-
"@webiny/admin-ui": "6.4.3-beta.
|
|
25
|
-
"@webiny/app": "6.4.3-beta.
|
|
26
|
-
"@webiny/app-aco": "6.4.3-beta.
|
|
27
|
-
"@webiny/app-admin": "6.4.3-beta.
|
|
28
|
-
"@webiny/app-headless-cms-common": "6.4.3-beta.
|
|
29
|
-
"@webiny/app-trash-bin": "6.4.3-beta.
|
|
30
|
-
"@webiny/app-utils": "6.4.3-beta.
|
|
24
|
+
"@webiny/admin-ui": "6.4.3-beta.1",
|
|
25
|
+
"@webiny/app": "6.4.3-beta.1",
|
|
26
|
+
"@webiny/app-aco": "6.4.3-beta.1",
|
|
27
|
+
"@webiny/app-admin": "6.4.3-beta.1",
|
|
28
|
+
"@webiny/app-headless-cms-common": "6.4.3-beta.1",
|
|
29
|
+
"@webiny/app-trash-bin": "6.4.3-beta.1",
|
|
30
|
+
"@webiny/app-utils": "6.4.3-beta.1",
|
|
31
31
|
"@webiny/di": "1.0.1",
|
|
32
|
-
"@webiny/error": "6.4.3-beta.
|
|
33
|
-
"@webiny/feature": "6.4.3-beta.
|
|
34
|
-
"@webiny/form": "6.4.3-beta.
|
|
35
|
-
"@webiny/icons": "6.4.3-beta.
|
|
36
|
-
"@webiny/languages": "6.4.3-beta.
|
|
37
|
-
"@webiny/lexical-converter": "6.4.3-beta.
|
|
38
|
-
"@webiny/lexical-editor": "6.4.3-beta.
|
|
39
|
-
"@webiny/lexical-nodes": "6.4.3-beta.
|
|
40
|
-
"@webiny/lexical-theme": "6.4.3-beta.
|
|
41
|
-
"@webiny/react-composition": "6.4.3-beta.
|
|
42
|
-
"@webiny/react-properties": "6.4.3-beta.
|
|
43
|
-
"@webiny/utils": "6.4.3-beta.
|
|
44
|
-
"@webiny/validation": "6.4.3-beta.
|
|
45
|
-
"@webiny/website-builder-sdk": "6.4.3-beta.
|
|
32
|
+
"@webiny/error": "6.4.3-beta.1",
|
|
33
|
+
"@webiny/feature": "6.4.3-beta.1",
|
|
34
|
+
"@webiny/form": "6.4.3-beta.1",
|
|
35
|
+
"@webiny/icons": "6.4.3-beta.1",
|
|
36
|
+
"@webiny/languages": "6.4.3-beta.1",
|
|
37
|
+
"@webiny/lexical-converter": "6.4.3-beta.1",
|
|
38
|
+
"@webiny/lexical-editor": "6.4.3-beta.1",
|
|
39
|
+
"@webiny/lexical-nodes": "6.4.3-beta.1",
|
|
40
|
+
"@webiny/lexical-theme": "6.4.3-beta.1",
|
|
41
|
+
"@webiny/react-composition": "6.4.3-beta.1",
|
|
42
|
+
"@webiny/react-properties": "6.4.3-beta.1",
|
|
43
|
+
"@webiny/utils": "6.4.3-beta.1",
|
|
44
|
+
"@webiny/validation": "6.4.3-beta.1",
|
|
45
|
+
"@webiny/website-builder-sdk": "6.4.3-beta.1",
|
|
46
46
|
"apollo-cache": "1.3.5",
|
|
47
47
|
"apollo-client": "2.6.10",
|
|
48
48
|
"apollo-link": "1.2.14",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@types/deep-equal": "1.0.4",
|
|
71
71
|
"@types/is-hotkey": "0.1.10",
|
|
72
|
-
"@webiny/build-tools": "6.4.3-beta.
|
|
72
|
+
"@webiny/build-tools": "6.4.3-beta.1",
|
|
73
73
|
"execa": "5.1.1",
|
|
74
74
|
"rimraf": "6.1.3",
|
|
75
75
|
"typescript": "6.0.3",
|