@nascentdigital/funnel-editor-contentful 4.6.7 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/Editor.d.ts +6 -1
  2. package/dist/Editor.js +17 -1
  3. package/dist/EditorApp.js +11 -9
  4. package/dist/EditorPageRouter.d.ts +1 -0
  5. package/dist/EditorPageRouter.js +40 -0
  6. package/dist/EntryEditor.js +43 -1
  7. package/dist/EntrySidebar.js +18 -1
  8. package/dist/asset/index.d.ts +1 -0
  9. package/dist/{page/hooks → asset}/index.js +1 -1
  10. package/dist/asset/repository/AssetRepository.d.ts +10 -0
  11. package/dist/asset/repository/AssetRepository.js +33 -0
  12. package/dist/asset/repository/index.d.ts +1 -0
  13. package/dist/{core/api → asset/repository}/index.js +1 -3
  14. package/dist/collection/controller/ContentfulCollectionController.d.ts +41 -0
  15. package/dist/collection/controller/ContentfulCollectionController.js +278 -0
  16. package/dist/collection/controller/ContentfulCollectionControllerContainer.d.ts +5 -0
  17. package/dist/collection/controller/ContentfulCollectionControllerContainer.js +28 -0
  18. package/dist/collection/controller/index.d.ts +3 -0
  19. package/dist/collection/controller/index.js +19 -0
  20. package/dist/collection/controller/useContentfulCollectionController.d.ts +2 -0
  21. package/dist/collection/controller/useContentfulCollectionController.js +8 -0
  22. package/dist/collection/domain/Collection.d.ts +108 -0
  23. package/dist/collection/domain/Collection.js +386 -0
  24. package/dist/collection/domain/index.d.ts +1 -0
  25. package/dist/collection/domain/index.js +17 -0
  26. package/dist/collection/index.d.ts +3 -0
  27. package/dist/collection/index.js +19 -0
  28. package/dist/collection/repository/CollectionRepository.d.ts +49 -0
  29. package/dist/collection/repository/CollectionRepository.js +210 -0
  30. package/dist/collection/repository/index.d.ts +1 -0
  31. package/dist/collection/repository/index.js +17 -0
  32. package/dist/collection/screens/CollectionEditor.d.ts +1 -0
  33. package/dist/collection/screens/CollectionEditor.js +59 -0
  34. package/dist/collection/screens/index.d.ts +1 -0
  35. package/dist/collection/screens/index.js +17 -0
  36. package/dist/core/bridge/AppBridgeContainer.d.ts +9 -0
  37. package/dist/core/bridge/AppBridgeContainer.js +55 -0
  38. package/dist/core/bridge/AppBridgeContext.d.ts +8 -0
  39. package/dist/core/bridge/AppBridgeContext.js +11 -0
  40. package/dist/core/bridge/AppMessage.d.ts +19 -0
  41. package/dist/core/bridge/AppMessage.js +19 -0
  42. package/dist/core/bridge/index.d.ts +4 -0
  43. package/dist/core/bridge/index.js +20 -0
  44. package/dist/core/bridge/useAppBridge.d.ts +8 -0
  45. package/dist/core/bridge/useAppBridge.js +24 -0
  46. package/dist/core/client/ContentfulClientContainer.d.ts +8 -0
  47. package/dist/core/client/ContentfulClientContainer.js +43 -0
  48. package/dist/core/client/ContentfulClientContext.d.ts +8 -0
  49. package/dist/core/client/ContentfulClientContext.js +8 -0
  50. package/dist/core/client/index.d.ts +3 -0
  51. package/dist/core/client/index.js +19 -0
  52. package/dist/core/client/useContentfulClient.d.ts +4 -0
  53. package/dist/core/client/useContentfulClient.js +24 -0
  54. package/dist/core/contentful/Contentful.d.ts +33 -0
  55. package/dist/core/contentful/Contentful.js +67 -0
  56. package/dist/core/contentful/ContentfulAsset.d.ts +23 -0
  57. package/dist/core/contentful/ContentfulAsset.js +89 -0
  58. package/dist/core/contentful/ContentfulCollection.d.ts +29 -0
  59. package/dist/core/contentful/ContentfulCollection.js +97 -0
  60. package/dist/core/contentful/ContentfulPage.d.ts +31 -0
  61. package/dist/core/contentful/ContentfulPage.js +84 -0
  62. package/dist/core/contentful/ContentfulRefs.d.ts +16 -0
  63. package/dist/core/contentful/ContentfulRefs.js +152 -0
  64. package/dist/core/contentful/index.d.ts +5 -0
  65. package/dist/core/contentful/index.js +21 -0
  66. package/dist/core/index.d.ts +3 -2
  67. package/dist/core/index.js +3 -2
  68. package/dist/core/repository/CollectionSerializer.d.ts +9 -0
  69. package/dist/core/repository/CollectionSerializer.js +41 -0
  70. package/dist/core/repository/LocalCollectionRepository.d.ts +27 -0
  71. package/dist/core/repository/LocalCollectionRepository.js +143 -0
  72. package/dist/core/repository/LocalPageRepository.d.ts +16 -0
  73. package/dist/core/repository/LocalPageRepository.js +153 -0
  74. package/dist/core/repository/PageSerializer.d.ts +3 -3
  75. package/dist/core/repository/PageSerializer.js +18 -14
  76. package/dist/core/repository/RemoteCollectionRepository.d.ts +19 -0
  77. package/dist/core/repository/RemoteCollectionRepository.js +236 -0
  78. package/dist/core/repository/RemotePageRepository.d.ts +14 -0
  79. package/dist/core/repository/RemotePageRepository.js +113 -0
  80. package/dist/core/repository/index.d.ts +4 -1
  81. package/dist/core/repository/index.js +4 -1
  82. package/dist/explore/components/Header.d.ts +26 -0
  83. package/dist/explore/components/Header.js +31 -0
  84. package/dist/explore/components/index.d.ts +1 -0
  85. package/dist/explore/components/index.js +17 -0
  86. package/dist/explore/index.d.ts +1 -0
  87. package/dist/explore/index.js +17 -0
  88. package/dist/explore/screens/Dashboard.d.ts +1 -0
  89. package/dist/explore/screens/Dashboard.js +22 -0
  90. package/dist/explore/screens/PageExplorer.d.ts +1 -0
  91. package/dist/explore/screens/PageExplorer.js +9 -0
  92. package/dist/explore/screens/SiteExplorer.d.ts +1 -0
  93. package/dist/explore/screens/SiteExplorer.js +24 -0
  94. package/dist/explore/screens/index.d.ts +3 -0
  95. package/dist/explore/screens/index.js +19 -0
  96. package/dist/page/{hooks/PageController.d.ts → controller/ContentfulPageController.d.ts} +17 -6
  97. package/dist/page/controller/ContentfulPageController.js +277 -0
  98. package/dist/page/controller/ContentfulPageControllerContainer.d.ts +5 -0
  99. package/dist/page/controller/ContentfulPageControllerContainer.js +28 -0
  100. package/dist/page/controller/index.d.ts +3 -0
  101. package/dist/page/controller/index.js +19 -0
  102. package/dist/page/controller/useContentfulPageController.d.ts +2 -0
  103. package/dist/page/controller/useContentfulPageController.js +8 -0
  104. package/dist/{core → page}/domain/Page.d.ts +71 -10
  105. package/dist/page/domain/Page.js +631 -0
  106. package/dist/page/index.d.ts +3 -0
  107. package/dist/page/index.js +3 -0
  108. package/dist/page/repository/PageRepository.d.ts +45 -0
  109. package/dist/page/repository/PageRepository.js +224 -0
  110. package/dist/page/repository/index.d.ts +1 -0
  111. package/dist/page/repository/index.js +17 -0
  112. package/dist/page/screens/PageEditor.js +29 -15
  113. package/package.json +10 -4
  114. package/dist/core/api/EditorApiClient.d.ts +0 -7
  115. package/dist/core/api/EditorApiClient.js +0 -29
  116. package/dist/core/api/EditorApiContainer.d.ts +0 -5
  117. package/dist/core/api/EditorApiContainer.js +0 -16
  118. package/dist/core/api/EditorApiContext.d.ts +0 -7
  119. package/dist/core/api/EditorApiContext.js +0 -6
  120. package/dist/core/api/index.d.ts +0 -3
  121. package/dist/core/api/useEditorApi.d.ts +0 -2
  122. package/dist/core/api/useEditorApi.js +0 -12
  123. package/dist/core/domain/Page.js +0 -180
  124. package/dist/core/repository/PageRepository.d.ts +0 -12
  125. package/dist/core/repository/PageRepository.js +0 -23
  126. package/dist/page/hooks/PageController.js +0 -107
  127. package/dist/page/hooks/index.d.ts +0 -1
  128. /package/dist/{core → page}/domain/index.d.ts +0 -0
  129. /package/dist/{core → page}/domain/index.js +0 -0
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentfulPageController = void 0;
4
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
5
+ const components_1 = require("@nascentdigital/funnel-editor/components");
6
+ const rxjs_1 = require("rxjs");
7
+ // class
8
+ class ContentfulPageController {
9
+ constructor(args) {
10
+ // initialize instance variables
11
+ this.pageRepository = args.pageRepository;
12
+ this._eventBus = new funnel_core_1.EventBus();
13
+ this._state = 'uninitialized';
14
+ }
15
+ get events$() {
16
+ return this._eventBus.events$.pipe((0, rxjs_1.filter)((e) => components_1.IPageController.Event.filter(e) || components_1.IPage.Event.filter(e)));
17
+ }
18
+ get saved$() {
19
+ return this._eventBus.events$.pipe((0, rxjs_1.filter)(components_1.IPageController.StateChangedEvent.filter), (0, rxjs_1.pairwise)(), (0, rxjs_1.filter)(([previous, current]) => previous.state === 'saving' && current.state === 'ready'));
20
+ }
21
+ get state() {
22
+ return this._state;
23
+ }
24
+ set state(value) {
25
+ // skip if unchanged
26
+ if (this._state === value) {
27
+ return;
28
+ }
29
+ // or update
30
+ this._state = value;
31
+ // raise event
32
+ this._eventBus.publish(components_1.IPageController.StateChangedEvent.create({
33
+ state: value,
34
+ controller: this
35
+ }));
36
+ // process queues if ready (might be noop)
37
+ if (value === 'ready') {
38
+ this.processQueues().catch(console.error);
39
+ }
40
+ }
41
+ get ready() {
42
+ const { _state } = this;
43
+ return _state !== 'uninitialized' && _state !== 'initializing';
44
+ }
45
+ get languages() {
46
+ var _a, _b;
47
+ return (_b = (_a = this._pageSummary) === null || _a === void 0 ? void 0 : _a.pages.map(page => page.language)) !== null && _b !== void 0 ? _b : [];
48
+ }
49
+ get pageSummary() {
50
+ return this._pageSummary;
51
+ }
52
+ set pageSummary(pageSummary) {
53
+ // skip if summary is the same
54
+ if (this._pageSummary === pageSummary) {
55
+ return;
56
+ }
57
+ // update summary
58
+ this._pageSummary = pageSummary;
59
+ // raise event
60
+ this.raiseEvent('pageSummary.changed');
61
+ }
62
+ get page() {
63
+ return this._page;
64
+ }
65
+ set page(page) {
66
+ // skip if page is the same
67
+ if (this._page === page) {
68
+ console.debug('[ContentfulPageController/setPage] skipping page set, same instance');
69
+ return;
70
+ }
71
+ // unbind previous page subscription (if any)
72
+ if (this._pageSubscription) {
73
+ this._pageSubscription.unsubscribe();
74
+ delete this._pageSubscription;
75
+ }
76
+ console.debug('[ContentfulPageController/setPage] new page instance set');
77
+ // update page
78
+ this._page = page;
79
+ // subscribe to page changes
80
+ if (page) {
81
+ // subscribe to page events
82
+ this._pageSubscription = page.events$
83
+ .pipe((0, rxjs_1.filter)(e => {
84
+ // handle page events
85
+ if (components_1.IPage.Event.filter(e)) {
86
+ return e.type === 'modified';
87
+ }
88
+ // or item/object/list events
89
+ else if (components_1.Item.Event.filter(e)
90
+ || components_1.Item.Event.filter(e)
91
+ || funnel_core_1.ObjectField.Event.filter(e)
92
+ || funnel_core_1.FieldList.Event.filter(e)) {
93
+ return e.type === 'changed';
94
+ }
95
+ // or field
96
+ else {
97
+ return funnel_core_1.Field.Event.filter(e) && (e.type === 'changed' || e.type === 'reset');
98
+ }
99
+ }), (0, rxjs_1.debounce)(e => {
100
+ return (0, rxjs_1.interval)(1000);
101
+ }))
102
+ .subscribe(async (e) => {
103
+ if (page.modified && this._page === page) {
104
+ await this.save(page);
105
+ }
106
+ });
107
+ }
108
+ // raise state change
109
+ this.raiseEvent('page.changed');
110
+ }
111
+ get pageSys() {
112
+ return this._pageSys;
113
+ }
114
+ set pageSys(sys) {
115
+ this._pageSys = sys;
116
+ }
117
+ async sync(updatedSys) {
118
+ // skip if there's no active page/sys
119
+ const { page, pageSys, state, pageRepository } = this;
120
+ if (!page || !pageSys) {
121
+ console.warn('[ContentfulPageController/sync] ignoring update before initial load');
122
+ return;
123
+ }
124
+ // or skip if page version is unchanged
125
+ else if (page.id === updatedSys.id && pageSys.version >= updatedSys.version) {
126
+ console.debug('[ContentfulPageController/sync] ignoring update - current version is fresh');
127
+ return;
128
+ }
129
+ // or ignore if booting up
130
+ else if (state === 'uninitialized' || state === 'initializing' || state === 'loading') {
131
+ console.debug('[ContentfulPageController/sync] ignoring sync while loading');
132
+ return;
133
+ }
134
+ // or queue if saving
135
+ else if (this.state === 'saving') {
136
+ console.debug('[ContentfulPageController/sync] queueing page sync - updated while saving');
137
+ this._queuedSync = updatedSys;
138
+ return;
139
+ }
140
+ // try to sync
141
+ try {
142
+ console.debug('[ContentfulPageController/sync] starting sync');
143
+ // update state
144
+ this.state = 'loading';
145
+ // perform sync
146
+ const result = await pageRepository.sync({ page, sys: updatedSys });
147
+ // update sys
148
+ this.pageSys = result.sys;
149
+ // update page (if unchanged)
150
+ if (this.page !== result.page) {
151
+ this.page = result.page;
152
+ }
153
+ // update summary (if any)
154
+ if (result.pageSummary) {
155
+ this.pageSummary = result.pageSummary;
156
+ }
157
+ console.debug('[ContentfulPageController/sync] sync complete');
158
+ // clear state
159
+ this.state = 'ready';
160
+ }
161
+ // catch error
162
+ catch (e) {
163
+ console.error('[ContentfulPageController/sync] sync failed', e);
164
+ this.state = 'error';
165
+ }
166
+ }
167
+ async load() {
168
+ // mark as loading (or initialing if loading for first time)
169
+ this.state = this._state === 'uninitialized'
170
+ ? 'initializing'
171
+ : 'loading';
172
+ // try to load page
173
+ try {
174
+ // fetch page
175
+ const { pageSummary, page, sys } = await this.pageRepository.load();
176
+ console.debug('[ContentfulPageController/load] fetched page', { pageSummary, page, sys });
177
+ // set page/summary
178
+ this.pageSummary = pageSummary;
179
+ this.page = page;
180
+ this._pageSys = sys;
181
+ // update state
182
+ this.state = 'ready';
183
+ }
184
+ // handle error
185
+ catch (e) {
186
+ console.error('[ContentfulPageController/load] failed to load page', e);
187
+ // set error state
188
+ this.state = 'error';
189
+ }
190
+ }
191
+ async create(target) {
192
+ throw new funnel_core_1.NotImplementedError();
193
+ }
194
+ async save(page) {
195
+ // ignore if not ready
196
+ if (this._state !== 'ready') {
197
+ console.debug(`[ContentfulPageController/save] queuing save while in "${this._state}" state`);
198
+ this._queuedSave = page;
199
+ return;
200
+ }
201
+ // clear save if queued
202
+ delete this._queuedSave;
203
+ // skip if page isn't modified
204
+ if (!page.modified) {
205
+ console.debug('[ContentfulPageController/save] ignore unmodified page');
206
+ return;
207
+ }
208
+ // try to save page
209
+ try {
210
+ console.debug('[ContentfulPageController/save] starting save');
211
+ // mark as syncing
212
+ page.syncing = true;
213
+ // update state
214
+ this.state = 'saving';
215
+ // save page
216
+ this.page = await this.pageRepository.save(page);
217
+ // update state
218
+ this.state = 'ready';
219
+ console.debug('[ContentfulPageController/save] save finished');
220
+ }
221
+ // handle error
222
+ catch (e) {
223
+ console.error('[ContentfulPageController/save] save failed', e);
224
+ // update state
225
+ this.state = 'error';
226
+ }
227
+ // complete
228
+ finally {
229
+ page.syncing = false;
230
+ }
231
+ }
232
+ async reload() {
233
+ throw new funnel_core_1.NotImplementedError();
234
+ }
235
+ async unpublish() {
236
+ throw new funnel_core_1.NotImplementedError();
237
+ }
238
+ async processQueues() {
239
+ // try to save (if queued)
240
+ const { _queuedSave, _page } = this;
241
+ if (_queuedSave) {
242
+ // nuke if page differs (keep going afterward)
243
+ if (_page !== _queuedSave) {
244
+ console.debug('[ContentfulPageController/processQueues] ignoring queued save for old page');
245
+ delete this._queuedSave;
246
+ }
247
+ // otherwise, try to save
248
+ else {
249
+ console.debug('[ContentfulPageController/processQueues] restarting queued save');
250
+ // save
251
+ this.save(_page).catch(console.error);
252
+ // stop processing
253
+ return;
254
+ }
255
+ }
256
+ // try to sync
257
+ const { _queuedSync, _pageSys } = this;
258
+ if (_queuedSync) {
259
+ // clear sync
260
+ delete this._queuedSync;
261
+ // reload if entity is different
262
+ if (_queuedSync.id !== (_pageSys === null || _pageSys === void 0 ? void 0 : _pageSys.id)) {
263
+ console.debug('[ContentfulPageController/processQueues] reloading on entity change');
264
+ this.load().catch(console.error);
265
+ }
266
+ // otherwise, try to sync
267
+ else {
268
+ console.debug('[ContentfulPageController/processQueues] retrying sync');
269
+ this.sync(_queuedSync).catch(console.error);
270
+ }
271
+ }
272
+ }
273
+ raiseEvent(type) {
274
+ this._eventBus.publish(components_1.IPageController.Event.create({ type, controller: this }));
275
+ }
276
+ }
277
+ exports.ContentfulPageController = ContentfulPageController;
@@ -0,0 +1,5 @@
1
+ import { PropsWithChildren } from 'react';
2
+ export declare function ContentfulPageControllerContainer({ children }: PageControllerContainer.Props): import("react/jsx-runtime").JSX.Element;
3
+ export declare namespace PageControllerContainer {
4
+ type Props = PropsWithChildren;
5
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentfulPageControllerContainer = ContentfulPageControllerContainer;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_apps_toolkit_1 = require("@contentful/react-apps-toolkit");
6
+ const components_1 = require("@nascentdigital/funnel-editor/components");
7
+ const react_1 = require("react");
8
+ const ContentfulPageController_1 = require("./ContentfulPageController");
9
+ // container
10
+ function ContentfulPageControllerContainer({ children }) {
11
+ // bind context
12
+ const pageRepository = (0, components_1.usePageRepository)();
13
+ const sdk = (0, react_apps_toolkit_1.useSDK)();
14
+ const context = (0, react_1.useMemo)(() => ({
15
+ controller: new ContentfulPageController_1.ContentfulPageController({ pageRepository })
16
+ }), [pageRepository]);
17
+ // listen to page changes
18
+ (0, react_1.useEffect)(() => {
19
+ // get controller
20
+ const { controller } = context;
21
+ // sync on change (return unsubscribe)
22
+ return sdk.entry.onSysChanged(sys => {
23
+ controller.sync(sys).catch(console.error);
24
+ });
25
+ }, [sdk, context]);
26
+ // render
27
+ return ((0, jsx_runtime_1.jsx)(components_1.PageControllerContext.Provider, { value: context, children: children }));
28
+ }
@@ -0,0 +1,3 @@
1
+ export * from './ContentfulPageController';
2
+ export * from './ContentfulPageControllerContainer';
3
+ export * from './useContentfulPageController';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ContentfulPageController"), exports);
18
+ __exportStar(require("./ContentfulPageControllerContainer"), exports);
19
+ __exportStar(require("./useContentfulPageController"), exports);
@@ -0,0 +1,2 @@
1
+ import { ContentfulPageController } from './ContentfulPageController';
2
+ export declare function useContentfulPageController(): ContentfulPageController;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useContentfulPageController = useContentfulPageController;
4
+ const components_1 = require("@nascentdigital/funnel-editor/components");
5
+ // hook
6
+ function useContentfulPageController() {
7
+ return (0, components_1.usePageController)();
8
+ }
@@ -1,53 +1,90 @@
1
- import { AssetClient } from '@nascentdigital/funnel-cms';
2
- import { EventBus, Language, Schema } from '@nascentdigital/funnel-core';
1
+ import { AssetClient, PageClient } from '@nascentdigital/funnel-cms';
2
+ import { ContentfulData, ContentfulPageData } from '@nascentdigital/funnel-cms/contentful';
3
+ import { EventBus, FieldModel, Language, Schema } from '@nascentdigital/funnel-core';
3
4
  import { Asset, Block, IPage, PageSettings, Section, SectionBlock } from '@nascentdigital/funnel-editor/components';
4
5
  import { Observable } from 'rxjs';
5
6
  export declare class Page implements IPage {
6
7
  readonly id: Schema.Page.Id;
7
8
  readonly template: Schema.Page;
8
9
  readonly eventBus: EventBus;
10
+ readonly settings: PageSettings;
9
11
  readonly groupId: Schema.Page.GroupId;
10
12
  readonly brand: string;
11
13
  readonly language: Language;
12
14
  readonly region: string;
13
- readonly url: string;
14
15
  readonly publishedOn?: number;
15
16
  readonly createdOn: number;
16
- readonly updatedOn: number;
17
+ private _state;
18
+ private _initialErrors;
19
+ private readonly _discover;
17
20
  private readonly _content;
18
21
  private readonly _assets;
19
22
  private readonly _pages;
20
23
  private readonly _collections;
21
- private readonly _tags;
22
24
  private _initialTags;
25
+ private readonly _tags;
26
+ private _initialName;
27
+ private _name;
23
28
  private _initialSlug;
29
+ private _url;
24
30
  private _slug;
25
- private _syncing;
31
+ private _initialPublication?;
32
+ private _publication?;
33
+ private _updatedOn;
26
34
  private _modifiedOn?;
35
+ private _deletedBlocks;
36
+ private _syncing;
37
+ private readonly _subscription;
38
+ private _savingOn?;
39
+ readonly references: ReadonlyArray<ContentfulData.Link.Entry | ContentfulData.Link.Asset>;
27
40
  constructor(args: Page.ConstructorArgs);
28
- settings: PageSettings;
29
- publication: number | undefined;
30
41
  get events$(): Observable<IPage.Events>;
31
42
  get stable$(): Observable<boolean>;
43
+ get state(): Schema.Page.State;
44
+ private set state(value);
32
45
  get modified(): boolean;
46
+ get updatedOn(): number;
47
+ get changes(): Page.Changes;
33
48
  get published(): boolean;
49
+ get type(): Schema.Page.Type;
34
50
  get syncing(): boolean;
51
+ set syncing(syncing: boolean);
52
+ repair(): void;
53
+ get url(): string;
54
+ get initialSlug(): string | undefined;
35
55
  get hasSlug(): boolean;
56
+ set slug(slug: string | undefined);
36
57
  get slug(): string | undefined;
58
+ get initialName(): string;
59
+ get name(): string;
60
+ set name(name: string);
61
+ get initialPublication(): number | undefined;
62
+ get publication(): number | undefined;
63
+ set publication(publication: number | undefined);
64
+ get initialErrors(): boolean;
65
+ get errors(): Page.Errors;
66
+ get valid(): boolean;
67
+ get hasErrors(): boolean;
68
+ get asRef(): IPage.Ref;
37
69
  get discover(): ReadonlyArray<Block>;
70
+ get seo(): Block<Schema.Block<string, any, any>>;
71
+ getPreviewBlock(): Block | undefined;
38
72
  get content(): ReadonlyArray<Section | Block>;
39
73
  get blocks(): (Block<Schema.Block<string, any, any>> | SectionBlock<Schema.Block<string, any, any>>)[];
74
+ get deleteBlocks(): ReadonlyArray<Block>;
40
75
  get firstBlock(): Block<Schema.Block<string, any, any>> | SectionBlock<Schema.Block<string, any, any>> | undefined;
41
76
  get firstItem(): Block<Schema.Block<string, any, any>> | Section;
42
77
  get items(): Array<Block | Section>;
43
78
  get assets(): Asset[];
44
79
  get collections(): ReadonlyArray<Schema.Collection.Data.AsLink>;
80
+ get pages(): ReadonlyArray<Schema.Page.Data.AsRef>;
45
81
  get initialTags(): ReadonlySet<Schema.Tag<string, string>>;
46
82
  get tagGroups(): ReadonlyArray<Schema.TagGroup>;
47
83
  get tags(): ReadonlySet<Schema.Tag>;
84
+ hydrateStores(references: IPage.References): void;
48
85
  getItem(identifier: string | undefined): Block | SectionBlock | Section | PageSettings | undefined;
49
86
  coerceItem(identifier: string | undefined): Block | SectionBlock | Section | PageSettings;
50
- deleteBlock(area: IPage.Area, key: string): void;
87
+ deleteBlock(area: IPage.Area, key: string): boolean;
51
88
  getAsset(assetId: Asset.Id): Asset | undefined;
52
89
  getAssetScope(range: Schema.AssetScope.Range): Schema.AssetScope;
53
90
  getSearchScope(): AssetClient.GetAssets.Scope;
@@ -61,8 +98,23 @@ export declare class Page implements IPage {
61
98
  removePageRef(pageId: Schema.Page.Id): boolean;
62
99
  addTag(tag: Schema.Tag): void;
63
100
  removeTag(tag: Schema.Tag): void;
101
+ onSaveStart(): void;
102
+ onSaveComplete(updatedOn: number): void;
103
+ private getBlock;
104
+ private raiseEvent;
64
105
  }
65
106
  export declare namespace Page {
107
+ type Blocks = Block[];
108
+ type Content = Array<Block | Section>;
109
+ type Errors = {
110
+ page: Page;
111
+ items: Array<Block | Section>;
112
+ };
113
+ type Changes = {
114
+ page: Page;
115
+ items: Array<Block | Section>;
116
+ };
117
+ type Target = Block | SectionBlock | Section | FieldModel;
66
118
  type ConstructorArgs = {
67
119
  template: Schema.Page;
68
120
  eventBus: EventBus;
@@ -75,15 +127,24 @@ export declare namespace Page {
75
127
  slug?: string;
76
128
  name: string;
77
129
  tags: Schema.Tag[];
130
+ discover: Blocks;
78
131
  content: Content;
79
132
  files?: Asset[];
80
133
  pages?: IPage.Ref[];
81
134
  collections?: Schema.Collection.Data.AsLink[];
82
135
  state: Schema.Page.State;
136
+ errors: boolean;
83
137
  createdOn: number;
84
138
  updatedOn: number;
85
139
  publishedOn?: number;
86
140
  publication?: number;
141
+ references: ContentfulData.References;
87
142
  };
88
- type Content = Array<Block | Section>;
143
+ type FromSchemaData = {
144
+ data: ContentfulPageData.ForSchema;
145
+ references?: Schema.Page.References;
146
+ eventBus?: EventBus;
147
+ };
148
+ function fromSchemaData({ data, references, eventBus }: FromSchemaData): Page;
149
+ function toUpdates(page: Page, savables: IPage.Savable[]): PageClient.Update.Args;
89
150
  }