@teipublisher/pb-components 2.26.1-next.2 → 3.0.0-next-4.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/.github/workflows/docker-cypress.yml +54 -0
- package/.github/workflows/main.yml +6 -4
- package/.github/workflows/node.js.yml +56 -21
- package/.github/workflows/release.js.yml +19 -17
- package/.releaserc.json +1 -1
- package/CHANGELOG.md +351 -9
- package/Dockerfile +78 -70
- package/README.md +112 -4
- package/css/components.css +5 -5
- package/css/gridjs/mermaid.min.css +1 -1
- package/css/leaflet/Control.Geocoder.css +1 -126
- package/css/leaflet/images/layers.png +0 -0
- package/css/tify/tify.css +6 -5
- package/css/tom-select/tom-select.bootstrap4.min.css +1 -1
- package/css/tom-select/tom-select.bootstrap5.min.css +1 -1
- package/css/tom-select/tom-select.default.min.css +1 -1
- package/css/tom-select/tom-select.default.min.css.map +1 -0
- package/css/tom-select/tom-select.min.css +1 -1
- package/cypress.config.js +84 -0
- package/dist/api.html +1 -1
- package/dist/css/design-system.css +607 -0
- package/dist/demo/bundle-test.html +4 -3
- package/dist/demo/components.css +46 -1
- package/dist/demo/design-system.html +710 -0
- package/dist/demo/dts-client.html +2 -2
- package/dist/demo/pb-autocomplete.html +23 -11
- package/dist/demo/pb-autocomplete2.html +66 -55
- package/dist/demo/pb-autocomplete3.html +17 -8
- package/dist/demo/pb-blacklab-highlight.html +28 -11
- package/dist/demo/pb-blacklab-results.html +3 -2
- package/dist/demo/pb-browse-docs.html +24 -24
- package/dist/demo/pb-browse-docs2.html +3 -3
- package/dist/demo/pb-clipboard.html +32 -28
- package/dist/demo/pb-code-editor.html +6 -6
- package/dist/demo/pb-code-highlight.html +63 -63
- package/dist/demo/pb-codepen.html +1 -1
- package/dist/demo/pb-collapse.html +1 -1
- package/dist/demo/pb-collapse2.html +2 -2
- package/dist/demo/pb-combo-box.html +135 -130
- package/dist/demo/pb-custom-form.html +64 -55
- package/dist/demo/pb-dialog.html +12 -6
- package/dist/demo/pb-document.html +1 -1
- package/dist/demo/pb-download.html +68 -59
- package/dist/demo/pb-drawer.html +67 -46
- package/dist/demo/pb-drawer2.html +65 -58
- package/dist/demo/pb-edit-app.html +2 -2
- package/dist/demo/pb-edit-xml.html +1 -1
- package/dist/demo/pb-facsimile-2.html +26 -11
- package/dist/demo/pb-facsimile-3.html +25 -10
- package/dist/demo/pb-facsimile-dedup-test-2.html +48 -0
- package/dist/demo/pb-facsimile-dedup-test.html +48 -0
- package/dist/demo/pb-facsimile.html +4 -4
- package/dist/demo/pb-formula.html +1 -1
- package/dist/demo/pb-grid.html +22 -8
- package/dist/demo/pb-highlight.html +2 -2
- package/dist/demo/pb-i18n-simple.html +1 -0
- package/dist/demo/pb-i18n.html +15 -5
- package/dist/demo/pb-image-strip-standalone.html +2 -2
- package/dist/demo/pb-image-strip-view.html +2 -2
- package/dist/demo/pb-leaflet-map.html +3 -3
- package/dist/demo/pb-leaflet-map2.html +2 -2
- package/dist/demo/pb-leaflet-map3.html +3 -3
- package/dist/demo/pb-link.html +1 -1
- package/dist/demo/pb-load.html +2 -6
- package/dist/demo/pb-login.html +1 -3
- package/dist/demo/pb-manage-odds.html +9 -4
- package/dist/demo/pb-markdown.html +1 -1
- package/dist/demo/pb-media-query.html +2 -2
- package/dist/demo/pb-mei.html +2 -2
- package/dist/demo/pb-mei2.html +2 -2
- package/dist/demo/pb-message.html +2 -3
- package/dist/demo/pb-odd-editor.html +54 -52
- package/dist/demo/pb-page-header.html +27 -0
- package/dist/demo/pb-popover.html +1 -1
- package/dist/demo/pb-print-preview.html +2 -2
- package/dist/demo/pb-progress.html +4 -4
- package/dist/demo/pb-repeat.html +32 -36
- package/dist/demo/pb-search.html +16 -5
- package/dist/demo/pb-search2.html +4 -4
- package/dist/demo/pb-search3.html +3 -3
- package/dist/demo/pb-search4.html +3 -3
- package/dist/demo/pb-select-feature.html +4 -4
- package/dist/demo/pb-select-feature2.html +4 -4
- package/dist/demo/pb-select-feature3.html +2 -2
- package/dist/demo/pb-select-i18n.html +58 -53
- package/dist/demo/pb-select-odd.html +1 -1
- package/dist/demo/pb-select.html +190 -75
- package/dist/demo/pb-select2.html +91 -37
- package/dist/demo/pb-select3.html +109 -41
- package/dist/demo/pb-svg.html +1 -1
- package/dist/demo/pb-table-grid.html +26 -15
- package/dist/demo/pb-tabs.html +15 -7
- package/dist/demo/pb-tify.html +7 -7
- package/dist/demo/pb-timeline.html +1 -1
- package/dist/demo/pb-timeline2.html +1 -1
- package/dist/demo/pb-toggle-feature.html +26 -23
- package/dist/demo/pb-toggle-feature2.html +4 -4
- package/dist/demo/pb-toggle-feature3.html +2 -2
- package/dist/demo/pb-toggle-feature4.html +56 -54
- package/dist/demo/pb-version.html +2 -2
- package/dist/demo/pb-view.html +78 -40
- package/dist/demo/pb-view2.html +69 -46
- package/dist/demo/pb-view3.html +53 -48
- package/dist/demo/pb-view4.html +70 -49
- package/dist/demo/pb-zoom.html +2 -2
- package/dist/{es-global-bridge-d8ce175d.js → es-global-bridge-D8ZcUcx_.js} +0 -4
- package/dist/focus-mixin-VCsFap6b.js +768 -0
- package/dist/images/icons.svg +217 -0
- package/dist/jinn-codemirror-DETLdm08.js +1 -0
- package/dist/lib/openseadragon.min.js +80 -0
- package/dist/lib/openseadragon.min.js.map +1 -0
- package/dist/pb-code-editor.js +25 -20
- package/dist/pb-component-docs.js +414 -3225
- package/dist/pb-components-bundle.js +3046 -4402
- package/dist/pb-dialog-tklYGWfc.js +121 -0
- package/dist/pb-edit-app.js +208 -107
- package/dist/pb-elements.json +716 -249
- package/dist/pb-facsimile.js +46 -0
- package/dist/pb-i18n-C0NDma4h.js +1 -0
- package/dist/pb-leaflet-map.js +23 -23
- package/dist/pb-mei.js +152 -134
- package/dist/pb-mixin-DHoWQheB.js +1 -0
- package/dist/pb-odd-editor.js +1671 -1231
- package/dist/pb-tify.js +1 -27
- package/dist/unsafe-html-D5VGo9Oq.js +1 -0
- package/dist/urls-BEONu_g4.js +1 -0
- package/eslint.config.mjs +92 -0
- package/gh-pages.js +5 -3
- package/i18n/common/en.json +6 -0
- package/i18n/common/pl.json +2 -2
- package/images/icons.svg +217 -0
- package/index.html +0 -5
- package/lib/leaflet-src.js.map +1 -0
- package/lib/leaflet.markercluster-src.js.map +1 -0
- package/lib/openseadragon.min.js +6 -6
- package/package.json +56 -81
- package/pb-elements.json +716 -249
- package/rollup.config.mjs +312 -0
- package/src/assets/components.css +5 -5
- package/src/assets/design-system.css +607 -0
- package/src/authority/airtable.js +20 -21
- package/src/authority/anton.js +129 -129
- package/src/authority/custom.js +70 -27
- package/src/authority/geonames.js +38 -32
- package/src/authority/gnd.js +50 -42
- package/src/authority/kbga.js +136 -134
- package/src/authority/metagrid.js +44 -46
- package/src/authority/reconciliation.js +66 -68
- package/src/authority/registry.js +4 -4
- package/src/docs/demo-utils.js +91 -0
- package/src/docs/pb-component-docs.js +287 -147
- package/src/docs/pb-component-view.js +380 -273
- package/src/docs/pb-components-list.js +115 -51
- package/src/docs/pb-demo-snippet.js +199 -174
- package/src/dts-client.js +306 -303
- package/src/dts-select-endpoint.js +125 -85
- package/src/parse-date-service.js +184 -135
- package/src/pb-ajax.js +175 -173
- package/src/pb-authority-lookup.js +198 -158
- package/src/pb-autocomplete.js +731 -313
- package/src/pb-blacklab-highlight.js +266 -260
- package/src/pb-blacklab-results.js +230 -225
- package/src/pb-browse-docs.js +601 -484
- package/src/pb-browse.js +68 -65
- package/src/pb-clipboard.js +97 -76
- package/src/pb-code-editor.js +111 -103
- package/src/pb-code-highlight.js +234 -204
- package/src/pb-codepen.js +81 -73
- package/src/pb-collapse.js +265 -152
- package/src/pb-combo-box.js +191 -191
- package/src/pb-components-bundle.js +1 -7
- package/src/pb-components.js +2 -6
- package/src/pb-custom-form.js +230 -141
- package/src/pb-dialog.js +99 -63
- package/src/pb-document.js +118 -91
- package/src/pb-download.js +214 -198
- package/src/pb-drawer.js +146 -149
- package/src/pb-edit-app.js +471 -240
- package/src/pb-edit-xml.js +101 -98
- package/src/pb-events.js +126 -107
- package/src/pb-facs-link.js +130 -101
- package/src/pb-facsimile.js +494 -410
- package/src/pb-fetch.js +389 -0
- package/src/pb-formula.js +152 -154
- package/src/pb-geolocation.js +130 -132
- package/src/pb-grid-action.js +59 -56
- package/src/pb-grid.js +388 -228
- package/src/pb-highlight.js +142 -142
- package/src/pb-hotkeys.js +40 -42
- package/src/pb-i18n.js +115 -127
- package/src/pb-icon-button.js +108 -0
- package/src/pb-icon.js +283 -0
- package/src/pb-image-strip.js +85 -79
- package/src/pb-lang.js +142 -57
- package/src/pb-leaflet-map.js +551 -483
- package/src/pb-link.js +132 -126
- package/src/pb-load.js +495 -428
- package/src/pb-login.js +303 -248
- package/src/pb-manage-odds.js +384 -338
- package/src/pb-map-icon.js +90 -90
- package/src/pb-map-layer.js +86 -86
- package/src/pb-markdown.js +107 -110
- package/src/pb-media-query.js +75 -73
- package/src/pb-mei.js +523 -303
- package/src/pb-message.js +144 -98
- package/src/pb-mixin.js +268 -265
- package/src/pb-navigation.js +83 -96
- package/src/pb-observable.js +39 -39
- package/src/pb-odd-editor.js +1209 -948
- package/src/pb-odd-elementspec-editor.js +375 -310
- package/src/pb-odd-model-editor.js +1189 -941
- package/src/pb-odd-parameter-editor.js +269 -170
- package/src/pb-odd-rendition-editor.js +184 -131
- package/src/pb-page.js +451 -422
- package/src/pb-paginate.js +260 -178
- package/src/pb-panel.js +217 -183
- package/src/pb-popover-themes.js +16 -9
- package/src/pb-popover.js +297 -288
- package/src/pb-print-preview.js +128 -128
- package/src/pb-progress.js +52 -52
- package/src/pb-repeat.js +141 -108
- package/src/pb-restricted.js +85 -78
- package/src/pb-search.js +258 -230
- package/src/pb-select-feature.js +210 -126
- package/src/pb-select-odd.js +184 -118
- package/src/pb-select-template.js +113 -78
- package/src/pb-select.js +330 -229
- package/src/pb-split-list.js +181 -176
- package/src/pb-svg.js +81 -80
- package/src/pb-table-column.js +55 -55
- package/src/pb-table-grid.js +334 -205
- package/src/pb-tabs.js +238 -61
- package/src/pb-tify.js +3331 -126
- package/src/pb-timeline.js +394 -255
- package/src/pb-toggle-feature.js +196 -188
- package/src/pb-upload.js +201 -176
- package/src/pb-version.js +22 -34
- package/src/pb-view-annotate.js +138 -102
- package/src/pb-view.js +1722 -1272
- package/src/pb-zoom.js +144 -46
- package/src/search-result-service.js +256 -223
- package/src/seed-element.js +14 -22
- package/src/settings.js +4 -4
- package/src/theming.js +98 -91
- package/src/urls.js +403 -289
- package/src/utils.js +53 -51
- package/vite.config.js +86 -0
- package/css/pb-styles.css +0 -51
- package/dist/iron-form-3b8dcaa7.js +0 -210
- package/dist/jinn-codemirror-da0e2d1f.js +0 -1
- package/dist/paper-checkbox-515a5284.js +0 -1597
- package/dist/paper-icon-button-b1d31571.js +0 -398
- package/dist/paper-listbox-a3b7175c.js +0 -1265
- package/dist/pb-i18n-0611135a.js +0 -1
- package/dist/pb-mixin-b1caa22e.js +0 -158
- package/dist/polymer-hack.js +0 -1
- package/dist/vaadin-element-mixin-6e4cee3a.js +0 -527
- package/lib/Control.Geocoder.min.js +0 -2
- package/lib/Control.Geocoder.min.js.map +0 -1
- package/src/assets/pb-styles.css +0 -51
- package/src/pb-light-dom.js +0 -40
- package/src/polymer-hack.js +0 -6
package/src/pb-edit-xml.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { LitElement, html, css } from 'lit
|
|
1
|
+
import { LitElement, html, css } from 'lit';
|
|
2
2
|
import { pbMixin, waitOnce } from './pb-mixin.js';
|
|
3
|
-
|
|
3
|
+
import { themableMixin } from './theming.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Open eXide to edit a given source document.
|
|
@@ -8,110 +8,113 @@ import { pbMixin, waitOnce } from './pb-mixin.js';
|
|
|
8
8
|
* @slot - unnamed default slot for the link text
|
|
9
9
|
* @slot - unnamed slot for the link text when eXide tab is already opened
|
|
10
10
|
*/
|
|
11
|
-
export class PbEditXml extends pbMixin(LitElement) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
11
|
+
export class PbEditXml extends themableMixin(pbMixin(LitElement)) {
|
|
12
|
+
static get properties() {
|
|
13
|
+
return {
|
|
14
|
+
...super.properties,
|
|
15
|
+
/**
|
|
16
|
+
* expects a context-absolute path to the document to edit e.g. '/db/apps/tei-publisher/mytext.xml'
|
|
17
|
+
*/
|
|
18
|
+
path: {
|
|
19
|
+
type: String,
|
|
20
|
+
},
|
|
21
|
+
/**
|
|
22
|
+
* optional id reference to a pb-document
|
|
23
|
+
*/
|
|
24
|
+
src: {
|
|
25
|
+
type: String,
|
|
26
|
+
},
|
|
27
|
+
/**
|
|
28
|
+
* HTML title to be used
|
|
29
|
+
*/
|
|
30
|
+
title: {
|
|
31
|
+
type: String,
|
|
32
|
+
},
|
|
33
|
+
_href: {
|
|
34
|
+
type: String,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
constructor() {
|
|
40
|
+
super();
|
|
41
|
+
this.title = '';
|
|
42
|
+
}
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
render() {
|
|
61
|
-
// if the target is within the same origin as the current page, we can communicate with an
|
|
62
|
-
// already opened eXide, if not, only option is to open a new window.
|
|
63
|
-
if (new URL(this._href, window.location.href).origin === this.getUrl().origin) {
|
|
64
|
-
return html`<a href="${this._href}" target="eXide" title="${this.title}" @click="${this.open}"><slot></slot></a>`;
|
|
44
|
+
connectedCallback() {
|
|
45
|
+
super.connectedCallback();
|
|
46
|
+
waitOnce('pb-page-ready', options => {
|
|
47
|
+
if (options.endpoint === '.') {
|
|
48
|
+
this._href = '/exist/apps/eXide/';
|
|
49
|
+
} else {
|
|
50
|
+
const host = /^(.*:\/+[^/]+)\/.*$/.exec(options.endpoint);
|
|
51
|
+
if (host) {
|
|
52
|
+
this._href = `${host[1]}/exist/apps/eXide/`;
|
|
53
|
+
} else {
|
|
54
|
+
this._href = '/exist/apps/eXide/';
|
|
65
55
|
}
|
|
66
|
-
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
render() {
|
|
61
|
+
// if the target is within the same origin as the current page, we can communicate with an
|
|
62
|
+
// already opened eXide, if not, only option is to open a new window.
|
|
63
|
+
if (new URL(this._href, window.location.href).origin === this.getUrl().origin) {
|
|
64
|
+
return html`<a href="${this._href}" target="eXide" title="${this.title}" @click="${this.open}"
|
|
65
|
+
><slot></slot
|
|
66
|
+
></a>`;
|
|
67
67
|
}
|
|
68
|
+
return html`<a href="${this._href}/index.html?open=${this.path}" title="${this.title}"
|
|
69
|
+
><slot></slot
|
|
70
|
+
></a>`;
|
|
71
|
+
}
|
|
68
72
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
73
|
+
static get styles() {
|
|
74
|
+
return css`
|
|
75
|
+
:host {
|
|
76
|
+
display: inline;
|
|
77
|
+
}
|
|
74
78
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
79
|
+
a {
|
|
80
|
+
text-decoration: none;
|
|
81
|
+
}
|
|
82
|
+
`;
|
|
83
|
+
}
|
|
81
84
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
setPath(path) {
|
|
86
|
+
this.path = path;
|
|
87
|
+
}
|
|
85
88
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
89
|
+
open(ev) {
|
|
90
|
+
ev.preventDefault();
|
|
91
|
+
let href = this._href;
|
|
92
|
+
let { path } = this;
|
|
93
|
+
if (this.src) {
|
|
94
|
+
const sourceComponent = document.getElementById(this.src);
|
|
95
|
+
path = sourceComponent.getFullPath();
|
|
96
|
+
href = sourceComponent.sourceView;
|
|
97
|
+
}
|
|
95
98
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
99
|
+
// try to retrieve existing eXide window
|
|
100
|
+
const exide = window.open('', 'eXide');
|
|
101
|
+
if (exide && !exide.closed) {
|
|
102
|
+
// check if eXide is really available or it's an empty page
|
|
103
|
+
const app = exide.eXide;
|
|
104
|
+
if (app) {
|
|
105
|
+
console.log('<pb-edit-xml> using existing eXide to open %s', path);
|
|
106
|
+
// eXide is there
|
|
107
|
+
exide.eXide.app.findDocument(path);
|
|
108
|
+
exide.focus();
|
|
109
|
+
} else {
|
|
110
|
+
console.log('<pb-edit-xml> opening new eXide for %s', path);
|
|
111
|
+
window.eXide_onload = function () {
|
|
112
|
+
exide.eXide.app.findDocument(path);
|
|
113
|
+
};
|
|
114
|
+
// empty page
|
|
115
|
+
exide.location = href;
|
|
116
|
+
}
|
|
115
117
|
}
|
|
118
|
+
}
|
|
116
119
|
}
|
|
117
|
-
customElements.define('pb-edit-xml', PbEditXml);
|
|
120
|
+
customElements.define('pb-edit-xml', PbEditXml);
|
package/src/pb-events.js
CHANGED
|
@@ -1,123 +1,142 @@
|
|
|
1
|
-
import { defaultChannel } from
|
|
1
|
+
import { defaultChannel } from './pb-mixin.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Utility class to plug into TEI Publisher's event system from custom javascript.
|
|
5
5
|
*/
|
|
6
6
|
export class PbEvents {
|
|
7
|
+
/**
|
|
8
|
+
* Subscribe to an event received on particular channels.
|
|
9
|
+
*
|
|
10
|
+
* @param {string} name the name of the event to listen for
|
|
11
|
+
* @param {string|string[]|null} channels name of a channel, array of channel names or null to target the default channel
|
|
12
|
+
* @param {Function|undefined} callback function called when event is triggered.
|
|
13
|
+
* Receives the event as first and the event handler as second parameter.
|
|
14
|
+
*/
|
|
15
|
+
static subscribe(name, channels, callback, once = false) {
|
|
16
|
+
const _channels = PbEvents._getChannels(channels);
|
|
17
|
+
const handler = document.addEventListener(
|
|
18
|
+
name,
|
|
19
|
+
(/** @type {CustomEvent} */ ev) => {
|
|
20
|
+
if (callback && ev.detail && ev.detail.key && _channels.includes(ev.detail.key)) {
|
|
21
|
+
callback(ev, handler);
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
once,
|
|
26
|
+
},
|
|
27
|
+
);
|
|
28
|
+
}
|
|
7
29
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Subscribe to an event received on a particular channel once. Returns a promise
|
|
32
|
+
* which resolves when the event is caught.
|
|
33
|
+
*
|
|
34
|
+
* @param {string} name the name of the event to listen for
|
|
35
|
+
* @param {string|string[]|null} channels name of a channel, array of channel names or null to target the default channel
|
|
36
|
+
* @returns {Promise} resolves if event is caught, providing the event as parameter
|
|
37
|
+
*/
|
|
38
|
+
static subscribeOnce(name, channels = null) {
|
|
39
|
+
const _channels = PbEvents._getChannels(channels);
|
|
40
|
+
return new Promise(resolve => {
|
|
41
|
+
document.addEventListener(
|
|
42
|
+
name,
|
|
43
|
+
(/** @type {CustomEvent} */ ev) => {
|
|
44
|
+
if (ev.detail && ev.detail.key && _channels.includes(ev.detail.key)) {
|
|
45
|
+
resolve(ev);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
once: true,
|
|
50
|
+
},
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
26
54
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return new Promise((resolve) => {
|
|
38
|
-
document.addEventListener(name, (/** @type {CustomEvent} */ ev) => {
|
|
39
|
-
if (ev.detail && ev.detail.key && _channels.includes(ev.detail.key)) {
|
|
40
|
-
resolve(ev);
|
|
41
|
-
}
|
|
42
|
-
}, {
|
|
43
|
-
once: true
|
|
44
|
-
});
|
|
45
|
-
});
|
|
55
|
+
/**
|
|
56
|
+
* determine channels to subscribe to
|
|
57
|
+
*
|
|
58
|
+
* @param {string|string[]|null} channels name of a channel, array of channel names or null to target the default channel
|
|
59
|
+
* @returns {string[]} channels
|
|
60
|
+
*/
|
|
61
|
+
static _getChannels(channels) {
|
|
62
|
+
// no channels: null or empty string or empty array
|
|
63
|
+
if (channels === null || !channels.length) {
|
|
64
|
+
return [defaultChannel];
|
|
46
65
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
*
|
|
51
|
-
* @param {string|string[]|null} channels name of a channel, array of channel names or null to target the default channel
|
|
52
|
-
* @returns {string[]} channels
|
|
53
|
-
*/
|
|
54
|
-
static _getChannels(channels) {
|
|
55
|
-
// no channels: null or empty string or empty array
|
|
56
|
-
if (channels === null || !channels.length) {
|
|
57
|
-
return [defaultChannel]
|
|
58
|
-
}
|
|
59
|
-
// single string
|
|
60
|
-
if (!Array.isArray(channels)) {
|
|
61
|
-
return [channels];
|
|
62
|
-
}
|
|
63
|
-
return channels;
|
|
66
|
+
// single string
|
|
67
|
+
if (!Array.isArray(channels)) {
|
|
68
|
+
return [channels];
|
|
64
69
|
}
|
|
70
|
+
return channels;
|
|
71
|
+
}
|
|
65
72
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Emit an event to a particular channel
|
|
75
|
+
*
|
|
76
|
+
* @param {string} type the name of the event to emit
|
|
77
|
+
* @param {string|null} channel name of the channel or null to target the default channel
|
|
78
|
+
* @param {any|null} detail value to pass in the event details
|
|
79
|
+
*/
|
|
80
|
+
static emit(type, channel = null, detail = null) {
|
|
81
|
+
const options = detail || {};
|
|
82
|
+
options.key = channel || defaultChannel;
|
|
83
|
+
const ev = new CustomEvent(type, {
|
|
84
|
+
detail: options,
|
|
85
|
+
});
|
|
86
|
+
document.dispatchEvent(ev);
|
|
87
|
+
}
|
|
81
88
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
/**
|
|
90
|
+
* Wait for one or more TEI Publisher web components to become ready (by waiting for their `pb-ready` event).
|
|
91
|
+
*
|
|
92
|
+
* @param {HTMLElement|HTMLElement[]} targets element or array of elements to check for ready state
|
|
93
|
+
* @returns Promise which resolves when all components are ready
|
|
94
|
+
*/
|
|
95
|
+
static ifReady(targets) {
|
|
96
|
+
if (!Array.isArray(targets)) {
|
|
97
|
+
targets = [targets];
|
|
98
|
+
}
|
|
99
|
+
// const targets = Array.from(document.querySelectorAll(selector));
|
|
100
|
+
return new Promise(resolve => {
|
|
101
|
+
const targetCount = targets.length;
|
|
102
|
+
if (targetCount === 0) {
|
|
103
|
+
// selector did not return any targets
|
|
104
|
+
resolve();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
let count = targetCount;
|
|
108
|
+
targets.forEach(target => {
|
|
109
|
+
if (target._isReady) {
|
|
110
|
+
count -= 1;
|
|
111
|
+
if (count === 0) {
|
|
112
|
+
resolve();
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
91
115
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
let count = targetCount;
|
|
101
|
-
targets.forEach((target) => {
|
|
102
|
-
if (target._isReady) {
|
|
103
|
-
count -= 1;
|
|
104
|
-
if (count === 0) {
|
|
105
|
-
resolve();
|
|
106
|
-
}
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
const handler = target.addEventListener('pb-ready', () => {
|
|
110
|
-
count -= 1;
|
|
111
|
-
if (count === 0) {
|
|
112
|
-
target.removeEventListener('pb-ready', handler);
|
|
113
|
-
resolve();
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
});
|
|
116
|
+
const handler = target.addEventListener('pb-ready', () => {
|
|
117
|
+
count -= 1;
|
|
118
|
+
if (count === 0) {
|
|
119
|
+
target.removeEventListener('pb-ready', handler);
|
|
120
|
+
resolve();
|
|
121
|
+
}
|
|
117
122
|
});
|
|
118
|
-
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
119
126
|
}
|
|
120
127
|
|
|
121
128
|
if (!window.pbEvents) {
|
|
122
|
-
|
|
123
|
-
|
|
129
|
+
window.pbEvents = PbEvents;
|
|
130
|
+
// Ensure a classic-script global variable binding for legacy code that references
|
|
131
|
+
// an undeclared `pbEvents` identifier (e.g., non-module scripts). Adding a
|
|
132
|
+
// small classic script creates a global var bound to window.pbEvents.
|
|
133
|
+
try {
|
|
134
|
+
const s = document.createElement('script');
|
|
135
|
+
s.type = 'text/javascript';
|
|
136
|
+
s.text =
|
|
137
|
+
'if (typeof pbEvents === "undefined") { try { pbEvents = window.pbEvents; } catch(e) {} }';
|
|
138
|
+
(document.head || document.documentElement).appendChild(s);
|
|
139
|
+
} catch (e) {
|
|
140
|
+
// ignore if DOM not ready; legacy code may still read via window.pbEvents
|
|
141
|
+
}
|
|
142
|
+
}
|