@teipublisher/pb-components 2.26.1-next.2 → 3.0.0
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 +4 -4
- package/.releaserc.json +2 -2
- package/CHANGELOG.md +267 -9
- package/Dockerfile +78 -70
- package/css/components.css +5 -5
- package/css/leaflet/images/layers.png +0 -0
- package/dist/demo/components.css +46 -1
- package/dist/demo/pb-browse-docs2.html +1 -1
- package/dist/demo/pb-dialog.html +3 -5
- package/dist/demo/pb-drawer2.html +1 -1
- package/dist/demo/pb-facsimile.html +2 -2
- package/dist/demo/pb-grid.html +19 -6
- package/dist/demo/pb-leaflet-map.html +1 -1
- package/dist/demo/pb-login.html +0 -2
- package/dist/demo/pb-message.html +1 -2
- package/dist/demo/pb-progress.html +2 -2
- package/dist/demo/pb-repeat.html +1 -3
- package/dist/demo/pb-search.html +7 -4
- package/dist/demo/pb-search3.html +1 -1
- package/dist/demo/pb-search4.html +2 -2
- package/dist/demo/pb-view3.html +1 -1
- package/dist/{iron-form-3b8dcaa7.js → iron-form-dfb3e3b1.js} +95 -95
- package/dist/paper-checkbox-645e1077.js +200 -0
- package/dist/{paper-icon-button-b1d31571.js → paper-icon-button-984162bd.js} +1 -1
- package/dist/{paper-checkbox-515a5284.js → paper-inky-focus-behavior-fa16796b.js} +58 -247
- package/dist/{paper-listbox-a3b7175c.js → paper-listbox-5f5d1cec.js} +152 -162
- package/dist/pb-code-editor.js +25 -20
- package/dist/pb-component-docs.js +68 -64
- package/dist/pb-components-bundle.js +1983 -2293
- package/dist/pb-edit-app.js +167 -107
- package/dist/pb-elements.json +176 -120
- 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 +1023 -782
- package/dist/pb-tify.js +2 -2
- package/dist/vaadin-element-mixin-beb74ffd.js +545 -0
- package/gh-pages.js +5 -3
- package/i18n/common/en.json +6 -0
- package/i18n/common/pl.json +2 -2
- package/lib/openseadragon.min.js +6 -6
- package/package.json +3 -3
- package/pb-elements.json +176 -120
- 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 +50 -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 +158 -171
- package/src/pb-authority-lookup.js +191 -156
- 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 +211 -151
- package/src/pb-combo-box.js +190 -190
- package/src/pb-components-bundle.js +1 -1
- package/src/pb-components.js +1 -0
- package/src/pb-custom-form.js +173 -153
- package/src/pb-dialog.js +98 -62
- package/src/pb-document.js +89 -90
- package/src/pb-download.js +212 -196
- package/src/pb-drawer.js +145 -148
- package/src/pb-edit-app.js +301 -229
- package/src/pb-edit-xml.js +100 -97
- package/src/pb-events.js +114 -107
- package/src/pb-facs-link.js +104 -102
- package/src/pb-facsimile.js +474 -410
- 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 +142 -57
- package/src/pb-leaflet-map.js +488 -485
- package/src/pb-link.js +126 -124
- package/src/pb-load.js +431 -429
- package/src/pb-login.js +299 -244
- package/src/pb-manage-odds.js +352 -336
- 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 +139 -97
- package/src/pb-mixin.js +269 -264
- package/src/pb-navigation.js +80 -95
- package/src/pb-observable.js +38 -38
- package/src/pb-odd-editor.js +1054 -958
- package/src/pb-odd-elementspec-editor.js +349 -298
- package/src/pb-odd-model-editor.js +1075 -909
- package/src/pb-odd-parameter-editor.js +200 -178
- package/src/pb-odd-rendition-editor.js +136 -124
- package/src/pb-page.js +431 -422
- package/src/pb-paginate.js +228 -179
- package/src/pb-panel.js +198 -182
- package/src/pb-popover-themes.js +15 -8
- 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 +256 -228
- 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 +382 -249
- package/src/pb-toggle-feature.js +195 -187
- package/src/pb-upload.js +184 -174
- package/src/pb-version.js +30 -30
- package/src/pb-view-annotate.js +135 -98
- package/src/pb-view.js +1282 -1270
- package/src/pb-zoom.js +127 -45
- 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 +98 -91
- package/src/urls.js +289 -289
- package/src/utils.js +53 -51
- package/css/pb-styles.css +0 -51
- package/dist/vaadin-element-mixin-6e4cee3a.js +0 -527
- package/src/assets/pb-styles.css +0 -51
- package/src/pb-light-dom.js +0 -40
package/src/pb-print-preview.js
CHANGED
|
@@ -10,134 +10,134 @@ import { resolveURL } from './utils.js';
|
|
|
10
10
|
* @appliesMixin pbMixin
|
|
11
11
|
*/
|
|
12
12
|
export class PbPrintPreview extends pbMixin(LitElement) {
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
firstUpdated()
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
print()
|
|
77
|
-
|
|
13
|
+
static get properties() {
|
|
14
|
+
return {
|
|
15
|
+
/** ID of the pb-document this element is connected to. The document path to
|
|
16
|
+
* load will be taken from the pb-document.
|
|
17
|
+
*/
|
|
18
|
+
src: {
|
|
19
|
+
type: String,
|
|
20
|
+
},
|
|
21
|
+
/**
|
|
22
|
+
* Additional CSS stylesheets to be loaded. Relative URLs will be resolved
|
|
23
|
+
* relative to the API endpoint.
|
|
24
|
+
*/
|
|
25
|
+
styles: {
|
|
26
|
+
type: String,
|
|
27
|
+
},
|
|
28
|
+
/**
|
|
29
|
+
* The generated API URL from which the HTML content will be loaded.
|
|
30
|
+
* Readonly. This excludes the paged.js styles and scripts, so you can
|
|
31
|
+
* use the URL with other tools.
|
|
32
|
+
*/
|
|
33
|
+
url: {
|
|
34
|
+
type: String,
|
|
35
|
+
reflect: true,
|
|
36
|
+
readOnly: true,
|
|
37
|
+
},
|
|
38
|
+
/**
|
|
39
|
+
* Set to disable the pagejs polyfill, i.e. show the HTML as delivered from the server.
|
|
40
|
+
*/
|
|
41
|
+
raw: {
|
|
42
|
+
type: Boolean,
|
|
43
|
+
},
|
|
44
|
+
...super.properties,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
constructor() {
|
|
49
|
+
super();
|
|
50
|
+
|
|
51
|
+
this.url = 'about:blank';
|
|
52
|
+
this.raw = false;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
firstUpdated() {
|
|
56
|
+
super.firstUpdated();
|
|
57
|
+
|
|
58
|
+
this._iframe = this.shadowRoot.querySelector('iframe');
|
|
59
|
+
this._iframe.addEventListener('load', () => {
|
|
60
|
+
if (this._iframe.src === 'about:blank') {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this._iframe.className = '';
|
|
64
|
+
this.emitTo('pb-end-update');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
waitOnce('pb-page-ready', () => {
|
|
68
|
+
this.refresh();
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Open the browser's print dialog.
|
|
74
|
+
*/
|
|
75
|
+
print() {
|
|
76
|
+
this._iframe.contentWindow.print();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Refresh the displayed content.
|
|
81
|
+
*/
|
|
82
|
+
refresh() {
|
|
83
|
+
this.emitTo('pb-start-update');
|
|
84
|
+
this._iframe.className = 'hidden';
|
|
85
|
+
this._iframe.src = 'about:blank';
|
|
86
|
+
|
|
87
|
+
const doc = this.getDocument();
|
|
88
|
+
const params = new URLSearchParams();
|
|
89
|
+
if (doc.odd) {
|
|
90
|
+
params.set('odd', `${doc.odd}.odd`);
|
|
78
91
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
params.set('odd', `${doc.odd}.odd`);
|
|
92
|
-
}
|
|
93
|
-
params.set('base', `${this.getEndpoint()}/${doc.getCollection()}/`);
|
|
94
|
-
this._getCustomStyles().forEach((href) => params.append('style', href));
|
|
95
|
-
const urlParams = params.toString();
|
|
96
|
-
this.url = `${this.getEndpoint()}/api/document/${encodeURIComponent(doc.path)}/print?${urlParams}`;
|
|
97
|
-
|
|
98
|
-
const iParams = new URLSearchParams(urlParams);
|
|
99
|
-
iParams.set('wc', 'true');
|
|
100
|
-
if (!this.raw) {
|
|
101
|
-
iParams.set('script', resolveURL('../lib/paged.polyfill.js'));
|
|
102
|
-
iParams.append('style', resolveURL('../css/pagedjs/interface.css'));
|
|
103
|
-
}
|
|
104
|
-
this._iframe.src = `${this.getEndpoint()}/api/document/${encodeURIComponent(doc.path)}/print?${iParams.toString()}`;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
render() {
|
|
108
|
-
return html`
|
|
109
|
-
<iframe title="Preview" src="about:blank"></iframe>
|
|
110
|
-
`;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
_getCustomStyles() {
|
|
114
|
-
let customStyles = [];
|
|
115
|
-
if (this.styles) {
|
|
116
|
-
customStyles = this.styles.split(/\s*,\s*/);
|
|
117
|
-
}
|
|
118
|
-
return customStyles;
|
|
92
|
+
params.set('base', `${this.getEndpoint()}/${doc.getCollection()}/`);
|
|
93
|
+
this._getCustomStyles().forEach(href => params.append('style', href));
|
|
94
|
+
const urlParams = params.toString();
|
|
95
|
+
this.url = `${this.getEndpoint()}/api/document/${encodeURIComponent(
|
|
96
|
+
doc.path,
|
|
97
|
+
)}/print?${urlParams}`;
|
|
98
|
+
|
|
99
|
+
const iParams = new URLSearchParams(urlParams);
|
|
100
|
+
iParams.set('wc', 'true');
|
|
101
|
+
if (!this.raw) {
|
|
102
|
+
iParams.set('script', resolveURL('../lib/paged.polyfill.js'));
|
|
103
|
+
iParams.append('style', resolveURL('../css/pagedjs/interface.css'));
|
|
119
104
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
.hidden {
|
|
136
|
-
opacity: 0;
|
|
137
|
-
transition: opacity 0.5s ease-out;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
`;
|
|
105
|
+
this._iframe.src = `${this.getEndpoint()}/api/document/${encodeURIComponent(
|
|
106
|
+
doc.path,
|
|
107
|
+
)}/print?${iParams.toString()}`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
render() {
|
|
111
|
+
return html` <iframe title="Preview" src="about:blank"></iframe> `;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
_getCustomStyles() {
|
|
115
|
+
let customStyles = [];
|
|
116
|
+
if (this.styles) {
|
|
117
|
+
customStyles = this.styles.split(/\s*,\s*/);
|
|
141
118
|
}
|
|
119
|
+
return customStyles;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
static get styles() {
|
|
123
|
+
return css`
|
|
124
|
+
:host {
|
|
125
|
+
display: block;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
iframe {
|
|
129
|
+
border: 0;
|
|
130
|
+
width: 100%;
|
|
131
|
+
height: 100%;
|
|
132
|
+
opacity: 1;
|
|
133
|
+
transition: opacity 0.5s ease-out 0.5s;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.hidden {
|
|
137
|
+
opacity: 0;
|
|
138
|
+
transition: opacity 0.5s ease-out;
|
|
139
|
+
}
|
|
140
|
+
`;
|
|
141
|
+
}
|
|
142
142
|
}
|
|
143
|
-
customElements.define('pb-print-preview', PbPrintPreview);
|
|
143
|
+
customElements.define('pb-print-preview', PbPrintPreview);
|
package/src/pb-progress.js
CHANGED
|
@@ -1,63 +1,63 @@
|
|
|
1
1
|
import { LitElement, html, css } from 'lit-element';
|
|
2
2
|
import { pbMixin } from './pb-mixin.js';
|
|
3
|
-
import '
|
|
3
|
+
import { themableMixin } from './theming.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* A progress bar which becomes active when signal `pb-start-update` is
|
|
7
7
|
* being sent and is deactivated on `pb-end-update`.
|
|
8
|
+
*
|
|
9
|
+
* Uses a native `<progress>` element.
|
|
8
10
|
*
|
|
9
11
|
* @fires pb-start-update - When received, activates the progress bar
|
|
10
12
|
* @fires pb-end-update - When received, disables the progress bar
|
|
11
13
|
|
|
12
14
|
*/
|
|
13
|
-
export class PbProgress extends pbMixin(LitElement) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
this._disabled = true;
|
|
61
|
-
}
|
|
15
|
+
export class PbProgress extends themableMixin(pbMixin(LitElement)) {
|
|
16
|
+
static get properties() {
|
|
17
|
+
return {
|
|
18
|
+
...super.properties,
|
|
19
|
+
_disabled: {
|
|
20
|
+
type: Boolean,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
constructor() {
|
|
26
|
+
super();
|
|
27
|
+
this._disabled = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
connectedCallback() {
|
|
31
|
+
super.connectedCallback();
|
|
32
|
+
|
|
33
|
+
this.subscribeTo('pb-start-update', this._startUpdate.bind(this));
|
|
34
|
+
this.subscribeTo('pb-end-update', this._endUpdate.bind(this));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
render() {
|
|
38
|
+
this.style.visibility = this._disabled ? 'hidden' : 'visible';
|
|
39
|
+
return html` <progress id="progress" indeterminate ?disabled="${this._disabled}"></progress> `;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static get styles() {
|
|
43
|
+
return css`
|
|
44
|
+
:host {
|
|
45
|
+
display: block;
|
|
46
|
+
visibility: hidden;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
progress {
|
|
50
|
+
width: 100%;
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
_startUpdate() {
|
|
56
|
+
this._disabled = false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
_endUpdate() {
|
|
60
|
+
this._disabled = true;
|
|
61
|
+
}
|
|
62
62
|
}
|
|
63
|
-
customElements.define('pb-progress', PbProgress);
|
|
63
|
+
customElements.define('pb-progress', PbProgress);
|
package/src/pb-repeat.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LitElement, html } from 'lit-element';
|
|
2
2
|
import { pbMixin } from './pb-mixin.js';
|
|
3
|
-
import { registry } from
|
|
3
|
+
import { registry } from './urls.js';
|
|
4
4
|
import '@polymer/iron-icons';
|
|
5
5
|
import '@polymer/paper-icon-button';
|
|
6
6
|
|
|
@@ -10,128 +10,129 @@ import '@polymer/paper-icon-button';
|
|
|
10
10
|
* the template will be copied. All elements with a `name` attribute within the
|
|
11
11
|
* copied template will be renamed to have an `[idx]` suffix denoting their position
|
|
12
12
|
* within the instance list.
|
|
13
|
-
*
|
|
13
|
+
*
|
|
14
14
|
* The element stamps the instances into light DOM, so a form wrapping around it will see
|
|
15
15
|
* the form controls. One can therefore use a normal form submit.
|
|
16
16
|
*
|
|
17
17
|
*/
|
|
18
18
|
export class PbRepeat extends pbMixin(LitElement) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
19
|
+
static get properties() {
|
|
20
|
+
return {
|
|
21
|
+
...super.properties,
|
|
22
|
+
/**
|
|
23
|
+
* The initial number of (empty) instances to be shown
|
|
24
|
+
* (1 by default).
|
|
25
|
+
*/
|
|
26
|
+
initial: {
|
|
27
|
+
type: Number,
|
|
28
|
+
},
|
|
29
|
+
_instances: {
|
|
30
|
+
type: Array,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
constructor() {
|
|
36
|
+
super();
|
|
37
|
+
this.initial = 1;
|
|
38
|
+
this._instances = [];
|
|
39
|
+
}
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
connectedCallback() {
|
|
42
|
+
super.connectedCallback();
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
this.template = this.querySelector('template');
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
46
|
+
const params = registry.state;
|
|
47
|
+
this._computeInitial(params);
|
|
48
|
+
if (this._instances.length === 0) {
|
|
49
|
+
for (let i = 0; i < this.initial; i++) {
|
|
50
|
+
this._add(params);
|
|
51
|
+
}
|
|
53
52
|
}
|
|
53
|
+
}
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
this.initial = parseInt(max, 10);
|
|
63
|
-
}
|
|
55
|
+
_computeInitial(params) {
|
|
56
|
+
const sortedParams = Object.keys(params)
|
|
57
|
+
.filter(key => /\[\d+\]$/.test(key))
|
|
58
|
+
.sort();
|
|
59
|
+
if (sortedParams.length > 0) {
|
|
60
|
+
const max = sortedParams[sortedParams.length - 1].replace(/^.*\[(\d+)\]$/, '$1');
|
|
61
|
+
this.initial = parseInt(max, 10);
|
|
64
62
|
}
|
|
63
|
+
}
|
|
65
64
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
this.requestUpdate();
|
|
65
|
+
setData(params) {
|
|
66
|
+
this._instances = [];
|
|
67
|
+
this._computeInitial(params);
|
|
68
|
+
for (let i = 0; i < this.initial; i++) {
|
|
69
|
+
this._add(params);
|
|
73
70
|
}
|
|
71
|
+
this.requestUpdate();
|
|
72
|
+
}
|
|
74
73
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
74
|
+
add() {
|
|
75
|
+
this._add();
|
|
76
|
+
this.requestUpdate();
|
|
77
|
+
}
|
|
79
78
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
79
|
+
_add(params) {
|
|
80
|
+
const idx = this._instances.length + 1;
|
|
81
|
+
const clone = document.importNode(this.template.content, true);
|
|
82
|
+
const wrapper = document.createElement('div');
|
|
83
|
+
wrapper.appendChild(clone);
|
|
84
|
+
wrapper.querySelectorAll('[name]').forEach(input => {
|
|
85
|
+
// during inicialization of the default first instance
|
|
86
|
+
// name property is not available (defined),
|
|
87
|
+
// but can be reached as the attribute value
|
|
88
|
+
// see https://github.com/eeditiones/tei-publisher-components/issues/29
|
|
89
|
+
const name =
|
|
90
|
+
input.name === undefined
|
|
91
|
+
? `${input.attributes.getNamedItem('name').nodeValue}[${idx}]`
|
|
92
|
+
: `${input.name}[${idx}]`;
|
|
93
|
+
if (params && params[name]) {
|
|
94
|
+
if (input.type === 'checkbox' || input.type === 'radio') {
|
|
95
|
+
input.checked = params[name] === input.value;
|
|
96
|
+
} else {
|
|
97
|
+
input.value = params[name];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
input.name = name;
|
|
101
|
+
});
|
|
102
|
+
this._instances.push(wrapper);
|
|
103
|
+
}
|
|
102
104
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
105
|
+
_renumber() {
|
|
106
|
+
this._instances.forEach((instance, idx) => {
|
|
107
|
+
instance.querySelectorAll('[name]').forEach(input => {
|
|
108
|
+
const name = input.name.replace(/^(.*)\[\d+\]$/, '$1');
|
|
109
|
+
input.name = `${name}[${idx + 1}]`;
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
111
113
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
114
|
+
delete(idx) {
|
|
115
|
+
this._instances.splice(idx, 1);
|
|
116
|
+
this._renumber();
|
|
117
|
+
this.requestUpdate();
|
|
118
|
+
}
|
|
117
119
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
render() {
|
|
121
|
+
return html`
|
|
122
|
+
<div class="instances">${this._instances.map(this.renderInstance.bind(this))}</div>
|
|
123
|
+
<paper-icon-button icon="add" @click="${this.add}"></paper-icon-button>
|
|
124
|
+
`;
|
|
125
|
+
}
|
|
124
126
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
127
|
+
renderInstance(instance, idx) {
|
|
128
|
+
return html` <div class="instance">
|
|
129
|
+
${instance}
|
|
130
|
+
<paper-icon-button icon="delete" @click="${() => this.delete(idx)}"></paper-icon-button>
|
|
131
|
+
</div>`;
|
|
132
|
+
}
|
|
132
133
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
createRenderRoot() {
|
|
135
|
+
return this;
|
|
136
|
+
}
|
|
136
137
|
}
|
|
137
|
-
customElements.define('pb-repeat', PbRepeat);
|
|
138
|
+
customElements.define('pb-repeat', PbRepeat);
|