@jumoo/usync 17.5.2-prerelease.15 → 17.5.3-prerelease.16

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 (40) hide show
  1. package/README.md +6 -0
  2. package/dist/api/client.gen.js +1 -2
  3. package/dist/api/index.d.ts +1 -1
  4. package/dist/api/index.js +1 -1
  5. package/dist/api/types.gen.d.ts +1 -325
  6. package/dist/api/types.gen.js +0 -13
  7. package/dist/components/index.d.ts +0 -3
  8. package/dist/components/index.js +0 -3
  9. package/dist/components/usync-content-preview.js +7 -15
  10. package/dist/components/usync-content-type-preview.js +10 -28
  11. package/dist/components/usync-data-type-preview.js +4 -2
  12. package/dist/dialogs/details-modal-element.d.ts +9 -5
  13. package/dist/dialogs/details-modal-element.js +120 -42
  14. package/dist/exports.d.ts +1 -0
  15. package/dist/exports.js +1 -0
  16. package/dist/index.js +9 -1
  17. package/dist/lang/files/da-dk.d.ts +1 -1
  18. package/dist/lang/files/da-dk.js +1 -1
  19. package/dist/lang/files/de-de.d.ts +1 -1
  20. package/dist/lang/files/de-de.js +1 -1
  21. package/dist/lang/files/en-us.d.ts +14 -1
  22. package/dist/lang/files/en-us.js +14 -1
  23. package/dist/lang/files/es-es.d.ts +1 -1
  24. package/dist/lang/files/es-es.js +1 -1
  25. package/dist/lang/files/fr-fr.d.ts +1 -1
  26. package/dist/lang/files/fr-fr.js +1 -1
  27. package/dist/lang/files/nl-nl.d.ts +1 -1
  28. package/dist/lang/files/nl-nl.js +1 -1
  29. package/dist/manifests.js +2 -0
  30. package/dist/preview/index.d.ts +1 -0
  31. package/dist/preview/index.js +1 -0
  32. package/dist/preview/manifest.d.ts +2 -0
  33. package/dist/preview/manifest.js +22 -0
  34. package/dist/preview/types.d.ts +72 -0
  35. package/dist/preview/types.js +2 -0
  36. package/dist/signalr/signalr.context.js +73 -26
  37. package/dist/utils/preview/content-type-layout.d.ts +1 -1
  38. package/package.json +2 -2
  39. package/dist/hey-api.d.ts +0 -11
  40. package/dist/hey-api.js +0 -14
@@ -9,20 +9,33 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _uSyncDetailsModalElement_instances, _uSyncDetailsModalElement_repository, _uSyncDetailsModalElement_moveTo, _uSyncDetailsModalElement_loadPreview, _uSyncDetailsModalElement_showActions, _uSyncDetailsModalElement_onImport, _uSyncDetailsModalElement_onClose;
12
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
13
+ if (kind === "m") throw new TypeError("Private method is not writable");
14
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
15
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
16
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
17
+ };
18
+ var _uSyncDetailsModalElement_instances, _uSyncDetailsModalElement_repository, _uSyncDetailsModalElement_previewFilter, _uSyncDetailsModalElement_previewProps, _uSyncDetailsModalElement_moveTo, _uSyncDetailsModalElement_loadPreview, _uSyncDetailsModalElement_hasPreview, _uSyncDetailsModalElement_showActions, _uSyncDetailsModalElement_onImport, _uSyncDetailsModalElement_onClose;
13
19
  import { UMB_MODAL_MANAGER_CONTEXT, UmbModalBaseElement, } from '@umbraco-cms/backoffice/modal';
14
20
  import { css, customElement, html, nothing, state, } from '@umbraco-cms/backoffice/external/lit';
15
21
  import { USYNC_IMPORT_SINGLE_MODAL, uSyncActionRepository, } from '@jumoo/uSync';
16
- import '../components/usync-data-type-preview.js';
17
- import '../components/usync-content-type-preview.js';
18
- import '../components/usync-content-preview.js';
22
+ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
19
23
  let uSyncDetailsModalElement = class uSyncDetailsModalElement extends UmbModalBaseElement {
20
24
  constructor() {
21
25
  super();
22
26
  _uSyncDetailsModalElement_instances.add(this);
23
27
  this._tab = 'changes';
28
+ this._loading = false;
24
29
  this._index = -1;
30
+ /** the entity types there is a 'usync-item-preview' element for */
31
+ this._previewTypes = new Set();
25
32
  _uSyncDetailsModalElement_repository.set(this, new uSyncActionRepository(this));
33
+ // kept between renders, so the extension slot doesn't rebuild the preview each time.
34
+ _uSyncDetailsModalElement_previewFilter.set(this, (_manifest) => false);
35
+ _uSyncDetailsModalElement_previewProps.set(this, {});
36
+ this.observe(umbExtensionsRegistry.byType('usync-item-preview'), (manifests) => {
37
+ this._previewTypes = new Set(manifests.flatMap((m) => m.forEntityTypes));
38
+ });
26
39
  // this.consumeContext(USYNC_CORE_CONTEXT_TOKEN, (_instance) => {
27
40
  // if (!_instance) return;
28
41
  // this.#actionContext = _instance;
@@ -36,7 +49,8 @@ let uSyncDetailsModalElement = class uSyncDetailsModalElement extends UmbModalBa
36
49
  }
37
50
  render() {
38
51
  return html `
39
- <umb-body-layout headline="Changes : ${this._item?.name ?? ''}">
52
+ <umb-body-layout>
53
+ ${this.renderHeadline()}
40
54
  <div class="layout">
41
55
  <uui-box style="--uui-box-default-padding: 0;">
42
56
  <div slot="header" id="header">
@@ -46,11 +60,7 @@ let uSyncDetailsModalElement = class uSyncDetailsModalElement extends UmbModalBa
46
60
  <div slot="header-actions">${this.renderActions()}</div>
47
61
  </uui-box>
48
62
  ${this.renderTabs()}
49
- ${this._tab === 'preview' && this._preview
50
- ? this.renderPreview(this._preview)
51
- : html `<uui-box style="--uui-box-default-padding: 0;">
52
- <usync-change-view .item=${this._item}></usync-change-view>
53
- </uui-box>`}
63
+ ${this.renderTabContent()}
54
64
  </div>
55
65
  ${this.renderNavigation()}
56
66
  <div slot="actions">
@@ -62,6 +72,18 @@ let uSyncDetailsModalElement = class uSyncDetailsModalElement extends UmbModalBa
62
72
  </umb-body-layout>
63
73
  `;
64
74
  }
75
+ renderHeadline() {
76
+ const item = this._item;
77
+ if (!item)
78
+ return nothing;
79
+ // singular names first (Content type), then the plural group
80
+ // names the results use (Content Types), then the raw type.
81
+ const itemType = this.localize.termOrDefault(`uSync_itemType${item.itemType}`, this.localize.termOrDefault(`uSync_${item.itemType}`, item.itemType));
82
+ return html `<div slot="header" id="headline">
83
+ <h3 title=${item.name}>Changes : ${item.name}</h3>
84
+ <span class="item-info">${itemType} · ${item.change}</span>
85
+ </div>`;
86
+ }
65
87
  renderNavigation() {
66
88
  const count = this.data?.items?.length ?? 0;
67
89
  if (count < 2 || this._index < 0)
@@ -89,36 +111,45 @@ let uSyncDetailsModalElement = class uSyncDetailsModalElement extends UmbModalBa
89
111
  </div>`;
90
112
  }
91
113
  renderTabs() {
92
- if (!this._preview)
114
+ if (!__classPrivateFieldGet(this, _uSyncDetailsModalElement_instances, "m", _uSyncDetailsModalElement_hasPreview).call(this))
93
115
  return nothing;
94
116
  return html `<uui-tab-group>
95
- <uui-tab
96
- .label=${this.localize.termOrDefault('uSync_changesTab', 'Changes')}
97
- ?active=${this._tab === 'changes'}
98
- @click=${() => (this._tab = 'changes')}></uui-tab>
99
- <uui-tab
100
- .label=${this.localize.termOrDefault('uSync_previewTab', 'Preview')}
101
- ?active=${this._tab === 'preview'}
102
- @click=${() => (this._tab = 'preview')}></uui-tab>
117
+ ${this.renderTab('changes', 'uSync_changesTab', 'Changes', 'icon-eye')}
118
+ ${this.renderTab('diff', 'uSync_diffTab', 'Diff', 'icon-code')}
103
119
  </uui-tab-group>`;
104
120
  }
105
- renderPreview(preview) {
106
- switch (preview.entityType) {
107
- case 'data-type':
108
- return html `<usync-data-type-preview
109
- .preview=${preview}></usync-data-type-preview>`;
110
- case 'document-type':
111
- case 'media-type':
112
- case 'member-type':
113
- return html `<usync-content-type-preview
114
- .preview=${preview}></usync-content-type-preview>`;
115
- case 'document':
116
- case 'media':
117
- return html `<usync-content-preview
118
- .preview=${preview}></usync-content-preview>`;
119
- default:
120
- return nothing;
121
+ renderTab(tab, key, fallback, icon) {
122
+ const label = this.localize.termOrDefault(key, fallback);
123
+ return html `<uui-tab
124
+ .label=${label}
125
+ ?active=${this._tab === tab}
126
+ @click=${() => (this._tab = tab)}>
127
+ <!-- uui-tab stacks its icon slot above the label, so the icon
128
+ goes in the label to keep them on one line. -->
129
+ <span class="tab-label"><umb-icon name=${icon}></umb-icon>${label}</span>
130
+ </uui-tab>`;
131
+ }
132
+ renderTabContent() {
133
+ // the visual changes view is the default, the raw diff is there
134
+ // for anything that doesn't have a preview (or if you ask for it).
135
+ if (this._tab === 'changes') {
136
+ if (this._loading)
137
+ return html `<uui-loader-bar></uui-loader-bar>`;
138
+ if (__classPrivateFieldGet(this, _uSyncDetailsModalElement_instances, "m", _uSyncDetailsModalElement_hasPreview).call(this))
139
+ return this.renderPreview();
121
140
  }
141
+ return html `<uui-box style="--uui-box-default-padding: 0;">
142
+ <usync-change-view .item=${this._item}></usync-change-view>
143
+ </uui-box>`;
144
+ }
145
+ renderPreview() {
146
+ // packages can show previews for their own items by registering a
147
+ // 'usync-item-preview' element for the entity type their preview mapper returns.
148
+ return html `<umb-extension-slot
149
+ type="usync-item-preview"
150
+ single
151
+ .filter=${__classPrivateFieldGet(this, _uSyncDetailsModalElement_previewFilter, "f")}
152
+ .props=${__classPrivateFieldGet(this, _uSyncDetailsModalElement_previewProps, "f")}></umb-extension-slot>`;
122
153
  }
123
154
  renderActions() {
124
155
  if (!__classPrivateFieldGet(this, _uSyncDetailsModalElement_instances, "m", _uSyncDetailsModalElement_showActions).call(this))
@@ -133,6 +164,8 @@ let uSyncDetailsModalElement = class uSyncDetailsModalElement extends UmbModalBa
133
164
  }
134
165
  };
135
166
  _uSyncDetailsModalElement_repository = new WeakMap();
167
+ _uSyncDetailsModalElement_previewFilter = new WeakMap();
168
+ _uSyncDetailsModalElement_previewProps = new WeakMap();
136
169
  _uSyncDetailsModalElement_instances = new WeakSet();
137
170
  _uSyncDetailsModalElement_moveTo = function _uSyncDetailsModalElement_moveTo(index) {
138
171
  const item = this.data?.items?.[index];
@@ -145,23 +178,27 @@ _uSyncDetailsModalElement_moveTo = function _uSyncDetailsModalElement_moveTo(ind
145
178
  };
146
179
  _uSyncDetailsModalElement_loadPreview = async function _uSyncDetailsModalElement_loadPreview() {
147
180
  const item = this._item;
148
- if (!item?.handler || !item.key) {
149
- this._tab = 'changes';
181
+ if (!item?.handler || !item.key)
150
182
  return;
151
- }
152
183
  // only some handlers support previews, the rest return a 404
153
- // and the modal stays as it was (just the changes list).
184
+ // and the modal shows the diff on its own. we leave _tab alone
185
+ // so a user who picked the diff stays on it as they move through.
186
+ this._loading = true;
154
187
  const { data } = await __classPrivateFieldGet(this, _uSyncDetailsModalElement_repository, "f").getPreview(item.handler, item.key);
155
188
  // moving through the list quickly can return previews out of order,
156
189
  // so drop anything that isn't for the item we are now showing.
157
190
  if (item !== this._item)
158
191
  return;
192
+ this._loading = false;
159
193
  if (data?.entityType) {
194
+ const entityType = data.entityType;
195
+ __classPrivateFieldSet(this, _uSyncDetailsModalElement_previewFilter, (manifest) => manifest.forEntityTypes.includes(entityType), "f");
196
+ __classPrivateFieldSet(this, _uSyncDetailsModalElement_previewProps, { preview: data }, "f");
160
197
  this._preview = data;
161
198
  }
162
- else {
163
- this._tab = 'changes';
164
- }
199
+ };
200
+ _uSyncDetailsModalElement_hasPreview = function _uSyncDetailsModalElement_hasPreview() {
201
+ return !!this._preview && this._previewTypes.has(this._preview.entityType);
165
202
  };
166
203
  _uSyncDetailsModalElement_showActions = function _uSyncDetailsModalElement_showActions() {
167
204
  const showActions = this.data?.showActions;
@@ -199,6 +236,41 @@ uSyncDetailsModalElement.styles = css `
199
236
  margin: 0;
200
237
  }
201
238
 
239
+ #headline {
240
+ display: flex;
241
+ flex-direction: column;
242
+ min-width: 0;
243
+ }
244
+
245
+ #headline h3 {
246
+ margin: 0;
247
+ white-space: nowrap;
248
+ overflow: hidden;
249
+ text-overflow: ellipsis;
250
+ }
251
+
252
+ #headline .item-info {
253
+ font-size: var(--uui-type-small-size);
254
+ color: var(--uui-color-text-alt);
255
+ }
256
+
257
+ uui-tab-group {
258
+ background-color: var(--uui-color-surface);
259
+ border-radius: var(--uui-border-radius);
260
+ box-shadow: var(--uui-shadow-depth-1);
261
+ padding: 0 var(--uui-size-space-2);
262
+ }
263
+
264
+ .tab-label {
265
+ display: inline-flex;
266
+ align-items: center;
267
+ gap: var(--uui-size-space-2);
268
+ }
269
+
270
+ .tab-label umb-icon {
271
+ font-size: 16px;
272
+ }
273
+
202
274
  #navigation {
203
275
  display: flex;
204
276
  align-items: center;
@@ -215,12 +287,18 @@ __decorate([
215
287
  __decorate([
216
288
  state()
217
289
  ], uSyncDetailsModalElement.prototype, "_tab", void 0);
290
+ __decorate([
291
+ state()
292
+ ], uSyncDetailsModalElement.prototype, "_loading", void 0);
218
293
  __decorate([
219
294
  state()
220
295
  ], uSyncDetailsModalElement.prototype, "_item", void 0);
221
296
  __decorate([
222
297
  state()
223
298
  ], uSyncDetailsModalElement.prototype, "_index", void 0);
299
+ __decorate([
300
+ state()
301
+ ], uSyncDetailsModalElement.prototype, "_previewTypes", void 0);
224
302
  uSyncDetailsModalElement = __decorate([
225
303
  customElement('usync-details-modal')
226
304
  ], uSyncDetailsModalElement);
package/dist/exports.d.ts CHANGED
@@ -8,3 +8,4 @@ export * from './constants.js';
8
8
  export * from './conditions/index.js';
9
9
  export * from './signalr/index.js';
10
10
  export * from './tree/index.js';
11
+ export * from './preview/index.js';
package/dist/exports.js CHANGED
@@ -8,3 +8,4 @@ export * from './constants.js';
8
8
  export * from './conditions/index.js';
9
9
  export * from './signalr/index.js';
10
10
  export * from './tree/index.js';
11
+ export * from './preview/index.js';
package/dist/index.js CHANGED
@@ -5,7 +5,15 @@ import './external/signalr/index.js';
5
5
  import './api/index.js';
6
6
  export * from './exports.js';
7
7
  import { manifests } from './manifests.js';
8
- export const onInit = (_host, extensionRegistry) => {
8
+ import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';
9
+ import { client } from './api/client.gen.js';
10
+ export const onInit = async (host, extensionRegistry) => {
9
11
  // register the manifests
10
12
  extensionRegistry.registerMany(manifests);
13
+ const authContext = await host.getContext(UMB_AUTH_CONTEXT);
14
+ if (!authContext) {
15
+ console.warn('UMB_AUTH_CONTEXT not available — extension API client will not be authenticated');
16
+ return;
17
+ }
18
+ authContext.configureClient(client);
11
19
  };
@@ -25,8 +25,8 @@ declare const _default: {
25
25
  detailHeadline: string;
26
26
  detailHeader: string;
27
27
  detailPosition: string;
28
- previewTab: string;
29
28
  changesTab: string;
29
+ diffTab: string;
30
30
  previewCurrent: string;
31
31
  previewIncoming: string;
32
32
  previewNotInSite: string;
@@ -25,8 +25,8 @@ export default {
25
25
  detailHeadline: 'Registrerede ændringer',
26
26
  detailHeader: 'Ting der er anderledes',
27
27
  detailPosition: '%0% af %1%',
28
- previewTab: 'Visuel',
29
28
  changesTab: 'Ændringer',
29
+ diffTab: 'Diff',
30
30
  previewCurrent: 'Nuværende (dette site)',
31
31
  previewIncoming: 'Indkommende (uSync-filer)',
32
32
  previewNotInSite: 'Dette element findes ikke på sitet endnu',
@@ -25,8 +25,8 @@ declare const _default: {
25
25
  detailHeadline: string;
26
26
  detailHeader: string;
27
27
  detailPosition: string;
28
- previewTab: string;
29
28
  changesTab: string;
29
+ diffTab: string;
30
30
  previewCurrent: string;
31
31
  previewIncoming: string;
32
32
  previewNotInSite: string;
@@ -25,8 +25,8 @@ export default {
25
25
  detailHeadline: 'Erkannte Änderungen',
26
26
  detailHeader: 'Was sich unterscheidet',
27
27
  detailPosition: '%0% von %1%',
28
- previewTab: 'Visuell',
29
28
  changesTab: 'Änderungen',
29
+ diffTab: 'Diff',
30
30
  previewCurrent: 'Aktuell (diese Website)',
31
31
  previewIncoming: 'Eingehend (uSync-Dateien)',
32
32
  previewNotInSite: 'Dieses Element existiert noch nicht auf der Website',
@@ -25,8 +25,8 @@ declare const _default: {
25
25
  detailHeadline: string;
26
26
  detailHeader: string;
27
27
  detailPosition: string;
28
- previewTab: string;
29
28
  changesTab: string;
29
+ diffTab: string;
30
30
  previewCurrent: string;
31
31
  previewIncoming: string;
32
32
  previewNotInSite: string;
@@ -128,6 +128,19 @@ declare const _default: {
128
128
  uploadIntro: string;
129
129
  uploadSuccess: string;
130
130
  uploadError: string;
131
+ itemTypeILanguage: string;
132
+ itemTypeIDictionaryItem: string;
133
+ itemTypeIDataType: string;
134
+ itemTypeITemplate: string;
135
+ itemTypeIContentType: string;
136
+ itemTypeIMediaType: string;
137
+ itemTypeIMemberType: string;
138
+ itemTypeIContent: string;
139
+ itemTypeIMedia: string;
140
+ itemTypeIDomain: string;
141
+ itemTypeIWebhook: string;
142
+ itemTypeIRelationType: string;
143
+ itemTypeMediaFile: string;
131
144
  ILanguage: string;
132
145
  IDictionaryItem: string;
133
146
  IDataType: string;
@@ -25,8 +25,8 @@ export default {
25
25
  detailHeadline: 'Detected Changes',
26
26
  detailHeader: 'Things that are different',
27
27
  detailPosition: '%0% of %1%',
28
- previewTab: 'Visual',
29
28
  changesTab: 'Changes',
29
+ diffTab: 'Diff',
30
30
  previewCurrent: 'Current (this site)',
31
31
  previewIncoming: 'Incoming (uSync files)',
32
32
  previewNotInSite: 'This item does not exist in the site yet',
@@ -140,6 +140,19 @@ export default {
140
140
  uploadIntro: 'Select a zip file containing uSync files that you want to upload',
141
141
  uploadSuccess: 'The files have been uploaded and extracted to the uSync folder',
142
142
  uploadError: 'There was an error uploading the files',
143
+ itemTypeILanguage: 'Language',
144
+ itemTypeIDictionaryItem: 'Dictionary item',
145
+ itemTypeIDataType: 'Data type',
146
+ itemTypeITemplate: 'Template',
147
+ itemTypeIContentType: 'Content type',
148
+ itemTypeIMediaType: 'Media type',
149
+ itemTypeIMemberType: 'Member type',
150
+ itemTypeIContent: 'Content',
151
+ itemTypeIMedia: 'Media',
152
+ itemTypeIDomain: 'Domain',
153
+ itemTypeIWebhook: 'Webhook',
154
+ itemTypeIRelationType: 'Relation type',
155
+ itemTypeMediaFile: 'Media file',
143
156
  ILanguage: 'Language',
144
157
  IDictionaryItem: 'Dictionary Items',
145
158
  IDataType: 'DataTypes',
@@ -25,8 +25,8 @@ declare const _default: {
25
25
  detailHeadline: string;
26
26
  detailHeader: string;
27
27
  detailPosition: string;
28
- previewTab: string;
29
28
  changesTab: string;
29
+ diffTab: string;
30
30
  previewCurrent: string;
31
31
  previewIncoming: string;
32
32
  previewNotInSite: string;
@@ -25,8 +25,8 @@ export default {
25
25
  detailHeadline: 'Cambios detectados',
26
26
  detailHeader: 'Cosas que son diferentes',
27
27
  detailPosition: '%0% de %1%',
28
- previewTab: 'Visual',
29
28
  changesTab: 'Cambios',
29
+ diffTab: 'Diff',
30
30
  previewCurrent: 'Actual (este sitio)',
31
31
  previewIncoming: 'Entrante (archivos de uSync)',
32
32
  previewNotInSite: 'Este elemento aún no existe en el sitio',
@@ -25,8 +25,8 @@ declare const _default: {
25
25
  detailHeadline: string;
26
26
  detailHeader: string;
27
27
  detailPosition: string;
28
- previewTab: string;
29
28
  changesTab: string;
29
+ diffTab: string;
30
30
  previewCurrent: string;
31
31
  previewIncoming: string;
32
32
  previewNotInSite: string;
@@ -25,8 +25,8 @@ export default {
25
25
  detailHeadline: 'Modifications détectées',
26
26
  detailHeader: 'Ce qui est différent',
27
27
  detailPosition: '%0% sur %1%',
28
- previewTab: 'Visuel',
29
28
  changesTab: 'Modifications',
29
+ diffTab: 'Diff',
30
30
  previewCurrent: 'Actuel (ce site)',
31
31
  previewIncoming: 'Entrant (fichiers uSync)',
32
32
  previewNotInSite: "Cet élément n'existe pas encore sur le site",
@@ -25,8 +25,8 @@ declare const _default: {
25
25
  detailHeadline: string;
26
26
  detailHeader: string;
27
27
  detailPosition: string;
28
- previewTab: string;
29
28
  changesTab: string;
29
+ diffTab: string;
30
30
  previewCurrent: string;
31
31
  previewIncoming: string;
32
32
  previewNotInSite: string;
@@ -25,8 +25,8 @@ export default {
25
25
  detailHeadline: 'Gedetecteerde wijzigingen',
26
26
  detailHeader: 'Wat er anders is',
27
27
  detailPosition: '%0% van %1%',
28
- previewTab: 'Visueel',
29
28
  changesTab: 'Wijzigingen',
29
+ diffTab: 'Diff',
30
30
  previewCurrent: 'Huidig (deze site)',
31
31
  previewIncoming: 'Inkomend (uSync-bestanden)',
32
32
  previewNotInSite: 'Dit item bestaat nog niet op de site',
package/dist/manifests.js CHANGED
@@ -4,6 +4,7 @@ import { manifests as localization } from './lang/manifest.js';
4
4
  import { manifests as dialogs } from './dialogs/manifest.js';
5
5
  import { manifests as conditions } from './conditions/manifest.js';
6
6
  import { manifests as icons } from './icons/manifest.js';
7
+ import { manifests as previews } from './preview/manifest.js';
7
8
  export const manifests = [
8
9
  ...localization,
9
10
  ...trees,
@@ -11,4 +12,5 @@ export const manifests = [
11
12
  ...dialogs,
12
13
  ...conditions,
13
14
  ...icons,
15
+ ...previews,
14
16
  ];
@@ -0,0 +1 @@
1
+ export * from './types.js';
@@ -0,0 +1 @@
1
+ export * from './types.js';
@@ -0,0 +1,2 @@
1
+ import type { ManifestuSyncItemPreview } from './types.js';
2
+ export declare const manifests: ManifestuSyncItemPreview[];
@@ -0,0 +1,22 @@
1
+ const dataTypePreview = {
2
+ type: 'usync-item-preview',
3
+ alias: 'usync.item-preview.data-type',
4
+ name: 'uSync data type preview',
5
+ element: () => import('../components/usync-data-type-preview.js'),
6
+ forEntityTypes: ['data-type'],
7
+ };
8
+ const contentTypePreview = {
9
+ type: 'usync-item-preview',
10
+ alias: 'usync.item-preview.content-type',
11
+ name: 'uSync content type preview',
12
+ element: () => import('../components/usync-content-type-preview.js'),
13
+ forEntityTypes: ['document-type', 'media-type', 'member-type'],
14
+ };
15
+ const contentPreview = {
16
+ type: 'usync-item-preview',
17
+ alias: 'usync.item-preview.content',
18
+ name: 'uSync content preview',
19
+ element: () => import('../components/usync-content-preview.js'),
20
+ forEntityTypes: ['document', 'media'],
21
+ };
22
+ export const manifests = [dataTypePreview, contentTypePreview, contentPreview];
@@ -0,0 +1,72 @@
1
+ import type { ManifestElement } from '@umbraco-cms/backoffice/extension-api';
2
+ import type { DataTypeResponseModel, DocumentResponseModel, DocumentTypeResponseModel, MediaResponseModel, MediaTypeResponseModel, MemberTypeResponseModel } from '@umbraco-cms/backoffice/external/backend-api';
3
+ import type { SyncItemPreviewResponse } from '../api';
4
+ /**
5
+ * An element that shows the preview of an import for one or more entity types.
6
+ */
7
+ export interface uSyncItemPreviewElement extends HTMLElement {
8
+ preview?: SyncItemPreviewResponse;
9
+ }
10
+ /**
11
+ * Shows the preview for items of the given entity types in the details dialog.
12
+ *
13
+ * The entity types match the `EntityType` of the server side preview mapper,
14
+ * and `preview.preview` is the model that mapper built.
15
+ */
16
+ export interface ManifestuSyncItemPreview extends ManifestElement<uSyncItemPreviewElement> {
17
+ type: 'usync-item-preview';
18
+ forEntityTypes: Array<string>;
19
+ }
20
+ declare global {
21
+ interface UmbExtensionManifestMap {
22
+ ManifestuSyncItemPreview: ManifestuSyncItemPreview;
23
+ }
24
+ }
25
+ /** the model a preview mapper built, as the type the element expects. */
26
+ export declare const getPreviewModel: <T>(preview?: SyncItemPreviewResponse) => T | undefined;
27
+ export type uSyncPreviewContentTypeModel = DocumentTypeResponseModel | MediaTypeResponseModel | MemberTypeResponseModel;
28
+ /** preview model for a data type (entity type data-type) */
29
+ export interface SyncDataTypePreview {
30
+ current?: DataTypeResponseModel | null;
31
+ incoming?: DataTypeResponseModel | null;
32
+ }
33
+ /** what the preview needs to lay out the properties of an item */
34
+ export interface SyncPropertiesPreview<TTypeModel> {
35
+ /** the content types either side is composed of (as they are in the site) */
36
+ compositions: Array<TTypeModel>;
37
+ /** the data types used by the properties on either side */
38
+ dataTypes: Array<DataTypeResponseModel>;
39
+ /** keys of the data types that aren't in the site yet */
40
+ newDataTypes: Array<string>;
41
+ /** keys of the compositions that aren't in the site yet */
42
+ newCompositions: Array<string>;
43
+ }
44
+ /** preview model for a document, media or member type */
45
+ export interface SyncContentTypePreview<TTypeModel extends uSyncPreviewContentTypeModel = uSyncPreviewContentTypeModel> extends SyncPropertiesPreview<TTypeModel> {
46
+ current?: TTypeModel | null;
47
+ incoming?: TTypeModel | null;
48
+ }
49
+ export interface SyncContentPreviewCulture {
50
+ culture: string;
51
+ published: boolean;
52
+ }
53
+ /** the settings of a content or media item that aren't property values */
54
+ export interface SyncContentPreviewInfo {
55
+ /** name of the parent item (null when the item is at the root) */
56
+ parent?: string | null;
57
+ sortOrder: number;
58
+ trashed: boolean;
59
+ /** alias of the template (content only) */
60
+ template?: string | null;
61
+ /** published state for each culture (an empty culture for invariant content) */
62
+ published: Array<SyncContentPreviewCulture>;
63
+ }
64
+ /** preview model for a document or media item */
65
+ export interface SyncContentPreview<TModel extends DocumentResponseModel | MediaResponseModel = DocumentResponseModel | MediaResponseModel, TTypeModel extends DocumentTypeResponseModel | MediaTypeResponseModel = DocumentTypeResponseModel | MediaTypeResponseModel> extends SyncPropertiesPreview<TTypeModel> {
66
+ current?: TModel | null;
67
+ incoming?: TModel | null;
68
+ currentInfo?: SyncContentPreviewInfo | null;
69
+ incomingInfo?: SyncContentPreviewInfo | null;
70
+ /** the document (or media) type of the item, as it is in the site */
71
+ contentType?: TTypeModel | null;
72
+ }
@@ -0,0 +1,2 @@
1
+ /** the model a preview mapper built, as the type the element expects. */
2
+ export const getPreviewModel = (preview) => preview?.preview;