@teipublisher/pb-components 2.26.0-next-3.12 → 2.26.0-next-3.13
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/main.yml +3 -3
- package/.github/workflows/node.js.yml +3 -3
- package/.github/workflows/release.js.yml +3 -3
- package/CHANGELOG.md +30 -0
- package/Dockerfile +78 -70
- package/css/components.css +5 -5
- package/dist/demo/pb-drawer2.html +1 -1
- package/dist/demo/pb-leaflet-map.html +1 -1
- package/dist/demo/pb-progress.html +2 -2
- package/dist/demo/pb-repeat.html +1 -3
- package/dist/demo/pb-view3.html +1 -1
- package/dist/{paper-icon-button-0fb125c4.js → paper-icon-button-72125e67.js} +1 -1
- package/dist/pb-code-editor.js +25 -20
- package/dist/pb-component-docs.js +58 -54
- package/dist/pb-components-bundle.js +1937 -1782
- package/dist/pb-edit-app.js +167 -107
- package/dist/pb-elements.json +45 -45
- package/dist/{pb-i18n-0611135a.js → pb-i18n-4cc00bfe.js} +1 -1
- package/dist/pb-leaflet-map.js +23 -23
- package/dist/pb-mei.js +56 -41
- package/dist/{pb-mixin-b1caa22e.js → pb-mixin-886ece32.js} +1 -1
- package/dist/pb-odd-editor.js +923 -756
- package/dist/pb-tify.js +2 -2
- package/dist/{vaadin-element-mixin-49ab4037.js → vaadin-element-mixin-84fb7d82.js} +178 -163
- package/gh-pages.js +5 -3
- package/i18n/common/pl.json +2 -2
- package/lib/openseadragon.min.js +1 -1
- package/package.json +2 -2
- package/pb-elements.json +45 -45
- package/src/assets/components.css +5 -5
- package/src/authority/airtable.js +20 -21
- package/src/authority/anton.js +129 -129
- package/src/authority/custom.js +23 -21
- package/src/authority/geonames.js +38 -32
- package/src/authority/gnd.js +47 -42
- package/src/authority/kbga.js +137 -134
- package/src/authority/metagrid.js +44 -46
- package/src/authority/reconciliation.js +66 -67
- package/src/authority/registry.js +4 -4
- package/src/docs/pb-component-docs.js +2 -2
- package/src/docs/pb-component-view.js +5 -5
- package/src/docs/pb-components-list.js +2 -2
- package/src/docs/pb-demo-snippet.js +2 -2
- package/src/dts-client.js +299 -297
- package/src/dts-select-endpoint.js +90 -82
- package/src/parse-date-service.js +184 -135
- package/src/pb-ajax.js +150 -146
- package/src/pb-authority-lookup.js +183 -146
- package/src/pb-autocomplete.js +292 -280
- package/src/pb-blacklab-highlight.js +264 -259
- package/src/pb-blacklab-results.js +236 -221
- package/src/pb-browse-docs.js +540 -475
- package/src/pb-browse.js +68 -65
- package/src/pb-clipboard.js +79 -76
- package/src/pb-code-editor.js +110 -102
- package/src/pb-code-highlight.js +209 -204
- package/src/pb-codepen.js +79 -72
- package/src/pb-collapse.js +212 -207
- package/src/pb-combo-box.js +190 -190
- package/src/pb-components-bundle.js +1 -1
- package/src/pb-custom-form.js +151 -149
- package/src/pb-dialog.js +94 -85
- package/src/pb-document.js +89 -90
- package/src/pb-download.js +210 -198
- package/src/pb-drawer.js +145 -148
- package/src/pb-edit-app.js +301 -229
- package/src/pb-edit-xml.js +98 -96
- package/src/pb-events.js +114 -107
- package/src/pb-facs-link.js +104 -102
- package/src/pb-facsimile.js +411 -413
- package/src/pb-formula.js +151 -153
- package/src/pb-geolocation.js +129 -131
- package/src/pb-grid-action.js +53 -56
- package/src/pb-grid.js +231 -228
- package/src/pb-highlight.js +140 -140
- package/src/pb-hotkeys.js +40 -42
- package/src/pb-i18n.js +101 -104
- package/src/pb-image-strip.js +84 -78
- package/src/pb-lang.js +132 -128
- package/src/pb-leaflet-map.js +488 -485
- package/src/pb-link.js +126 -124
- package/src/pb-load.js +431 -426
- package/src/pb-login.js +291 -248
- package/src/pb-manage-odds.js +364 -318
- package/src/pb-map-icon.js +89 -89
- package/src/pb-map-layer.js +85 -85
- package/src/pb-markdown.js +90 -99
- package/src/pb-media-query.js +74 -72
- package/src/pb-mei.js +306 -295
- package/src/pb-message.js +144 -144
- package/src/pb-mixin.js +269 -264
- package/src/pb-navigation.js +80 -82
- package/src/pb-observable.js +38 -38
- package/src/pb-odd-editor.js +1053 -955
- package/src/pb-odd-elementspec-editor.js +348 -297
- package/src/pb-odd-model-editor.js +1061 -901
- package/src/pb-odd-parameter-editor.js +200 -178
- package/src/pb-odd-rendition-editor.js +136 -124
- package/src/pb-page.js +431 -421
- package/src/pb-paginate.js +202 -190
- package/src/pb-panel.js +191 -179
- package/src/pb-popover-themes.js +7 -5
- package/src/pb-popover.js +296 -287
- package/src/pb-print-preview.js +127 -127
- package/src/pb-progress.js +51 -51
- package/src/pb-repeat.js +105 -104
- package/src/pb-restricted.js +84 -77
- package/src/pb-search.js +252 -241
- package/src/pb-select-feature.js +127 -120
- package/src/pb-select-odd.js +132 -124
- package/src/pb-select-template.js +89 -78
- package/src/pb-select.js +251 -227
- package/src/pb-split-list.js +179 -174
- package/src/pb-svg.js +80 -79
- package/src/pb-table-column.js +54 -54
- package/src/pb-table-grid.js +221 -203
- package/src/pb-tabs.js +61 -63
- package/src/pb-tify.js +154 -154
- package/src/pb-timeline.js +271 -229
- package/src/pb-toggle-feature.js +182 -175
- package/src/pb-upload.js +184 -174
- package/src/pb-version.js +30 -30
- package/src/pb-view-annotate.js +132 -98
- package/src/pb-view.js +1289 -1270
- package/src/pb-zoom.js +75 -59
- package/src/polymer-hack.js +1 -1
- package/src/search-result-service.js +256 -223
- package/src/seed-element.js +13 -20
- package/src/settings.js +4 -4
- package/src/theming.js +96 -96
- package/src/urls.js +289 -289
- package/src/utils.js +53 -51
package/src/pb-combo-box.js
CHANGED
|
@@ -1,213 +1,213 @@
|
|
|
1
1
|
import { LitElement } from 'lit-element';
|
|
2
|
-
import TomSelect from
|
|
2
|
+
import TomSelect from 'tom-select';
|
|
3
3
|
import { pbMixin, waitOnce } from './pb-mixin.js';
|
|
4
4
|
import { resolveURL } from './utils.js';
|
|
5
|
-
import { get as i18n } from
|
|
5
|
+
import { get as i18n } from './pb-i18n.js';
|
|
6
6
|
|
|
7
7
|
function importTheme(theme) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
if (document.getElementById('__pb-multi-select-css')) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const themes = resolveURL('../css/tom-select');
|
|
12
|
+
const link = document.createElement('link');
|
|
13
|
+
link.id = '__pb-multi-select-css';
|
|
14
|
+
link.href = `${themes}/tom-select.${theme}.min.css`;
|
|
15
|
+
link.rel = 'stylesheet';
|
|
16
|
+
document.head.appendChild(link);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
const renderDefault = (data)
|
|
20
|
-
data ? `<div>${i18n(data.text)}</div>` : '';
|
|
19
|
+
const renderDefault = data => (data ? `<div>${i18n(data.text)}</div>` : '');
|
|
21
20
|
|
|
22
21
|
/**
|
|
23
22
|
* Provides a combo box, i.e. a combination of an input with a dropdown.
|
|
24
23
|
* Items to select from may be obtained from a remote data source.
|
|
25
|
-
*
|
|
26
|
-
* The form control to be used (either a select or input) should be passed
|
|
24
|
+
*
|
|
25
|
+
* The form control to be used (either a select or input) should be passed
|
|
27
26
|
* in the content of the element. If no control is provided, a simple `<input>`
|
|
28
27
|
* will be created.
|
|
29
|
-
*
|
|
28
|
+
*
|
|
30
29
|
*/
|
|
31
30
|
export class PbComboBox extends pbMixin(LitElement) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
31
|
+
static get properties() {
|
|
32
|
+
return {
|
|
33
|
+
...super.properties,
|
|
34
|
+
/**
|
|
35
|
+
* The placeholder text to display in the control. May contain text or an i18n key to be
|
|
36
|
+
* translated automatically.
|
|
37
|
+
*/
|
|
38
|
+
placeholder: {
|
|
39
|
+
type: String,
|
|
40
|
+
},
|
|
41
|
+
/**
|
|
42
|
+
* A remote data source to use. The component will pass the text entered by the user
|
|
43
|
+
* in parameter `query`. It expects a JSON array of objects with each object describing
|
|
44
|
+
* one item:
|
|
45
|
+
*
|
|
46
|
+
* ```json
|
|
47
|
+
* {
|
|
48
|
+
* "text": "Text to show as label",
|
|
49
|
+
* "value": "value-to-use"
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
source: {
|
|
54
|
+
type: String,
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* Automatically close the dropdown once the user made a selection
|
|
58
|
+
*/
|
|
59
|
+
closeAfterSelect: {
|
|
60
|
+
type: Boolean,
|
|
61
|
+
attribute: 'close-after-select',
|
|
62
|
+
},
|
|
63
|
+
/**
|
|
64
|
+
* Preload all items from the remote data source at startup
|
|
65
|
+
* Must be of type string because tom-select supports setting
|
|
66
|
+
* that property to "focus" (load data on focus)
|
|
67
|
+
*/
|
|
68
|
+
preload: {
|
|
69
|
+
type: String,
|
|
70
|
+
},
|
|
71
|
+
/**
|
|
72
|
+
* Name of the event to be emitted when the user leaves the form control
|
|
73
|
+
*/
|
|
74
|
+
onBlur: {
|
|
75
|
+
type: String,
|
|
76
|
+
attribute: 'on-blur',
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* Name of the event to be emitted when the value of the form control has changed
|
|
80
|
+
*/
|
|
81
|
+
onChange: {
|
|
82
|
+
type: String,
|
|
83
|
+
attribute: 'on-change',
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
get value() {
|
|
89
|
+
return this._select ? this._select.getValue() : null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
set value(value) {
|
|
93
|
+
if (!this._select) {
|
|
94
|
+
return;
|
|
87
95
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
+
this._select.clear(true);
|
|
97
|
+
this._select.sync();
|
|
98
|
+
|
|
99
|
+
this._select.setValue(value, false);
|
|
100
|
+
this._select.sync();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Set a javascript function to be called whenever an item
|
|
105
|
+
* needs to be rendered. The function will be passed the data
|
|
106
|
+
* object of the current item as argument.
|
|
107
|
+
*
|
|
108
|
+
* @param {Function} callbackFunction
|
|
109
|
+
*/
|
|
110
|
+
set renderItem(callbackFunction) {
|
|
111
|
+
this.renderFunction = callbackFunction;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
constructor() {
|
|
115
|
+
super();
|
|
116
|
+
this.theme = 'default';
|
|
117
|
+
this.source = null;
|
|
118
|
+
this.closeAfterSelect = false;
|
|
119
|
+
this.preload = false;
|
|
120
|
+
this.renderFunction = renderDefault;
|
|
121
|
+
this.onBlur = 'pb-combo-box-blur';
|
|
122
|
+
this.onChange = 'pb-combo-box-change';
|
|
123
|
+
this.placeholder = '';
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
connectedCallback() {
|
|
127
|
+
super.connectedCallback();
|
|
128
|
+
this.subscribeTo('pb-i18n-update', () => {
|
|
129
|
+
if (this._select) {
|
|
130
|
+
this._select.settings.placeholder = i18n(this.placeholder);
|
|
131
|
+
this._select.inputState();
|
|
132
|
+
|
|
133
|
+
if (this.source) {
|
|
134
|
+
this._select.refreshOptions(false);
|
|
135
|
+
} else {
|
|
136
|
+
this._select.clearOptions();
|
|
137
|
+
this._select.sync();
|
|
96
138
|
}
|
|
97
|
-
|
|
98
|
-
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
99
142
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Set a javascript function to be called whenever an item
|
|
106
|
-
* needs to be rendered. The function will be passed the data
|
|
107
|
-
* object of the current item as argument.
|
|
108
|
-
*
|
|
109
|
-
* @param {Function} callbackFunction
|
|
110
|
-
*/
|
|
111
|
-
set renderItem(callbackFunction) {
|
|
112
|
-
this.renderFunction = callbackFunction;
|
|
113
|
-
}
|
|
143
|
+
firstUpdated() {
|
|
144
|
+
importTheme(this.theme);
|
|
114
145
|
|
|
115
|
-
|
|
116
|
-
super();
|
|
117
|
-
this.theme = 'default';
|
|
118
|
-
this.source = null;
|
|
119
|
-
this.closeAfterSelect = false;
|
|
120
|
-
this.preload = false;
|
|
121
|
-
this.renderFunction = renderDefault;
|
|
122
|
-
this.onBlur = 'pb-combo-box-blur';
|
|
123
|
-
this.onChange = 'pb-combo-box-change';
|
|
124
|
-
this.placeholder = '';
|
|
125
|
-
}
|
|
146
|
+
let input = this.querySelector('select,input');
|
|
126
147
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
this._select.settings.placeholder = i18n(this.placeholder);
|
|
132
|
-
this._select.inputState();
|
|
133
|
-
|
|
134
|
-
if (this.source) {
|
|
135
|
-
this._select.refreshOptions(false);
|
|
136
|
-
} else {
|
|
137
|
-
this._select.clearOptions();
|
|
138
|
-
this._select.sync();
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
});
|
|
148
|
+
if (!input) {
|
|
149
|
+
// create input if none was passed
|
|
150
|
+
input = document.createElement('input');
|
|
151
|
+
this.appendChild(input);
|
|
142
152
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
+
input.autocomplete = false;
|
|
154
|
+
|
|
155
|
+
waitOnce('pb-page-ready', () => {
|
|
156
|
+
const options = {};
|
|
157
|
+
if (this.source) {
|
|
158
|
+
let controller = new AbortController();
|
|
159
|
+
const url = this.toAbsoluteURL(this.source);
|
|
160
|
+
options.labelField = 'text';
|
|
161
|
+
options.valueField = 'value';
|
|
162
|
+
options.searchField = [];
|
|
163
|
+
options.preload = this.preload;
|
|
164
|
+
// Make sure options are loaded even if the user clears the search field
|
|
165
|
+
if (this.preload) {
|
|
166
|
+
options.shouldLoad = () => true;
|
|
153
167
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
options.placeholder = i18n(this.placeholder);
|
|
200
|
-
options.closeAfterSelect = this.closeAfterSelect;
|
|
201
|
-
options.onBlur = () => this.emitTo(this.onBlur, { value: this.value });
|
|
202
|
-
options.onChange = () => this.emitTo(this.onChange, { value: this.value });
|
|
203
|
-
// options.plugins = ['change_listener'];
|
|
204
|
-
|
|
205
|
-
this._select = new TomSelect(input, options);
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
createRenderRoot() {
|
|
210
|
-
return this;
|
|
211
|
-
}
|
|
168
|
+
options.load = (query, callback) => {
|
|
169
|
+
if (this._select) {
|
|
170
|
+
// The default behaviour of tom-select is to keep existing items when loading
|
|
171
|
+
// again from the source. We want to show only items the server provides, so
|
|
172
|
+
// we need to clear "stale" items before fetching.
|
|
173
|
+
this._select.clearOptions();
|
|
174
|
+
}
|
|
175
|
+
// Abort previous request (if any)
|
|
176
|
+
if (controller) {
|
|
177
|
+
controller.abort();
|
|
178
|
+
}
|
|
179
|
+
controller = new AbortController();
|
|
180
|
+
fetch(`${url}?query=${encodeURIComponent(query)}`, {
|
|
181
|
+
method: 'GET',
|
|
182
|
+
mode: 'cors',
|
|
183
|
+
credentials: 'same-origin',
|
|
184
|
+
signal: controller.signal,
|
|
185
|
+
})
|
|
186
|
+
.then(response => response.json())
|
|
187
|
+
.then(json => {
|
|
188
|
+
callback(json);
|
|
189
|
+
})
|
|
190
|
+
.catch(() => {
|
|
191
|
+
callback();
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
options.render = {
|
|
195
|
+
option: this.renderFunction,
|
|
196
|
+
item: this.renderFunction,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
options.placeholder = i18n(this.placeholder);
|
|
200
|
+
options.closeAfterSelect = this.closeAfterSelect;
|
|
201
|
+
options.onBlur = () => this.emitTo(this.onBlur, { value: this.value });
|
|
202
|
+
options.onChange = () => this.emitTo(this.onChange, { value: this.value });
|
|
203
|
+
// options.plugins = ['change_listener'];
|
|
204
|
+
|
|
205
|
+
this._select = new TomSelect(input, options);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
createRenderRoot() {
|
|
210
|
+
return this;
|
|
211
|
+
}
|
|
212
212
|
}
|
|
213
|
-
customElements.define('pb-combo-box', PbComboBox);
|
|
213
|
+
customElements.define('pb-combo-box', PbComboBox);
|