@jumoo/usync 18.2.0 → 18.2.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.
Files changed (35) hide show
  1. package/LICENCE +372 -372
  2. package/README.md +16 -10
  3. package/dist/components/usync-action-box.js +71 -71
  4. package/dist/components/usync-change-detail.js +409 -409
  5. package/dist/components/usync-change-view.js +49 -49
  6. package/dist/components/usync-progress-box.js +113 -113
  7. package/dist/components/usync-result-row.js +65 -65
  8. package/dist/components/usync-results-group-view.js +63 -63
  9. package/dist/components/usync-results-view.js +64 -64
  10. package/dist/components/usync-sync-file-info-view.js +10 -10
  11. package/dist/constants.js +1 -1
  12. package/dist/dialogs/details-modal-element.js +45 -45
  13. package/dist/dialogs/error-modal-element.js +22 -22
  14. package/dist/dialogs/legacy-modal-element.js +22 -22
  15. package/dist/dialogs/single-import-modal.element.js +31 -31
  16. package/dist/icons/svg/logo.js +20 -20
  17. package/dist/lang/files/da-dk.js +12 -12
  18. package/dist/lang/files/de-de.js +12 -12
  19. package/dist/lang/files/en-us.js +12 -12
  20. package/dist/lang/files/es-es.js +12 -12
  21. package/dist/lang/files/fr-fr.js +12 -12
  22. package/dist/lang/files/nl-nl.js +12 -12
  23. package/dist/signalr/signalr.context.js +73 -26
  24. package/dist/tree/usync.menu-element.js +8 -8
  25. package/dist/workspace/components/usync-action-button.js +53 -53
  26. package/dist/workspace/components/usync-file-picker.element.js +33 -33
  27. package/dist/workspace/components/usync-file-upload.element.js +25 -25
  28. package/dist/workspace/dialogs/import-modal.element.js +22 -22
  29. package/dist/workspace/views/addons/addons.element.js +97 -97
  30. package/dist/workspace/views/default/default.element.js +186 -186
  31. package/dist/workspace/views/legacy/legacy.element.js +81 -81
  32. package/dist/workspace/views/settings/components/usyncSettingItem.element.js +38 -38
  33. package/dist/workspace/views/settings/settings.element.js +124 -124
  34. package/dist/workspace/workspace.element.js +16 -16
  35. package/package.json +77 -77
@@ -46,21 +46,21 @@ export default {
46
46
  changeHeading: 'Ergebnisse',
47
47
  changeCount: '{1}/{0} Änderungen',
48
48
  noChangeCount: '0/{0} Änderungen',
49
- legacyInfo: `<p>uSync hat einen Legacy-uSync-Ordner unter <strong>%0%</strong> gefunden.<br />
49
+ legacyInfo: `<p>uSync hat einen Legacy-uSync-Ordner unter <strong>%0%</strong> gefunden.<br />
50
50
  Der Inhalt muss wahrscheinlich konvertiert werden</p>`,
51
- legacyObsolete: `<h4>Veraltete Datentypen</h4>
52
- <ul>%0%</ul>
53
- <p>Sie können diese Datentypen mit
54
- <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a> konvertieren<br />
51
+ legacyObsolete: `<h4>Veraltete Datentypen</h4>
52
+ <ul>%0%</ul>
53
+ <p>Sie können diese Datentypen mit
54
+ <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a> konvertieren<br />
55
55
  <em>(In der vollständigen uSync-Version wird die Konvertierung hier stattfinden.)</em></p>`,
56
- legacyCopy: `<h4>Nach uSync/v14 kopieren</h4>
57
- <p>Sie können Ihren %0%-Ordner in den ~/uSync/v14-Ordner kopieren<br />und einen Import ausführen.</p>
58
- <p>Wenn nichts konvertiert werden muss, sollte alles korrekt importiert werden.</p>
56
+ legacyCopy: `<h4>Nach uSync/v14 kopieren</h4>
57
+ <p>Sie können Ihren %0%-Ordner in den ~/uSync/v14-Ordner kopieren<br />und einen Import ausführen.</p>
58
+ <p>Wenn nichts konvertiert werden muss, sollte alles korrekt importiert werden.</p>
59
59
  <p><strong>Entfernen oder benennen Sie den %0%-Ordner um, um dieses Popup zu verhindern</strong></p>`,
60
- hmacMismatch: `<h4>HMAC-Abweichung <uui-icon name="alert"></uui-icon></h4>
61
- <p>Es scheint, dass die <code>Imaging:HMAC</code>-Einstellung, die zum Generieren der Dateien im uSync-Ordner verwendet wurde, nicht mit der aktuellen Einstellung dieser Website übereinstimmt.</p>
62
- <p>Bilder in RTE-Steuerelementen haben den HMAC-Wert an die URL angehängt. Ohne zusätzliche Konfiguration werden diese Bilder möglicherweise nicht korrekt dargestellt.</p>
63
- <ul><li>Sie können die "HMAC-Zuordnung" in uSync aktivieren,</li>
60
+ hmacMismatch: `<h4>HMAC-Abweichung <uui-icon name="alert"></uui-icon></h4>
61
+ <p>Es scheint, dass die <code>Imaging:HMAC</code>-Einstellung, die zum Generieren der Dateien im uSync-Ordner verwendet wurde, nicht mit der aktuellen Einstellung dieser Website übereinstimmt.</p>
62
+ <p>Bilder in RTE-Steuerelementen haben den HMAC-Wert an die URL angehängt. Ohne zusätzliche Konfiguration werden diese Bilder möglicherweise nicht korrekt dargestellt.</p>
63
+ <ul><li>Sie können die "HMAC-Zuordnung" in uSync aktivieren,</li>
64
64
  <li>oder Sie können sicherstellen, dass der HMAC-Wert in der <code>Imaging:HMAC</code>-Einstellung mit dem Wert übereinstimmt, der zum Generieren der Dateien im uSync-Ordner verwendet wurde</li></ul>`,
65
65
  formatMismatch: 'Die Formatversion der Synchronisierungsdatei stimmt nicht mit der erwarteten Version überein. Dies kann auf ein potenzielles Kompatibilitätsproblem hinweisen.',
66
66
  legacyBanner: 'Diese Website enthält Dateien einer früheren Version von uSync. Details finden Sie auf der Registerkarte Legacy.',
@@ -77,21 +77,21 @@ export default {
77
77
  changeHeading: 'Results',
78
78
  changeCount: '{1}/{0} changes',
79
79
  noChangeCount: '0/{0} changes',
80
- legacyInfo: `<p>uSync has found a legacy uSync folder at <strong>%0%</strong>.<br />
80
+ legacyInfo: `<p>uSync has found a legacy uSync folder at <strong>%0%</strong>.<br />
81
81
  Its likely that the content in it will need coverting in someway</p>`,
82
- legacyObsolete: `<h4>Obsolete DataTypes</h4>
83
- <ul>%0%</ul>
84
- <p>You can convert these DataTypes using
85
- <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a><br />
82
+ legacyObsolete: `<h4>Obsolete DataTypes</h4>
83
+ <ul>%0%</ul>
84
+ <p>You can convert these DataTypes using
85
+ <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a><br />
86
86
  <em>(In the full uSync release conversion will happen here.)</em></p>`,
87
- legacyCopy: `<h4>Copy to uSync/v14</h4>
88
- <p>You can copy your %0% folder to the ~/uSync/v14 folder<br />and run an import.</p>
89
- <p>If nothing needs converting, then everything should import.</p>
87
+ legacyCopy: `<h4>Copy to uSync/v14</h4>
88
+ <p>You can copy your %0% folder to the ~/uSync/v14 folder<br />and run an import.</p>
89
+ <p>If nothing needs converting, then everything should import.</p>
90
90
  <p><strong>Remove or rename the %0% folder to prevent this popup</strong></p>`,
91
- hmacMismatch: `<h4>HMAC Mismatch <uui-icon name="alert"></uui-icon></h4>
92
- <p>It looks like the <code>Imaging:HMAC</code> setting used to generate the files in the uSync folder does not match the current setting for this site.</p>
93
- <p>Images inside RTE controls will have the HMAC Value appended to the URL value, and without any additional configuration, these images may not render correctly.</p>
94
- <ul><li>You can turn on "HMAC mapping" in uSync,</li>
91
+ hmacMismatch: `<h4>HMAC Mismatch <uui-icon name="alert"></uui-icon></h4>
92
+ <p>It looks like the <code>Imaging:HMAC</code> setting used to generate the files in the uSync folder does not match the current setting for this site.</p>
93
+ <p>Images inside RTE controls will have the HMAC Value appended to the URL value, and without any additional configuration, these images may not render correctly.</p>
94
+ <ul><li>You can turn on "HMAC mapping" in uSync,</li>
95
95
  <li>or you can ensure the HMAC value in the <code>Imaging:HMAC</code> setting matches the value used to generate the files in the uSync folder</li></ul>`,
96
96
  formatMismatch: 'The sync file format version does not match the expected version. This may indicate a potential compatibility issue.',
97
97
  legacyBanner: 'This site contains files from a previous version of uSync, view the details in the legacy tab.',
@@ -46,21 +46,21 @@ export default {
46
46
  changeHeading: 'Resultados',
47
47
  changeCount: '{1}/{0} cambios',
48
48
  noChangeCount: '0/{0} cambios',
49
- legacyInfo: `<p>uSync ha encontrado una carpeta uSync heredada en <strong>%0%</strong>.<br />
49
+ legacyInfo: `<p>uSync ha encontrado una carpeta uSync heredada en <strong>%0%</strong>.<br />
50
50
  Es probable que su contenido necesite convertirse de alguna manera</p>`,
51
- legacyObsolete: `<h4>Tipos de datos obsoletos</h4>
52
- <ul>%0%</ul>
53
- <p>Puede convertir estos tipos de datos usando
54
- <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a><br />
51
+ legacyObsolete: `<h4>Tipos de datos obsoletos</h4>
52
+ <ul>%0%</ul>
53
+ <p>Puede convertir estos tipos de datos usando
54
+ <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a><br />
55
55
  <em>(En la versión completa de uSync, la conversión se realizará aquí.)</em></p>`,
56
- legacyCopy: `<h4>Copiar a uSync/v14</h4>
57
- <p>Puede copiar su carpeta %0% a la carpeta ~/uSync/v14<br />y ejecutar una importación.</p>
58
- <p>Si nada necesita convertirse, todo debería importarse correctamente.</p>
56
+ legacyCopy: `<h4>Copiar a uSync/v14</h4>
57
+ <p>Puede copiar su carpeta %0% a la carpeta ~/uSync/v14<br />y ejecutar una importación.</p>
58
+ <p>Si nada necesita convertirse, todo debería importarse correctamente.</p>
59
59
  <p><strong>Elimine o cambie el nombre de la carpeta %0% para evitar este popup</strong></p>`,
60
- hmacMismatch: `<h4>Discrepancia HMAC <uui-icon name="alert"></uui-icon></h4>
61
- <p>Parece que la configuración <code>Imaging:HMAC</code> utilizada para generar los archivos en la carpeta uSync no coincide con la configuración actual de este sitio.</p>
62
- <p>Las imágenes dentro de los controles RTE tendrán el valor HMAC añadido a la URL, y sin configuración adicional, estas imágenes pueden no mostrarse correctamente.</p>
63
- <ul><li>Puede activar el "mapeo HMAC" en uSync,</li>
60
+ hmacMismatch: `<h4>Discrepancia HMAC <uui-icon name="alert"></uui-icon></h4>
61
+ <p>Parece que la configuración <code>Imaging:HMAC</code> utilizada para generar los archivos en la carpeta uSync no coincide con la configuración actual de este sitio.</p>
62
+ <p>Las imágenes dentro de los controles RTE tendrán el valor HMAC añadido a la URL, y sin configuración adicional, estas imágenes pueden no mostrarse correctamente.</p>
63
+ <ul><li>Puede activar el "mapeo HMAC" en uSync,</li>
64
64
  <li>o puede asegurarse de que el valor HMAC en la configuración <code>Imaging:HMAC</code> coincida con el valor utilizado para generar los archivos en la carpeta uSync</li></ul>`,
65
65
  formatMismatch: 'La versión del formato del archivo de sincronización no coincide con la versión esperada. Esto puede indicar un posible problema de compatibilidad.',
66
66
  legacyBanner: 'Este sitio contiene archivos de una versión anterior de uSync. Consulte los detalles en la pestaña Heredado.',
@@ -46,21 +46,21 @@ export default {
46
46
  changeHeading: 'Résultats',
47
47
  changeCount: '{1}/{0} modifications',
48
48
  noChangeCount: '0/{0} modifications',
49
- legacyInfo: `<p>uSync a trouvé un dossier uSync hérité à <strong>%0%</strong>.<br />
49
+ legacyInfo: `<p>uSync a trouvé un dossier uSync hérité à <strong>%0%</strong>.<br />
50
50
  Il est probable que son contenu devra être converti d'une façon ou d'une autre</p>`,
51
- legacyObsolete: `<h4>Types de données obsolètes</h4>
52
- <ul>%0%</ul>
53
- <p>Vous pouvez convertir ces types de données en utilisant
54
- <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a><br />
51
+ legacyObsolete: `<h4>Types de données obsolètes</h4>
52
+ <ul>%0%</ul>
53
+ <p>Vous pouvez convertir ces types de données en utilisant
54
+ <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a><br />
55
55
  <em>(Dans la version complète d'uSync, la conversion se fera ici.)</em></p>`,
56
- legacyCopy: `<h4>Copier vers uSync/v14</h4>
57
- <p>Vous pouvez copier votre dossier %0% vers le dossier ~/uSync/v14<br />et exécuter une importation.</p>
58
- <p>Si rien ne nécessite de conversion, tout devrait s'importer correctement.</p>
56
+ legacyCopy: `<h4>Copier vers uSync/v14</h4>
57
+ <p>Vous pouvez copier votre dossier %0% vers le dossier ~/uSync/v14<br />et exécuter une importation.</p>
58
+ <p>Si rien ne nécessite de conversion, tout devrait s'importer correctement.</p>
59
59
  <p><strong>Supprimez ou renommez le dossier %0% pour éviter cette popup</strong></p>`,
60
- hmacMismatch: `<h4>Incompatibilité HMAC <uui-icon name="alert"></uui-icon></h4>
61
- <p>Il semble que le paramètre <code>Imaging:HMAC</code> utilisé pour générer les fichiers dans le dossier uSync ne corresponde pas au paramètre actuel de ce site.</p>
62
- <p>Les images dans les contrôles RTE auront la valeur HMAC ajoutée à l'URL, et sans configuration supplémentaire, ces images pourraient ne pas s'afficher correctement.</p>
63
- <ul><li>Vous pouvez activer le "mappage HMAC" dans uSync,</li>
60
+ hmacMismatch: `<h4>Incompatibilité HMAC <uui-icon name="alert"></uui-icon></h4>
61
+ <p>Il semble que le paramètre <code>Imaging:HMAC</code> utilisé pour générer les fichiers dans le dossier uSync ne corresponde pas au paramètre actuel de ce site.</p>
62
+ <p>Les images dans les contrôles RTE auront la valeur HMAC ajoutée à l'URL, et sans configuration supplémentaire, ces images pourraient ne pas s'afficher correctement.</p>
63
+ <ul><li>Vous pouvez activer le "mappage HMAC" dans uSync,</li>
64
64
  <li>ou vous pouvez vous assurer que la valeur HMAC dans le paramètre <code>Imaging:HMAC</code> correspond à la valeur utilisée pour générer les fichiers dans le dossier uSync</li></ul>`,
65
65
  formatMismatch: 'La version du format du fichier de synchronisation ne correspond pas à la version attendue. Cela peut indiquer un problème de compatibilité potentiel.',
66
66
  legacyBanner: 'Ce site contient des fichiers d\'une version précédente d\'uSync. Consultez les détails dans l\'onglet Héritage.',
@@ -46,21 +46,21 @@ export default {
46
46
  changeHeading: 'Resultaten',
47
47
  changeCount: '{1}/{0} wijzigingen',
48
48
  noChangeCount: '0/{0} wijzigingen',
49
- legacyInfo: `<p>uSync heeft een verouderde uSync-map gevonden op <strong>%0%</strong>.<br />
49
+ legacyInfo: `<p>uSync heeft een verouderde uSync-map gevonden op <strong>%0%</strong>.<br />
50
50
  Het is waarschijnlijk dat de inhoud op de een of andere manier geconverteerd moet worden</p>`,
51
- legacyObsolete: `<h4>Verouderde gegevenstypen</h4>
52
- <ul>%0%</ul>
53
- <p>U kunt deze gegevenstypen converteren met
54
- <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a><br />
51
+ legacyObsolete: `<h4>Verouderde gegevenstypen</h4>
52
+ <ul>%0%</ul>
53
+ <p>U kunt deze gegevenstypen converteren met
54
+ <a href="https://github.com/Jumoo/uSyncMigrations" target="_blank">uSync.Migrations</a><br />
55
55
  <em>(In de volledige uSync-release zal de conversie hier plaatsvinden.)</em></p>`,
56
- legacyCopy: `<h4>Kopiëren naar uSync/v14</h4>
57
- <p>U kunt uw %0%-map kopiëren naar de ~/uSync/v14-map<br />en een import uitvoeren.</p>
58
- <p>Als er niets geconverteerd hoeft te worden, zou alles correct moeten importeren.</p>
56
+ legacyCopy: `<h4>Kopiëren naar uSync/v14</h4>
57
+ <p>U kunt uw %0%-map kopiëren naar de ~/uSync/v14-map<br />en een import uitvoeren.</p>
58
+ <p>Als er niets geconverteerd hoeft te worden, zou alles correct moeten importeren.</p>
59
59
  <p><strong>Verwijder of hernoem de %0%-map om deze popup te voorkomen</strong></p>`,
60
- hmacMismatch: `<h4>HMAC-mismatch <uui-icon name="alert"></uui-icon></h4>
61
- <p>Het lijkt erop dat de <code>Imaging:HMAC</code>-instelling die werd gebruikt om de bestanden in de uSync-map te genereren, niet overeenkomt met de huidige instelling voor deze site.</p>
62
- <p>Afbeeldingen in RTE-besturingselementen hebben de HMAC-waarde toegevoegd aan de URL-waarde, en zonder aanvullende configuratie worden deze afbeeldingen mogelijk niet correct weergegeven.</p>
63
- <ul><li>U kunt "HMAC-mapping" inschakelen in uSync,</li>
60
+ hmacMismatch: `<h4>HMAC-mismatch <uui-icon name="alert"></uui-icon></h4>
61
+ <p>Het lijkt erop dat de <code>Imaging:HMAC</code>-instelling die werd gebruikt om de bestanden in de uSync-map te genereren, niet overeenkomt met de huidige instelling voor deze site.</p>
62
+ <p>Afbeeldingen in RTE-besturingselementen hebben de HMAC-waarde toegevoegd aan de URL-waarde, en zonder aanvullende configuratie worden deze afbeeldingen mogelijk niet correct weergegeven.</p>
63
+ <ul><li>U kunt "HMAC-mapping" inschakelen in uSync,</li>
64
64
  <li>of u kunt ervoor zorgen dat de HMAC-waarde in de <code>Imaging:HMAC</code>-instelling overeenkomt met de waarde die werd gebruikt om de bestanden in de uSync-map te genereren</li></ul>`,
65
65
  formatMismatch: 'De versie van het synchronisatiebestandsformaat komt niet overeen met de verwachte versie. Dit kan wijzen op een mogelijk compatibiliteitsprobleem.',
66
66
  legacyBanner: 'Deze site bevat bestanden van een eerdere versie van uSync. Bekijk de details op het tabblad Verouderd.',
@@ -1,19 +1,20 @@
1
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
- 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");
4
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
- };
6
1
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
7
2
  if (kind === "m") throw new TypeError("Private method is not writable");
8
3
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
9
4
  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");
10
5
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
6
  };
12
- var _uSyncSignalRContext_instances, _uSyncSignalRContext_connection, _uSyncSignalRContext_connected, _uSyncSignalRContext_update, _uSyncSignalRContext_add, _uSyncSignalRContext_complete, _uSyncSignalRContext_setupConnection;
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _uSyncSignalRContext_instances, _uSyncSignalRContext_connection, _uSyncSignalRContext_auth, _uSyncSignalRContext_server, _uSyncSignalRContext_connect, _uSyncSignalRContext_clientId, _uSyncSignalRContext_connected, _uSyncSignalRContext_update, _uSyncSignalRContext_add, _uSyncSignalRContext_complete, _uSyncSignalRContext_setupConnection;
13
13
  import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
14
14
  import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
15
15
  import { USYNC_SIGNALR_CONTEXT_TOKEN, } from '@jumoo/uSync';
16
16
  import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';
17
+ import { UMB_SERVER_CONTEXT } from '@umbraco-cms/backoffice/server';
17
18
  import * as signalR from '@jumoo/uSync/external/signalr';
18
19
  import { uSyncSignalRReconnectPolicy } from './signalr-reconnect-policy.js';
19
20
  export class uSyncSignalRContext extends UmbControllerBase {
@@ -21,6 +22,9 @@ export class uSyncSignalRContext extends UmbControllerBase {
21
22
  super(host);
22
23
  _uSyncSignalRContext_instances.add(this);
23
24
  _uSyncSignalRContext_connection.set(this, void 0);
25
+ _uSyncSignalRContext_auth.set(this, void 0);
26
+ _uSyncSignalRContext_server.set(this, void 0);
27
+ _uSyncSignalRContext_clientId.set(this, null);
24
28
  _uSyncSignalRContext_connected.set(this, new UmbObjectState(false));
25
29
  this.connected = __classPrivateFieldGet(this, _uSyncSignalRContext_connected, "f").asObservable();
26
30
  _uSyncSignalRContext_update.set(this, new UmbObjectState(undefined));
@@ -31,12 +35,12 @@ export class uSyncSignalRContext extends UmbControllerBase {
31
35
  this.complete = __classPrivateFieldGet(this, _uSyncSignalRContext_complete, "f").asObservable();
32
36
  this.provideContext(USYNC_SIGNALR_CONTEXT_TOKEN, this);
33
37
  this.consumeContext(UMB_AUTH_CONTEXT, (auth) => {
34
- if (!auth)
35
- return;
36
- const authConfig = auth?.getOpenApiConfiguration();
37
- if (!authConfig)
38
- return;
39
- __classPrivateFieldGet(this, _uSyncSignalRContext_instances, "m", _uSyncSignalRContext_setupConnection).call(this, '/umbraco/SyncHub', auth);
38
+ __classPrivateFieldSet(this, _uSyncSignalRContext_auth, auth, "f");
39
+ __classPrivateFieldGet(this, _uSyncSignalRContext_instances, "m", _uSyncSignalRContext_connect).call(this);
40
+ });
41
+ this.consumeContext(UMB_SERVER_CONTEXT, (server) => {
42
+ __classPrivateFieldSet(this, _uSyncSignalRContext_server, server, "f");
43
+ __classPrivateFieldGet(this, _uSyncSignalRContext_instances, "m", _uSyncSignalRContext_connect).call(this);
40
44
  });
41
45
  }
42
46
  hostConnected() {
@@ -49,7 +53,7 @@ export class uSyncSignalRContext extends UmbControllerBase {
49
53
  });
50
54
  }
51
55
  getClientId() {
52
- return __classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f")?.connectionId ?? null;
56
+ return __classPrivateFieldGet(this, _uSyncSignalRContext_clientId, "f");
53
57
  }
54
58
  /**
55
59
  * Synchronous read of the current connection state - used by callers
@@ -75,11 +79,34 @@ export class uSyncSignalRContext extends UmbControllerBase {
75
79
  __classPrivateFieldGet(this, _uSyncSignalRContext_update, "f").setValue({ message, count: 0, total: 1 });
76
80
  }
77
81
  }
78
- _uSyncSignalRContext_connection = new WeakMap(), _uSyncSignalRContext_connected = new WeakMap(), _uSyncSignalRContext_update = new WeakMap(), _uSyncSignalRContext_add = new WeakMap(), _uSyncSignalRContext_complete = new WeakMap(), _uSyncSignalRContext_instances = new WeakSet(), _uSyncSignalRContext_setupConnection = function _uSyncSignalRContext_setupConnection(url, auth) {
82
+ _uSyncSignalRContext_connection = new WeakMap(), _uSyncSignalRContext_auth = new WeakMap(), _uSyncSignalRContext_server = new WeakMap(), _uSyncSignalRContext_clientId = new WeakMap(), _uSyncSignalRContext_connected = new WeakMap(), _uSyncSignalRContext_update = new WeakMap(), _uSyncSignalRContext_add = new WeakMap(), _uSyncSignalRContext_complete = new WeakMap(), _uSyncSignalRContext_instances = new WeakSet(), _uSyncSignalRContext_connect = function _uSyncSignalRContext_connect() {
83
+ // either context being re-provided replaces the connection, so
84
+ // stop the old one rather than leave it running alongside.
85
+ if (__classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f")) {
86
+ __classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f").stop();
87
+ __classPrivateFieldSet(this, _uSyncSignalRContext_connection, undefined, "f");
88
+ __classPrivateFieldSet(this, _uSyncSignalRContext_clientId, null, "f");
89
+ __classPrivateFieldGet(this, _uSyncSignalRContext_connected, "f").setValue(false);
90
+ }
91
+ if (!__classPrivateFieldGet(this, _uSyncSignalRContext_auth, "f") || !__classPrivateFieldGet(this, _uSyncSignalRContext_server, "f"))
92
+ return;
93
+ if (!__classPrivateFieldGet(this, _uSyncSignalRContext_auth, "f").getOpenApiConfiguration())
94
+ return;
95
+ const connection = __classPrivateFieldGet(this, _uSyncSignalRContext_server, "f").getServerConnection();
96
+ // Older Umbraco versions do not expose this setting.
97
+ const skipNegotiation = 'getSignalRSkipNegotiation' in connection &&
98
+ typeof connection.getSignalRSkipNegotiation === 'function' &&
99
+ connection.getSignalRSkipNegotiation() === true;
100
+ __classPrivateFieldGet(this, _uSyncSignalRContext_instances, "m", _uSyncSignalRContext_setupConnection).call(this, '/umbraco/SyncHub', __classPrivateFieldGet(this, _uSyncSignalRContext_auth, "f"), skipNegotiation);
101
+ }, _uSyncSignalRContext_setupConnection = function _uSyncSignalRContext_setupConnection(url, auth, skipNegotiation) {
79
102
  // the token is fetched on every (re)connect, so a reconnect after
80
103
  // the original token has expired still authenticates.
81
104
  __classPrivateFieldSet(this, _uSyncSignalRContext_connection, new signalR.HubConnectionBuilder()
82
- .withUrl(url, { accessTokenFactory: () => auth.getLatestToken() })
105
+ .withUrl(url, {
106
+ accessTokenFactory: () => auth.getLatestToken(),
107
+ skipNegotiation,
108
+ transport: skipNegotiation ? signalR.HttpTransportType.WebSockets : undefined,
109
+ })
83
110
  .withAutomaticReconnect(new uSyncSignalRReconnectPolicy())
84
111
  .configureLogging(signalR.LogLevel.Warning)
85
112
  .build(), "f");
@@ -92,19 +119,39 @@ _uSyncSignalRContext_connection = new WeakMap(), _uSyncSignalRContext_connected
92
119
  __classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f").on('complete', (data) => {
93
120
  __classPrivateFieldGet(this, _uSyncSignalRContext_complete, "f").setValue(data);
94
121
  });
95
- __classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f").start().then(() => {
96
- __classPrivateFieldGet(this, _uSyncSignalRContext_connected, "f").setValue(true);
122
+ const connection = __classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f");
123
+ // a stopped connection can still report state while it winds down,
124
+ // only the current one may update connected.
125
+ const setConnected = (connected) => {
126
+ if (__classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f") !== connection)
127
+ return;
128
+ if (!connected)
129
+ __classPrivateFieldSet(this, _uSyncSignalRContext_clientId, null, "f");
130
+ __classPrivateFieldGet(this, _uSyncSignalRContext_connected, "f").setValue(connected);
131
+ };
132
+ // the connection id comes from the negotiate response, so when
133
+ // negotiation is skipped we have to ask the hub for it.
134
+ const onConnected = async () => {
135
+ const clientId = connection.connectionId ??
136
+ (await connection.invoke('GetConnectionId').catch(() => null));
137
+ if (__classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f") !== connection)
138
+ return;
139
+ __classPrivateFieldSet(this, _uSyncSignalRContext_clientId, clientId, "f");
140
+ setConnected(true);
141
+ };
142
+ connection
143
+ .start()
144
+ .then(onConnected)
145
+ .catch((error) => {
146
+ // with negotiation skipped there is no transport fallback, so a
147
+ // blocked WebSocket ends here; status polling covers progress.
148
+ console.warn('uSync: SignalR connection failed', error);
149
+ setConnected(false);
97
150
  });
98
151
  // the client id changes on reconnect, requests made after this
99
152
  // pick up the new one via getClientId().
100
- __classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f").onreconnecting(() => {
101
- __classPrivateFieldGet(this, _uSyncSignalRContext_connected, "f").setValue(false);
102
- });
103
- __classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f").onreconnected(() => {
104
- __classPrivateFieldGet(this, _uSyncSignalRContext_connected, "f").setValue(true);
105
- });
106
- __classPrivateFieldGet(this, _uSyncSignalRContext_connection, "f").onclose(() => {
107
- __classPrivateFieldGet(this, _uSyncSignalRContext_connected, "f").setValue(false);
108
- });
153
+ connection.onreconnecting(() => setConnected(false));
154
+ connection.onreconnected(onConnected);
155
+ connection.onclose(() => setConnected(false));
109
156
  };
110
157
  export default uSyncSignalRContext;
@@ -37,17 +37,17 @@ let uSyncMenuElement = class uSyncMenuElement extends UmbElementMixin(LitElement
37
37
  });
38
38
  }
39
39
  render() {
40
- return html `<umb-menu-item-layout
41
- label=${this.manifest.meta.label ?? this.manifest.name}
42
- icon-name=${this.manifest.meta.icon ?? 'icon-bug'}
43
- .href=${this.itemPath}
44
- ?has-Children=${this.hasChildren}
45
- >${this.renderChildren()}
40
+ return html `<umb-menu-item-layout
41
+ label=${this.manifest.meta.label ?? this.manifest.name}
42
+ icon-name=${this.manifest.meta.icon ?? 'icon-bug'}
43
+ .href=${this.itemPath}
44
+ ?has-Children=${this.hasChildren}
45
+ >${this.renderChildren()}
46
46
  </umb-menu-item-layout>`;
47
47
  }
48
48
  renderChildren() {
49
- return html `<umb-extension-slot
50
- type="usync-menuItem"
49
+ return html `<umb-extension-slot
50
+ type="usync-menuItem"
51
51
  default-element="umb-menu-item-default"></umb-extension-slot>`;
52
52
  }
53
53
  };
@@ -26,58 +26,58 @@ let SyncActionButtonElement = class SyncActionButtonElement extends UmbLitElemen
26
26
  : this.renderSingleAction();
27
27
  }
28
28
  renderSingleAction() {
29
- return html ` <uui-button
30
- class="action-button"
31
- .disabled=${this.disabled}
32
- label=${this.localize.termOrDefault(`uSync_${this.button?.label}`, this.button?.label ?? '')}
33
- color=${this.button?.color}
34
- look=${this.button?.look}
35
- state=${ifDefined(this.state)}
29
+ return html ` <uui-button
30
+ class="action-button"
31
+ .disabled=${this.disabled}
32
+ label=${this.localize.termOrDefault(`uSync_${this.button?.label}`, this.button?.label ?? '')}
33
+ color=${this.button?.color}
34
+ look=${this.button?.look}
35
+ state=${ifDefined(this.state)}
36
36
  @click=${() => __classPrivateFieldGet(this, _SyncActionButtonElement_instances, "m", _SyncActionButtonElement_onClick).call(this, this.button)}></uui-button>`;
37
37
  }
38
38
  renderMultipleActions(parent) {
39
39
  if (!this.button?.children)
40
40
  return nothing;
41
41
  const buttons = this.button?.children.map((item) => {
42
- return html ` <uui-menu-item
43
- .disabled=${this.disabled}
44
- .label=${this.localize.termOrDefault(`uSync_${item.label}`, item.label)}
42
+ return html ` <uui-menu-item
43
+ .disabled=${this.disabled}
44
+ .label=${this.localize.termOrDefault(`uSync_${item.label}`, item.label)}
45
45
  @click-label=${() => __classPrivateFieldGet(this, _SyncActionButtonElement_instances, "m", _SyncActionButtonElement_onClick).call(this, item)}></uui-menu-item>`;
46
46
  });
47
47
  if (buttons.length == 0)
48
48
  return nothing;
49
49
  const popoverId = `popover_${parent?.key}`;
50
- return html `
51
- <uui-button-group class="action-button">
52
- <uui-button
53
- .disabled=${this.disabled}
54
- .label=${this.button.label}
55
- color=${parent?.color}
56
- look=${parent?.look}
57
- @click=${() => __classPrivateFieldGet(this, _SyncActionButtonElement_instances, "m", _SyncActionButtonElement_onClick).call(this, this.button)}>
58
- ${this.localize.termOrDefault(`uSync_${this.button?.label}`, this.button?.label ?? '')}
59
- </uui-button>
60
- <uui-button
61
- .disabled=${this.disabled}
62
- popovertarget=${popoverId}
63
- .label=${this.button.label}
64
- color=${parent?.color}
65
- look=${parent?.look}
66
- compact>
67
- <uui-symbol-expand
68
- class="expand-symbol"
69
- .open=${this._popoverOpen}></uui-symbol-expand>
70
- </uui-button>
71
- </uui-button-group>
72
-
73
- <uui-popover-container
74
- id=${popoverId}
75
- placement="bottom-end"
76
- @toggle=${__classPrivateFieldGet(this, _SyncActionButtonElement_instances, "m", _SyncActionButtonElement_onPopoverToggle)}>
77
- <umb-popover-layout>
78
- <uui-scroll-container> ${buttons} </uui-scroll-container>
79
- </umb-popover-layout>
80
- </uui-popover-container>
50
+ return html `
51
+ <uui-button-group class="action-button">
52
+ <uui-button
53
+ .disabled=${this.disabled}
54
+ .label=${this.button.label}
55
+ color=${parent?.color}
56
+ look=${parent?.look}
57
+ @click=${() => __classPrivateFieldGet(this, _SyncActionButtonElement_instances, "m", _SyncActionButtonElement_onClick).call(this, this.button)}>
58
+ ${this.localize.termOrDefault(`uSync_${this.button?.label}`, this.button?.label ?? '')}
59
+ </uui-button>
60
+ <uui-button
61
+ .disabled=${this.disabled}
62
+ popovertarget=${popoverId}
63
+ .label=${this.button.label}
64
+ color=${parent?.color}
65
+ look=${parent?.look}
66
+ compact>
67
+ <uui-symbol-expand
68
+ class="expand-symbol"
69
+ .open=${this._popoverOpen}></uui-symbol-expand>
70
+ </uui-button>
71
+ </uui-button-group>
72
+
73
+ <uui-popover-container
74
+ id=${popoverId}
75
+ placement="bottom-end"
76
+ @toggle=${__classPrivateFieldGet(this, _SyncActionButtonElement_instances, "m", _SyncActionButtonElement_onPopoverToggle)}>
77
+ <umb-popover-layout>
78
+ <uui-scroll-container> ${buttons} </uui-scroll-container>
79
+ </umb-popover-layout>
80
+ </uui-popover-container>
81
81
  `;
82
82
  }
83
83
  };
@@ -90,18 +90,18 @@ _SyncActionButtonElement_onClick = function _SyncActionButtonElement_onClick(ite
90
90
  _SyncActionButtonElement_onPopoverToggle = function _SyncActionButtonElement_onPopoverToggle(e) {
91
91
  this._popoverOpen = e.newState === 'open';
92
92
  };
93
- SyncActionButtonElement.styles = css `
94
- .action-button {
95
- min-width: 110px;
96
- }
97
-
98
- .expand-symbol {
99
- transform: rotate(90deg);
100
- }
101
-
102
- .expand-symbol[open] {
103
- transform: rotate(180deg);
104
- }
93
+ SyncActionButtonElement.styles = css `
94
+ .action-button {
95
+ min-width: 110px;
96
+ }
97
+
98
+ .expand-symbol {
99
+ transform: rotate(90deg);
100
+ }
101
+
102
+ .expand-symbol[open] {
103
+ transform: rotate(180deg);
104
+ }
105
105
  `;
106
106
  __decorate([
107
107
  property({ type: Object })
@@ -38,53 +38,53 @@ let uSyncFilePicker = class uSyncFilePicker extends UmbLitElement {
38
38
  this.dispatchEvent(new uSyncFilePickerChangeEvent(this._file));
39
39
  }
40
40
  render() {
41
- return html `<input
42
- @click=${(e) => e.stopPropagation()}
43
- type="file"
44
- id="file"
45
- this.accept=${this.accept}
46
- @change=${this._onFilePickerChange} />
41
+ return html `<input
42
+ @click=${(e) => e.stopPropagation()}
43
+ type="file"
44
+ id="file"
45
+ this.accept=${this.accept}
46
+ @change=${this._onFilePickerChange} />
47
47
  ${this._renderFile()} ${this._renderButton()}`;
48
48
  }
49
49
  _renderFile() {
50
50
  if (!this._file)
51
51
  return nothing;
52
- return html ` <div class="file">
53
- <div>${this._file.name}</div>
54
- <uui-button
55
- @click="${() => this._removeFile()}"
56
- compact
57
- color="danger"
58
- label="Remove">
59
- <umb-icon name="icon-trash"></umb-icon>
60
- </uui-button>
52
+ return html ` <div class="file">
53
+ <div>${this._file.name}</div>
54
+ <uui-button
55
+ @click="${() => this._removeFile()}"
56
+ compact
57
+ color="danger"
58
+ label="Remove">
59
+ <umb-icon name="icon-trash"></umb-icon>
60
+ </uui-button>
61
61
  </div>`;
62
62
  }
63
63
  _renderButton() {
64
64
  return this._file
65
65
  ? nothing
66
- : html ` <uui-button
67
- id="add-button"
68
- look="placeholder"
69
- label=${this.label}
66
+ : html ` <uui-button
67
+ id="add-button"
68
+ look="placeholder"
69
+ label=${this.label}
70
70
  @click="${this._onUpload}"></uui-button>`;
71
71
  }
72
72
  };
73
73
  uSyncFilePicker.styles = [
74
- css `
75
- .file {
76
- display: flex;
77
- align-items: center;
78
- gap: var(--uui-size-space-2);
79
- }
80
-
81
- #file {
82
- display: none;
83
- }
84
-
85
- #add-button {
86
- width: 100%;
87
- }
74
+ css `
75
+ .file {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: var(--uui-size-space-2);
79
+ }
80
+
81
+ #file {
82
+ display: none;
83
+ }
84
+
85
+ #add-button {
86
+ width: 100%;
87
+ }
88
88
  `,
89
89
  ];
90
90
  __decorate([