@webiny/app-website-builder 6.4.2 → 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 +28 -28
|
@@ -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":"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"}
|
|
@@ -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
|
+
"version": "6.4.3-beta.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -21,44 +21,44 @@
|
|
|
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.
|
|
25
|
-
"@webiny/app": "6.4.
|
|
26
|
-
"@webiny/app-aco": "6.4.
|
|
27
|
-
"@webiny/app-admin": "6.4.
|
|
28
|
-
"@webiny/app-headless-cms-common": "6.4.
|
|
29
|
-
"@webiny/app-trash-bin": "6.4.
|
|
30
|
-
"@webiny/app-utils": "6.4.
|
|
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.
|
|
33
|
-
"@webiny/feature": "6.4.
|
|
34
|
-
"@webiny/form": "6.4.
|
|
35
|
-
"@webiny/icons": "6.4.
|
|
36
|
-
"@webiny/languages": "6.4.
|
|
37
|
-
"@webiny/lexical-converter": "6.4.
|
|
38
|
-
"@webiny/lexical-editor": "6.4.
|
|
39
|
-
"@webiny/lexical-nodes": "6.4.
|
|
40
|
-
"@webiny/lexical-theme": "6.4.
|
|
41
|
-
"@webiny/react-composition": "6.4.
|
|
42
|
-
"@webiny/react-properties": "6.4.
|
|
43
|
-
"@webiny/utils": "6.4.
|
|
44
|
-
"@webiny/validation": "6.4.
|
|
45
|
-
"@webiny/website-builder-sdk": "6.4.
|
|
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",
|
|
49
49
|
"apollo-utilities": "1.3.4",
|
|
50
50
|
"classnames": "2.5.1",
|
|
51
51
|
"deep-equal": "2.2.3",
|
|
52
|
-
"graphql": "16.14.
|
|
52
|
+
"graphql": "16.14.2",
|
|
53
53
|
"graphql-tag": "2.12.6",
|
|
54
54
|
"is-hotkey": "0.2.0",
|
|
55
55
|
"lodash": "4.18.1",
|
|
56
|
-
"markdown-to-jsx": "9.8.
|
|
56
|
+
"markdown-to-jsx": "9.8.2",
|
|
57
57
|
"matcher": "6.0.0",
|
|
58
|
-
"mobx": "6.
|
|
58
|
+
"mobx": "6.16.1",
|
|
59
59
|
"mobx-react-lite": "4.1.1",
|
|
60
60
|
"pluralize": "8.0.0",
|
|
61
|
-
"radix-ui": "1.
|
|
61
|
+
"radix-ui": "1.5.0",
|
|
62
62
|
"react": "18.3.1",
|
|
63
63
|
"react-dnd": "16.0.1",
|
|
64
64
|
"react-dnd-html5-backend": "16.0.1",
|
|
@@ -69,11 +69,11 @@
|
|
|
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.
|
|
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",
|
|
76
|
-
"vitest": "4.1.
|
|
76
|
+
"vitest": "4.1.8"
|
|
77
77
|
},
|
|
78
78
|
"publishConfig": {
|
|
79
79
|
"access": "public"
|