@teipublisher/pb-components 2.25.4 → 2.25.6

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 (130) hide show
  1. package/.github/workflows/main.yml +3 -3
  2. package/.github/workflows/node.js.yml +3 -3
  3. package/.github/workflows/release.js.yml +4 -4
  4. package/.releaserc.json +1 -1
  5. package/CHANGELOG.md +15 -0
  6. package/Dockerfile +78 -70
  7. package/css/components.css +5 -5
  8. package/dist/demo/pb-drawer2.html +1 -1
  9. package/dist/demo/pb-leaflet-map.html +1 -1
  10. package/dist/demo/pb-repeat.html +1 -3
  11. package/dist/demo/pb-view3.html +1 -1
  12. package/dist/{paper-icon-button-0fb125c4.js → paper-icon-button-72125e67.js} +1 -1
  13. package/dist/pb-code-editor.js +25 -20
  14. package/dist/pb-component-docs.js +58 -54
  15. package/dist/pb-components-bundle.js +1827 -1520
  16. package/dist/pb-edit-app.js +167 -107
  17. package/dist/pb-elements.json +54 -54
  18. package/dist/{pb-i18n-0611135a.js → pb-i18n-4cc00bfe.js} +1 -1
  19. package/dist/pb-leaflet-map.js +23 -23
  20. package/dist/pb-mei.js +56 -41
  21. package/dist/{pb-mixin-b1caa22e.js → pb-mixin-886ece32.js} +1 -1
  22. package/dist/pb-odd-editor.js +925 -758
  23. package/dist/pb-tify.js +2 -2
  24. package/dist/{vaadin-element-mixin-859a0132.js → vaadin-element-mixin-ad07ba25.js} +88 -61
  25. package/gh-pages.js +5 -3
  26. package/i18n/common/pl.json +2 -2
  27. package/package.json +2 -2
  28. package/pb-elements.json +54 -54
  29. package/src/assets/components.css +5 -5
  30. package/src/authority/airtable.js +20 -21
  31. package/src/authority/anton.js +129 -129
  32. package/src/authority/custom.js +23 -21
  33. package/src/authority/geonames.js +38 -32
  34. package/src/authority/gnd.js +47 -42
  35. package/src/authority/kbga.js +137 -134
  36. package/src/authority/metagrid.js +44 -46
  37. package/src/authority/reconciliation.js +66 -67
  38. package/src/authority/registry.js +4 -4
  39. package/src/docs/pb-component-docs.js +2 -2
  40. package/src/docs/pb-component-view.js +5 -5
  41. package/src/docs/pb-components-list.js +2 -2
  42. package/src/docs/pb-demo-snippet.js +2 -2
  43. package/src/dts-client.js +299 -297
  44. package/src/dts-select-endpoint.js +90 -82
  45. package/src/parse-date-service.js +184 -135
  46. package/src/pb-ajax.js +171 -167
  47. package/src/pb-authority-lookup.js +96 -81
  48. package/src/pb-autocomplete.js +292 -280
  49. package/src/pb-blacklab-highlight.js +264 -259
  50. package/src/pb-blacklab-results.js +236 -221
  51. package/src/pb-browse-docs.js +540 -475
  52. package/src/pb-browse.js +68 -65
  53. package/src/pb-clipboard.js +79 -76
  54. package/src/pb-code-editor.js +110 -102
  55. package/src/pb-code-highlight.js +209 -204
  56. package/src/pb-codepen.js +79 -72
  57. package/src/pb-collapse.js +149 -146
  58. package/src/pb-combo-box.js +190 -190
  59. package/src/pb-components-bundle.js +1 -1
  60. package/src/pb-custom-form.js +150 -149
  61. package/src/pb-document.js +89 -90
  62. package/src/pb-download.js +208 -195
  63. package/src/pb-drawer.js +145 -148
  64. package/src/pb-edit-app.js +301 -229
  65. package/src/pb-edit-xml.js +99 -96
  66. package/src/pb-events.js +114 -107
  67. package/src/pb-facs-link.js +104 -102
  68. package/src/pb-facsimile.js +411 -413
  69. package/src/pb-formula.js +151 -153
  70. package/src/pb-geolocation.js +129 -131
  71. package/src/pb-grid-action.js +53 -56
  72. package/src/pb-grid.js +231 -228
  73. package/src/pb-highlight.js +140 -140
  74. package/src/pb-hotkeys.js +40 -42
  75. package/src/pb-i18n.js +101 -104
  76. package/src/pb-image-strip.js +84 -78
  77. package/src/pb-lang.js +83 -70
  78. package/src/pb-leaflet-map.js +488 -485
  79. package/src/pb-link.js +126 -124
  80. package/src/pb-load.js +431 -426
  81. package/src/pb-login.js +275 -254
  82. package/src/pb-manage-odds.js +364 -318
  83. package/src/pb-map-icon.js +89 -89
  84. package/src/pb-map-layer.js +85 -85
  85. package/src/pb-markdown.js +90 -99
  86. package/src/pb-media-query.js +74 -72
  87. package/src/pb-mei.js +306 -295
  88. package/src/pb-message.js +143 -130
  89. package/src/pb-mixin.js +269 -264
  90. package/src/pb-navigation.js +80 -82
  91. package/src/pb-observable.js +38 -38
  92. package/src/pb-odd-editor.js +1056 -958
  93. package/src/pb-odd-elementspec-editor.js +348 -297
  94. package/src/pb-odd-model-editor.js +1058 -898
  95. package/src/pb-odd-parameter-editor.js +200 -178
  96. package/src/pb-odd-rendition-editor.js +136 -124
  97. package/src/pb-page.js +432 -422
  98. package/src/pb-paginate.js +202 -190
  99. package/src/pb-panel.js +191 -179
  100. package/src/pb-popover-themes.js +7 -5
  101. package/src/pb-popover.js +296 -287
  102. package/src/pb-print-preview.js +127 -127
  103. package/src/pb-progress.js +49 -49
  104. package/src/pb-repeat.js +105 -104
  105. package/src/pb-restricted.js +84 -77
  106. package/src/pb-search.js +238 -221
  107. package/src/pb-select-feature.js +127 -120
  108. package/src/pb-select-odd.js +132 -124
  109. package/src/pb-select-template.js +89 -78
  110. package/src/pb-select.js +251 -227
  111. package/src/pb-split-list.js +179 -174
  112. package/src/pb-svg.js +80 -79
  113. package/src/pb-table-column.js +54 -54
  114. package/src/pb-table-grid.js +221 -203
  115. package/src/pb-tabs.js +61 -63
  116. package/src/pb-tify.js +154 -154
  117. package/src/pb-timeline.js +271 -229
  118. package/src/pb-toggle-feature.js +198 -185
  119. package/src/pb-upload.js +184 -174
  120. package/src/pb-version.js +30 -30
  121. package/src/pb-view-annotate.js +132 -98
  122. package/src/pb-view.js +1282 -1263
  123. package/src/pb-zoom.js +40 -40
  124. package/src/polymer-hack.js +1 -1
  125. package/src/search-result-service.js +256 -223
  126. package/src/seed-element.js +13 -20
  127. package/src/settings.js +4 -4
  128. package/src/theming.js +91 -91
  129. package/src/urls.js +289 -289
  130. package/src/utils.js +53 -51
@@ -1,7 +1,6 @@
1
1
  import { LitElement, html, css } from 'lit-element';
2
2
  import { pbMixin, waitOnce } from './pb-mixin.js';
3
3
 
4
-
5
4
  /**
6
5
  * Open eXide to edit a given source document.
7
6
  *
@@ -9,109 +8,113 @@ import { pbMixin, waitOnce } from './pb-mixin.js';
9
8
  * @slot - unnamed slot for the link text when eXide tab is already opened
10
9
  */
11
10
  export class PbEditXml extends 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
- }
11
+ static get properties() {
12
+ return {
13
+ ...super.properties,
14
+ /**
15
+ * expects a context-absolute path to the document to edit e.g. '/db/apps/tei-publisher/mytext.xml'
16
+ */
17
+ path: {
18
+ type: String,
19
+ },
20
+ /**
21
+ * optional id reference to a pb-document
22
+ */
23
+ src: {
24
+ type: String,
25
+ },
26
+ /**
27
+ * HTML title to be used
28
+ */
29
+ title: {
30
+ type: String,
31
+ },
32
+ _href: {
33
+ type: String,
34
+ },
35
+ };
36
+ }
38
37
 
39
- constructor() {
40
- super();
41
- this.title = '';
42
- }
38
+ constructor() {
39
+ super();
40
+ this.title = '';
41
+ }
43
42
 
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/';
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>`;
43
+ connectedCallback() {
44
+ super.connectedCallback();
45
+ waitOnce('pb-page-ready', options => {
46
+ if (options.endpoint === '.') {
47
+ this._href = '/exist/apps/eXide/';
48
+ } else {
49
+ const host = /^(.*:\/+[^/]+)\/.*$/.exec(options.endpoint);
50
+ if (host) {
51
+ this._href = `${host[1]}/exist/apps/eXide/`;
52
+ } else {
53
+ this._href = '/exist/apps/eXide/';
65
54
  }
66
- return html`<a href="${this._href}/index.html?open=${this.path}" title="${this.title}"><slot></slot></a>`;
55
+ }
56
+ });
57
+ }
58
+
59
+ render() {
60
+ // if the target is within the same origin as the current page, we can communicate with an
61
+ // already opened eXide, if not, only option is to open a new window.
62
+ if (new URL(this._href, window.location.href).origin === this.getUrl().origin) {
63
+ return html`<a href="${this._href}" target="eXide" title="${this.title}" @click="${this.open}"
64
+ ><slot></slot
65
+ ></a>`;
67
66
  }
67
+ return html`<a href="${this._href}/index.html?open=${this.path}" title="${this.title}"
68
+ ><slot></slot
69
+ ></a>`;
70
+ }
68
71
 
69
- static get styles() {
70
- return css`
71
- :host {
72
- display: inline;
73
- }
72
+ static get styles() {
73
+ return css`
74
+ :host {
75
+ display: inline;
76
+ }
74
77
 
75
- a {
76
- color: inherit;
77
- text-decoration: none;
78
- }
79
- `;
80
- }
78
+ a {
79
+ color: inherit;
80
+ text-decoration: none;
81
+ }
82
+ `;
83
+ }
81
84
 
82
- setPath(path) {
83
- this.path = path;
84
- }
85
+ setPath(path) {
86
+ this.path = path;
87
+ }
85
88
 
86
- open(ev) {
87
- ev.preventDefault();
88
- let href = this._href;
89
- let path = this.path;
90
- if (this.src) {
91
- const sourceComponent = document.getElementById(this.src);
92
- path = sourceComponent.getFullPath();
93
- href = sourceComponent.sourceView;
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
- // try to retrieve existing eXide window
97
- const exide = window.open("", "eXide");
98
- if (exide && !exide.closed) {
99
- // check if eXide is really available or it's an empty page
100
- const app = exide.eXide;
101
- if (app) {
102
- console.log("<pb-edit-xml> using existing eXide to open %s", path);
103
- // eXide is there
104
- exide.eXide.app.findDocument(path);
105
- exide.focus();
106
- } else {
107
- console.log("<pb-edit-xml> opening new eXide for %s", path);
108
- window.eXide_onload = function () {
109
- exide.eXide.app.findDocument(path);
110
- };
111
- // empty page
112
- exide.location = href;
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,130 @@
1
- import { defaultChannel } from "./pb-mixin.js";
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
- * Subscribe to an event received on particular channels.
10
- *
11
- * @param {string} name the name of the event to listen for
12
- * @param {string|string[]|null} channels name of a channel, array of channel names or null to target the default channel
13
- * @param {Function|undefined} callback function called when event is triggered.
14
- * Receives the event as first and the event handler as second parameter.
15
- */
16
- static subscribe(name, channels, callback, once=false) {
17
- const _channels = PbEvents._getChannels(channels)
18
- const handler = document.addEventListener(name, (/** @type {CustomEvent} */ ev) => {
19
- if (callback && ev.detail && ev.detail.key && _channels.includes(ev.detail.key)) {
20
- callback(ev, handler);
21
- }
22
- }, {
23
- once
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
- * Subscribe to an event received on a particular channel once. Returns a promise
29
- * which resolves when the event is caught.
30
- *
31
- * @param {string} name the name of the event to listen for
32
- * @param {string|string[]|null} channels name of a channel, array of channel names or null to target the default channel
33
- * @returns {Promise} resolves if event is caught, providing the event as parameter
34
- */
35
- static subscribeOnce(name, channels=null) {
36
- const _channels = PbEvents._getChannels(channels);
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
- * determine channels to subscribe to
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
- * Emit an event to a particular channel
68
- *
69
- * @param {string} type the name of the event to emit
70
- * @param {string|null} channel name of the channel or null to target the default channel
71
- * @param {any|null} detail value to pass in the event details
72
- */
73
- static emit(type, channel=null, detail=null) {
74
- const options = detail || {};
75
- options.key = channel || defaultChannel;
76
- const ev = new CustomEvent(type, {
77
- detail: options
78
- });
79
- document.dispatchEvent(ev);
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
- * Wait for one or more TEI Publisher web components to become ready (by waiting for their `pb-ready` event).
84
- *
85
- * @param {HTMLElement|HTMLElement[]} targets element or array of elements to check for ready state
86
- * @returns Promise which resolves when all components are ready
87
- */
88
- static ifReady(targets) {
89
- if (!Array.isArray(targets)) {
90
- targets = [targets];
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
- // const targets = Array.from(document.querySelectorAll(selector));
93
- return new Promise((resolve) => {
94
- const targetCount = targets.length;
95
- if (targetCount === 0) {
96
- // selector did not return any targets
97
- resolve();
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
- window.pbEvents = PbEvents;
123
- }
129
+ window.pbEvents = PbEvents;
130
+ }