@teipublisher/pb-components 2.25.5 → 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 (128) 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 +8 -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-leaflet-map.html +1 -1
  9. package/dist/demo/pb-repeat.html +1 -3
  10. package/dist/demo/pb-view3.html +1 -1
  11. package/dist/{paper-icon-button-0fb125c4.js → paper-icon-button-72125e67.js} +1 -1
  12. package/dist/pb-code-editor.js +25 -20
  13. package/dist/pb-component-docs.js +58 -54
  14. package/dist/pb-components-bundle.js +1827 -1520
  15. package/dist/pb-edit-app.js +167 -107
  16. package/dist/pb-elements.json +54 -54
  17. package/dist/{pb-i18n-0611135a.js → pb-i18n-4cc00bfe.js} +1 -1
  18. package/dist/pb-leaflet-map.js +23 -23
  19. package/dist/pb-mei.js +56 -41
  20. package/dist/{pb-mixin-b1caa22e.js → pb-mixin-886ece32.js} +1 -1
  21. package/dist/pb-odd-editor.js +925 -758
  22. package/dist/pb-tify.js +2 -2
  23. package/dist/{vaadin-element-mixin-859a0132.js → vaadin-element-mixin-ad07ba25.js} +88 -61
  24. package/gh-pages.js +5 -3
  25. package/package.json +2 -2
  26. package/pb-elements.json +54 -54
  27. package/src/assets/components.css +5 -5
  28. package/src/authority/airtable.js +20 -21
  29. package/src/authority/anton.js +129 -129
  30. package/src/authority/custom.js +23 -21
  31. package/src/authority/geonames.js +38 -32
  32. package/src/authority/gnd.js +47 -42
  33. package/src/authority/kbga.js +137 -134
  34. package/src/authority/metagrid.js +44 -46
  35. package/src/authority/reconciliation.js +66 -67
  36. package/src/authority/registry.js +4 -4
  37. package/src/docs/pb-component-docs.js +2 -2
  38. package/src/docs/pb-component-view.js +5 -5
  39. package/src/docs/pb-components-list.js +2 -2
  40. package/src/docs/pb-demo-snippet.js +2 -2
  41. package/src/dts-client.js +299 -297
  42. package/src/dts-select-endpoint.js +90 -82
  43. package/src/parse-date-service.js +184 -135
  44. package/src/pb-ajax.js +171 -167
  45. package/src/pb-authority-lookup.js +96 -81
  46. package/src/pb-autocomplete.js +292 -280
  47. package/src/pb-blacklab-highlight.js +264 -259
  48. package/src/pb-blacklab-results.js +236 -221
  49. package/src/pb-browse-docs.js +540 -475
  50. package/src/pb-browse.js +68 -65
  51. package/src/pb-clipboard.js +79 -76
  52. package/src/pb-code-editor.js +110 -102
  53. package/src/pb-code-highlight.js +209 -204
  54. package/src/pb-codepen.js +79 -72
  55. package/src/pb-collapse.js +149 -146
  56. package/src/pb-combo-box.js +190 -190
  57. package/src/pb-components-bundle.js +1 -1
  58. package/src/pb-custom-form.js +150 -149
  59. package/src/pb-document.js +89 -90
  60. package/src/pb-download.js +208 -195
  61. package/src/pb-drawer.js +145 -148
  62. package/src/pb-edit-app.js +301 -229
  63. package/src/pb-edit-xml.js +99 -96
  64. package/src/pb-events.js +114 -107
  65. package/src/pb-facs-link.js +104 -102
  66. package/src/pb-facsimile.js +411 -413
  67. package/src/pb-formula.js +151 -153
  68. package/src/pb-geolocation.js +129 -131
  69. package/src/pb-grid-action.js +53 -56
  70. package/src/pb-grid.js +231 -228
  71. package/src/pb-highlight.js +140 -140
  72. package/src/pb-hotkeys.js +40 -42
  73. package/src/pb-i18n.js +101 -104
  74. package/src/pb-image-strip.js +84 -78
  75. package/src/pb-lang.js +83 -70
  76. package/src/pb-leaflet-map.js +488 -485
  77. package/src/pb-link.js +126 -124
  78. package/src/pb-load.js +431 -426
  79. package/src/pb-login.js +275 -254
  80. package/src/pb-manage-odds.js +364 -318
  81. package/src/pb-map-icon.js +89 -89
  82. package/src/pb-map-layer.js +85 -85
  83. package/src/pb-markdown.js +90 -99
  84. package/src/pb-media-query.js +74 -72
  85. package/src/pb-mei.js +306 -295
  86. package/src/pb-message.js +143 -130
  87. package/src/pb-mixin.js +269 -264
  88. package/src/pb-navigation.js +80 -82
  89. package/src/pb-observable.js +38 -38
  90. package/src/pb-odd-editor.js +1056 -958
  91. package/src/pb-odd-elementspec-editor.js +348 -297
  92. package/src/pb-odd-model-editor.js +1058 -898
  93. package/src/pb-odd-parameter-editor.js +200 -178
  94. package/src/pb-odd-rendition-editor.js +136 -124
  95. package/src/pb-page.js +432 -422
  96. package/src/pb-paginate.js +202 -190
  97. package/src/pb-panel.js +191 -179
  98. package/src/pb-popover-themes.js +7 -5
  99. package/src/pb-popover.js +296 -287
  100. package/src/pb-print-preview.js +127 -127
  101. package/src/pb-progress.js +49 -49
  102. package/src/pb-repeat.js +105 -104
  103. package/src/pb-restricted.js +84 -77
  104. package/src/pb-search.js +238 -221
  105. package/src/pb-select-feature.js +127 -120
  106. package/src/pb-select-odd.js +132 -124
  107. package/src/pb-select-template.js +89 -78
  108. package/src/pb-select.js +251 -227
  109. package/src/pb-split-list.js +179 -174
  110. package/src/pb-svg.js +80 -79
  111. package/src/pb-table-column.js +54 -54
  112. package/src/pb-table-grid.js +221 -203
  113. package/src/pb-tabs.js +61 -63
  114. package/src/pb-tify.js +154 -154
  115. package/src/pb-timeline.js +271 -229
  116. package/src/pb-toggle-feature.js +198 -185
  117. package/src/pb-upload.js +184 -174
  118. package/src/pb-version.js +30 -30
  119. package/src/pb-view-annotate.js +132 -98
  120. package/src/pb-view.js +1282 -1263
  121. package/src/pb-zoom.js +40 -40
  122. package/src/polymer-hack.js +1 -1
  123. package/src/search-result-service.js +256 -223
  124. package/src/seed-element.js +13 -20
  125. package/src/settings.js +4 -4
  126. package/src/theming.js +91 -91
  127. package/src/urls.js +289 -289
  128. 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);