@teipublisher/pb-components 2.25.5 → 2.25.7

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 +3 -3
  4. package/CHANGELOG.md +15 -0
  5. package/Dockerfile +78 -70
  6. package/css/components.css +5 -5
  7. package/dist/demo/pb-drawer2.html +1 -1
  8. package/dist/demo/pb-facsimile.html +2 -2
  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/lib/openseadragon.min.js +6 -6
  27. package/package.json +3 -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 +444 -410
  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
@@ -19,159 +19,160 @@ import { PbLoad } from './pb-load.js';
19
19
  * @fires pb-submit - Fired when the form is submitted
20
20
  */
21
21
  export class PbCustomForm extends PbLoad {
22
-
23
- firstUpdated() {
24
- this.shadowRoot.getElementById('ironform').addEventListener('iron-form-presubmit', (ev) => {
25
- ev.preventDefault();
26
- this._submit();
27
- });
28
- this.addEventListener('click', (e) => {
29
- if (e.target.slot === 'searchButtonTop'){
30
- this.submit();
31
- }
32
- if (e.target.slot === 'searchButtonBottom'){
33
- this.submit();
34
- }
35
- if (e.target.slot === 'resetButton'){
36
- this._reset();
37
- }
38
- });
39
-
40
- this._submissionHandlers();
22
+ firstUpdated() {
23
+ this.shadowRoot.getElementById('ironform').addEventListener('iron-form-presubmit', ev => {
24
+ ev.preventDefault();
25
+ this._submit();
26
+ });
27
+ this.addEventListener('click', e => {
28
+ if (e.target.slot === 'searchButtonTop') {
29
+ this.submit();
30
+ }
31
+ if (e.target.slot === 'searchButtonBottom') {
32
+ this.submit();
33
+ }
34
+ if (e.target.slot === 'resetButton') {
35
+ this._reset();
36
+ }
37
+ });
38
+
39
+ this._submissionHandlers();
40
+ }
41
+
42
+ render() {
43
+ return html`
44
+ <iron-form id="ironform">
45
+ <form action="" accept="text/html" method="GET">
46
+ <slot name="searchButtonTop"></slot>
47
+ <slot></slot>
48
+ <slot name="searchButtonBottom"></slot>
49
+ <slot name="resetButton"></slot>
50
+ </form>
51
+ </iron-form>
52
+
53
+ <iron-ajax
54
+ id="loadContent"
55
+ verbose
56
+ handle-as="text"
57
+ method="get"
58
+ with-credentials
59
+ @response="${this._handleContent}"
60
+ @error="${this._handleError}"
61
+ ></iron-ajax>
62
+ <paper-dialog id="errorDialog">
63
+ <h2>Error</h2>
64
+ <paper-dialog-scrollable></paper-dialog-scrollable>
65
+ <div class="buttons">
66
+ <paper-button dialog-confirm="dialog-confirm" autofocus="autofocus"> Close </paper-button>
67
+ </div>
68
+ </paper-dialog>
69
+ `;
70
+ }
71
+
72
+ static get styles() {
73
+ return css`
74
+ :host {
75
+ display: block;
76
+ }
77
+ `;
78
+ }
79
+
80
+ submit() {
81
+ this.shadowRoot.getElementById('ironform').submit();
82
+ }
83
+
84
+ _submit() {
85
+ const json = this.serializeForm();
86
+ this.emitTo('pb-search-resubmit', { params: json });
87
+ this.emitTo('pb-submit', { params: json });
88
+ }
89
+
90
+ _reset() {
91
+ this.shadowRoot.getElementById('ironform').reset();
92
+ }
93
+
94
+ /**
95
+ * serialize custom form to object with name value pairs
96
+ * empty, unselected and undifined inputs will be returned
97
+ * as null while disabled elements will still be omitted
98
+ * this allows url parameters to be reset in the URL
99
+ * as IronForm.serializeform will omit names without a value
100
+ * @returns {Object} name value pairs
101
+ */
102
+ serializeForm() {
103
+ const elements = this.shadowRoot.getElementById('ironform')._getSubmittableElements();
104
+ const initial = {};
105
+ for (const element of elements) {
106
+ initial[element.name] = null;
41
107
  }
108
+ return Object.assign(initial, this.shadowRoot.getElementById('ironform').serializeForm());
109
+ }
42
110
 
43
- render() {
44
- return html`
45
- <iron-form id="ironform">
46
- <form action="" accept="text/html" method="GET">
47
- <slot name="searchButtonTop"></slot>
48
- <slot></slot>
49
- <slot name="searchButtonBottom"></slot>
50
- <slot name="resetButton"></slot>
51
- </form>
52
- </iron-form>
53
-
54
- <iron-ajax
55
- id="loadContent"
56
- verbose
57
- handle-as="text"
58
- method="get"
59
- with-credentials
60
- @response="${this._handleContent}"
61
- @error="${this._handleError}"></iron-ajax>
62
- <paper-dialog id="errorDialog">
63
- <h2>Error</h2>
64
- <paper-dialog-scrollable></paper-dialog-scrollable>
65
- <div class="buttons">
66
- <paper-button dialog-confirm="dialog-confirm" autofocus="autofocus">
67
- Close
68
- </paper-button>
69
- </div>
70
- </paper-dialog>
71
- `;
72
- }
111
+ _parseHeaders(xhr) {
112
+ // overwrite to avoid `pb-results-received` event being sent
113
+ }
73
114
 
74
- static get styles() {
75
- return css`
76
- :host {
77
- display: block;
78
- }
79
- `;
80
- }
81
-
82
- submit() {
83
- this.shadowRoot.getElementById('ironform').submit();
84
- }
115
+ _onLoad(content) {
116
+ super._onLoad(content);
85
117
 
86
- _submit() {
87
- const json = this.serializeForm();
88
- this.emitTo('pb-search-resubmit', { params: json });
89
- this.emitTo('pb-submit', { params: json});
90
- }
91
-
92
- _reset(){
93
- this.shadowRoot.getElementById('ironform').reset();
94
- }
95
-
96
- /**
97
- * serialize custom form to object with name value pairs
98
- * empty, unselected and undifined inputs will be returned
99
- * as null while disabled elements will still be omitted
100
- * this allows url parameters to be reset in the URL
101
- * as IronForm.serializeform will omit names without a value
102
- * @returns {Object} name value pairs
103
- */
104
- serializeForm() {
105
- const elements = this.shadowRoot.getElementById('ironform')._getSubmittableElements()
106
- const initial = {}
107
- for (const element of elements) {
108
- initial[element.name] = null;
109
- }
110
- return Object.assign(
111
- initial,
112
- this.shadowRoot.getElementById('ironform').serializeForm()
113
- );
114
- }
118
+ this.dispatchEvent(new CustomEvent('pb-custom-form-loaded', { detail: content }));
119
+ }
115
120
 
116
- _parseHeaders(xhr) {
117
- // overwrite to avoid `pb-results-received` event being sent
121
+ _submissionHandlers() {
122
+ if (!this.autoSubmit) {
123
+ return;
118
124
  }
119
-
120
- _onLoad(content) {
121
- super._onLoad(content);
122
-
123
- this.dispatchEvent(new CustomEvent('pb-custom-form-loaded', { detail: content }));
124
- }
125
-
126
- _submissionHandlers() {
127
- if (!this.autoSubmit) {
128
- return;
129
- }
130
- this.querySelectorAll(this.autoSubmit).forEach((control) => {
131
- const name = control.nodeName.toLowerCase();
132
- let event = 'change';
133
- if (control instanceof HTMLButtonElement ||
134
- name === 'paper-icon-button' || name === 'paper-button' ||
135
- (name === 'input' && (control.type === 'button' || control.type === 'submit' || control.type === 'reset'))
136
- ) {
137
- event = 'click';
138
- } else if (name === 'paper-input' || (control instanceof HTMLInputElement && control.type === 'text')) {
139
- event = 'keyup';
140
- } else if (name === 'paper-dropdown-menu') {
141
- event = 'value-changed';
142
- }
143
- control.addEventListener(event, this._submit.bind(this));
144
- });
145
- }
146
-
147
- static get properties() {
148
- return {
149
- /**
150
- * Register event handlers on all descendant elements matching the given CSS selector and submit the form
151
- * automatically if any of those changes. For button-like controls,
152
- * a submit is triggered on click, for text input on keyUp, and for
153
- * all other form components on change.
154
- */
155
- autoSubmit: {
156
- type: String,
157
- attribute: 'auto-submit'
158
- },
159
- ...super.properties
160
- };
161
- }
162
-
163
- /**
164
- * Fired before the element updates its content
165
- *
166
- * @event pb-custom-form-loaded
167
- * @param {string} the loaded content
168
- */
169
-
170
- /**
171
- * Fired when form is submitted
172
- *
173
- * @event pb-search-resubmit
174
- * @param {object} params: serialized form parameters as json object
175
- */
125
+ this.querySelectorAll(this.autoSubmit).forEach(control => {
126
+ const name = control.nodeName.toLowerCase();
127
+ let event = 'change';
128
+ if (
129
+ control instanceof HTMLButtonElement ||
130
+ name === 'paper-icon-button' ||
131
+ name === 'paper-button' ||
132
+ (name === 'input' &&
133
+ (control.type === 'button' || control.type === 'submit' || control.type === 'reset'))
134
+ ) {
135
+ event = 'click';
136
+ } else if (
137
+ name === 'paper-input' ||
138
+ (control instanceof HTMLInputElement && control.type === 'text')
139
+ ) {
140
+ event = 'keyup';
141
+ } else if (name === 'paper-dropdown-menu') {
142
+ event = 'value-changed';
143
+ }
144
+ control.addEventListener(event, this._submit.bind(this));
145
+ });
146
+ }
147
+
148
+ static get properties() {
149
+ return {
150
+ /**
151
+ * Register event handlers on all descendant elements matching the given CSS selector and submit the form
152
+ * automatically if any of those changes. For button-like controls,
153
+ * a submit is triggered on click, for text input on keyUp, and for
154
+ * all other form components on change.
155
+ */
156
+ autoSubmit: {
157
+ type: String,
158
+ attribute: 'auto-submit',
159
+ },
160
+ ...super.properties,
161
+ };
162
+ }
163
+
164
+ /**
165
+ * Fired before the element updates its content
166
+ *
167
+ * @event pb-custom-form-loaded
168
+ * @param {string} the loaded content
169
+ */
170
+
171
+ /**
172
+ * Fired when form is submitted
173
+ *
174
+ * @event pb-search-resubmit
175
+ * @param {object} params: serialized form parameters as json object
176
+ */
176
177
  }
177
- customElements.define('pb-custom-form', PbCustomForm);
178
+ customElements.define('pb-custom-form', PbCustomForm);
@@ -1,6 +1,6 @@
1
1
  import { LitElement } from 'lit-element';
2
2
  import { pbMixin } from './pb-mixin.js';
3
- import { registry } from "./urls.js";
3
+ import { registry } from './urls.js';
4
4
 
5
5
  /**
6
6
  * Represents a Publisher document. It has no visual presentation but holds meta-data
@@ -11,108 +11,107 @@ import { registry } from "./urls.js";
11
11
  * @fires pb-document - Fires update event
12
12
  */
13
13
  class PbDocument extends pbMixin(LitElement) {
14
+ static get properties() {
15
+ return {
16
+ ...super.properties,
17
+ /**
18
+ * The path to the document to be loaded. Should be relative to `root`.
19
+ */
20
+ path: {
21
+ type: String,
22
+ reflect: true,
23
+ },
24
+ /**
25
+ * The root collection which will be used to resolve relative paths
26
+ * specified in `path`.
27
+ */
28
+ rootPath: {
29
+ type: String,
30
+ attribute: 'root-path',
31
+ },
32
+ /**
33
+ * The odd file which should be used to render this document by default. Might be
34
+ * overwritten in a `pb-view`. The odd should be specified by its name without path
35
+ * or the `.odd` suffix.
36
+ */
37
+ odd: {
38
+ type: String,
39
+ reflect: true,
40
+ },
41
+ /**
42
+ * The default view to be used for displaying this document. Can be either `page`, `div` or `simple`.
43
+ * Might be overwritten in a `pb-view`.
44
+ *
45
+ * Value | Displayed content
46
+ * ------|------------------
47
+ * `page` | content is displayed page by page as determined by tei:pb
48
+ * `div` | content is displayed by divisions
49
+ * `single` | do not paginate but display entire content at once
50
+ */
51
+ view: {
52
+ type: String,
53
+ reflect: true,
54
+ },
55
+ disableHistory: {
56
+ type: Boolean,
57
+ attribute: 'disable-history',
58
+ },
59
+ sourceView: {
60
+ type: String,
61
+ attribute: 'source-view',
62
+ },
63
+ };
64
+ }
14
65
 
15
- static get properties() {
16
- return {
17
- ...super.properties,
18
- /**
19
- * The path to the document to be loaded. Should be relative to `root`.
20
- */
21
- path: {
22
- type: String,
23
- reflect: true
24
- },
25
- /**
26
- * The root collection which will be used to resolve relative paths
27
- * specified in `path`.
28
- */
29
- rootPath: {
30
- type: String,
31
- attribute: 'root-path'
32
- },
33
- /**
34
- * The odd file which should be used to render this document by default. Might be
35
- * overwritten in a `pb-view`. The odd should be specified by its name without path
36
- * or the `.odd` suffix.
37
- */
38
- odd: {
39
- type: String,
40
- reflect: true
41
- },
42
- /**
43
- * The default view to be used for displaying this document. Can be either `page`, `div` or `simple`.
44
- * Might be overwritten in a `pb-view`.
45
- *
46
- * Value | Displayed content
47
- * ------|------------------
48
- * `page` | content is displayed page by page as determined by tei:pb
49
- * `div` | content is displayed by divisions
50
- * `single` | do not paginate but display entire content at once
51
- */
52
- view: {
53
- type: String,
54
- reflect: true
55
- },
56
- disableHistory: {
57
- type: Boolean,
58
- attribute: 'disable-history'
59
- },
60
- sourceView: {
61
- type: String,
62
- attribute: 'source-view'
63
- }
64
- };
65
- }
66
-
67
- constructor() {
68
- super();
69
- this.path = null;
70
- this.rootPath = '';
71
- this.disableHistory = false;
72
- }
66
+ constructor() {
67
+ super();
68
+ this.path = null;
69
+ this.rootPath = '';
70
+ this.disableHistory = false;
71
+ }
73
72
 
74
- connectedCallback() {
75
- super.connectedCallback();
73
+ connectedCallback() {
74
+ super.connectedCallback();
76
75
 
77
- if (!this.disableHistory) {
78
- // if path is unset, use path taken from the URL
79
- if (registry.state.path && !this.path) {
80
- this.path = registry.state.path;
81
- }
82
- this.view = registry.state.view || this.view;
83
- this.odd = registry.state.odd || this.odd;
84
- }
76
+ if (!this.disableHistory) {
77
+ // if path is unset, use path taken from the URL
78
+ if (registry.state.path && !this.path) {
79
+ this.path = registry.state.path;
80
+ }
81
+ this.view = registry.state.view || this.view;
82
+ this.odd = registry.state.odd || this.odd;
85
83
  }
84
+ }
86
85
 
87
- attributeChangedCallback(name, oldVal, newVal) {
88
- super.attributeChangedCallback(name, oldVal, newVal);
89
- if (oldVal) {
90
- console.log('<pb-document> Emit update event');
91
- this.emitTo('pb-document', this);
92
- }
86
+ attributeChangedCallback(name, oldVal, newVal) {
87
+ super.attributeChangedCallback(name, oldVal, newVal);
88
+ if (oldVal) {
89
+ console.log('<pb-document> Emit update event');
90
+ this.emitTo('pb-document', this);
93
91
  }
92
+ }
94
93
 
95
- /**
96
- * Returns the name of the document without path.
97
- *
98
- * @returns {string} Name of the document
99
- */
100
- getFileName() {
101
- return this.path.replace(/^.*?([^\/]+)$/, '$1');
102
- }
94
+ /**
95
+ * Returns the name of the document without path.
96
+ *
97
+ * @returns {string} Name of the document
98
+ */
99
+ getFileName() {
100
+ return this.path.replace(/^.*?([^\/]+)$/, '$1');
101
+ }
103
102
 
104
- getCollection() {
105
- return this.path.replace(/^(.*?)\/[^\/]+$/, '$1');
106
- }
103
+ getCollection() {
104
+ return this.path.replace(/^(.*?)\/[^\/]+$/, '$1');
105
+ }
107
106
 
108
- /**
107
+ /**
109
108
  * Returns the full path to the document.
110
109
 
111
110
  * @returns {string} Full path to the document
112
111
  */
113
- getFullPath() {
114
- return this.rootPath + '/' + this.path;
115
- }
112
+ getFullPath() {
113
+ return `${this.rootPath}/${this.path}`;
114
+ }
116
115
  }
117
116
 
118
117
  customElements.define('pb-document', PbDocument);