@teipublisher/pb-components 2.26.1-next.3 → 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 +262 -11
- 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-fe4a4883.js +0 -527
- package/src/assets/pb-styles.css +0 -51
- package/src/pb-light-dom.js +0 -41
package/src/pb-split-list.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { LitElement, html, css } from 'lit-element';
|
|
2
2
|
import { unsafeHTML } from 'lit-html/directives/unsafe-html.js';
|
|
3
3
|
import { pbMixin, waitOnce } from './pb-mixin.js';
|
|
4
|
-
import { themableMixin } from
|
|
5
|
-
import { registry } from
|
|
4
|
+
import { themableMixin } from './theming.js';
|
|
5
|
+
import { registry } from './urls.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* Implements a list which is split into different categories
|
|
8
|
+
* Implements a list which is split into different categories
|
|
9
9
|
* (e.g. letters of the alphabet, countries ...).
|
|
10
10
|
* Only one category is shown at a time unless the server reports
|
|
11
11
|
* no categories (e.g. if the number of items to display goes below
|
|
@@ -13,13 +13,13 @@ import { registry } from "./urls.js";
|
|
|
13
13
|
*
|
|
14
14
|
* The server-side API endpoint should return a JSON object with two
|
|
15
15
|
* properties:
|
|
16
|
-
*
|
|
17
|
-
* + `categories`: an array of category descriptions: each item should
|
|
16
|
+
*
|
|
17
|
+
* + `categories`: an array of category descriptions: each item should
|
|
18
18
|
* be an object with two properties: `category` - containing the name of the category
|
|
19
19
|
* and `count` - containing a count of items available under this category.
|
|
20
20
|
* + `items`: an array with the items to be shown for the currently selected
|
|
21
21
|
* category. Those may contain HTML markup.
|
|
22
|
-
*
|
|
22
|
+
*
|
|
23
23
|
* Sample JSON object for pb-split-list
|
|
24
24
|
* ```javascript
|
|
25
25
|
* {
|
|
@@ -49,192 +49,197 @@ import { registry } from "./urls.js";
|
|
|
49
49
|
* ]
|
|
50
50
|
* }
|
|
51
51
|
* ```
|
|
52
|
-
*
|
|
53
|
-
* Sample Usage
|
|
52
|
+
*
|
|
53
|
+
* Sample Usage
|
|
54
54
|
* ```xml
|
|
55
55
|
* <pb-split-list url="api/people" subforms="#options" selected="A" emit="transcription" subscribe="transcription"></pb-split-list>
|
|
56
56
|
* ```
|
|
57
|
-
* See https://www.briefedition.alfred-escher.ch/kontexte/personen/?category=A&search=&view=correspondents for a running sample. The source code of the webpage is here: https://github.com/stazh/briefedition-escher. Relevant files are:
|
|
57
|
+
* See https://www.briefedition.alfred-escher.ch/kontexte/personen/?category=A&search=&view=correspondents for a running sample. The source code of the webpage is here: https://github.com/stazh/briefedition-escher. Relevant files are:
|
|
58
58
|
* - [templates/index.html](https://github.com/stazh/briefedition-escher/blob/master/templates/index.html#L223) - usage of pb-timeline
|
|
59
59
|
* - [modules/custom-api.json](https://github.com/stazh/briefedition-escher/blob/master/modules/custom-api.json#L1098) - `/api/people` endpoint delivering required JSON object
|
|
60
|
-
*
|
|
60
|
+
*
|
|
61
61
|
* @cssprop --pb-categorized-list-columns - the number of columns to display (default: 2)
|
|
62
62
|
* @fires pb-submit - when received, submit a request to the server and refresh
|
|
63
63
|
* @fires pb-start-update - sent before the element sends the request to the server
|
|
64
64
|
* @fires pb-end-update - sent after new content has been received
|
|
65
65
|
*/
|
|
66
66
|
export class PbSplitList extends themableMixin(pbMixin(LitElement)) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
67
|
+
static get properties() {
|
|
68
|
+
return {
|
|
69
|
+
/**
|
|
70
|
+
* Server-side API endpoint to retrieve items from
|
|
71
|
+
*/
|
|
72
|
+
url: {
|
|
73
|
+
type: String,
|
|
74
|
+
},
|
|
75
|
+
/**
|
|
76
|
+
* The initially selected category
|
|
77
|
+
*/
|
|
78
|
+
selected: {
|
|
79
|
+
type: String,
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* A CSS selector pointing to one or more `pb-custom-form`
|
|
83
|
+
* instances. The element will collect additional parameters
|
|
84
|
+
* from those forms and includes them in the request to the server
|
|
85
|
+
*/
|
|
86
|
+
subforms: {
|
|
87
|
+
type: String,
|
|
88
|
+
},
|
|
89
|
+
_categories: {
|
|
90
|
+
type: Array,
|
|
91
|
+
},
|
|
92
|
+
...super.properties,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
constructor() {
|
|
97
|
+
super();
|
|
98
|
+
this._categories = [];
|
|
99
|
+
this._params = {};
|
|
100
|
+
this.selected = null;
|
|
101
|
+
this.subforms = null;
|
|
102
|
+
this._initialized = false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
connectedCallback() {
|
|
106
|
+
super.connectedCallback();
|
|
107
|
+
|
|
108
|
+
waitOnce('pb-page-ready', () => {
|
|
109
|
+
this.selected = registry.state.category || this.selected;
|
|
110
|
+
|
|
111
|
+
registry.subscribe(this, state => {
|
|
112
|
+
console.log('<pb-split-list> popstate: %o', state);
|
|
113
|
+
this.selected = state.category;
|
|
114
|
+
this.submit(false);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
this.subscribeTo('pb-submit', this.load.bind(this));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
firstUpdated() {
|
|
122
|
+
super.firstUpdated();
|
|
123
|
+
|
|
124
|
+
waitOnce('pb-page-ready', () => {
|
|
125
|
+
this.load();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
submit(commit = true) {
|
|
130
|
+
this.load(commit);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
load(commit = true) {
|
|
134
|
+
const formParams = this._paramsFromSubforms({});
|
|
135
|
+
if (this.selected) {
|
|
136
|
+
formParams.category = this.selected;
|
|
94
137
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
this
|
|
100
|
-
|
|
101
|
-
this.subforms = null;
|
|
102
|
-
this._initialized = false;
|
|
138
|
+
if (commit) {
|
|
139
|
+
if (!this._initialized) {
|
|
140
|
+
registry.replace(this, formParams);
|
|
141
|
+
} else {
|
|
142
|
+
registry.commit(this, formParams);
|
|
143
|
+
}
|
|
103
144
|
}
|
|
145
|
+
this._initialized = true;
|
|
104
146
|
|
|
105
|
-
|
|
106
|
-
super.connectedCallback();
|
|
147
|
+
const params = new URLSearchParams(formParams);
|
|
107
148
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
registry.subscribe(this, (state) => {
|
|
112
|
-
console.log('<pb-split-list> popstate: %o', state);
|
|
113
|
-
this.selected = state.category;
|
|
114
|
-
this.submit(false);
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
this.subscribeTo('pb-submit', this.load.bind(this));
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
firstUpdated() {
|
|
122
|
-
super.firstUpdated();
|
|
123
|
-
|
|
124
|
-
waitOnce('pb-page-ready', () => {
|
|
125
|
-
this.load();
|
|
126
|
-
});
|
|
127
|
-
}
|
|
149
|
+
const url = `${this.toAbsoluteURL(this.url)}?${params.toString()}`;
|
|
150
|
+
console.log(`<pb-split-list> Fetching from URL: ${url}`);
|
|
128
151
|
|
|
129
|
-
|
|
130
|
-
this.load(commit);
|
|
131
|
-
}
|
|
152
|
+
this.emitTo('pb-start-update');
|
|
132
153
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
if (
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
if (commit) {
|
|
139
|
-
if (!this._initialized) {
|
|
140
|
-
registry.replace(this, formParams);
|
|
141
|
-
} else {
|
|
142
|
-
registry.commit(this, formParams);
|
|
143
|
-
}
|
|
154
|
+
fetch(url)
|
|
155
|
+
.then(response => {
|
|
156
|
+
if (response.ok) {
|
|
157
|
+
return response.json();
|
|
144
158
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
_selectCategory(ev, category) {
|
|
173
|
-
ev.preventDefault();
|
|
174
|
-
this.selected = category;
|
|
175
|
-
this.load();
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
_paramsFromSubforms(params) {
|
|
179
|
-
if (this.subforms) {
|
|
180
|
-
document.querySelectorAll(this.subforms).forEach((form) => {
|
|
181
|
-
if (form.serializeForm) {
|
|
182
|
-
Object.assign(params, form.serializeForm());
|
|
183
|
-
}
|
|
184
|
-
});
|
|
159
|
+
return Promise.reject(response.status);
|
|
160
|
+
})
|
|
161
|
+
.then(json => {
|
|
162
|
+
this._categories = json.categories;
|
|
163
|
+
this.innerHTML = json.items.join('');
|
|
164
|
+
this.emitTo('pb-end-update');
|
|
165
|
+
})
|
|
166
|
+
.catch(error => {
|
|
167
|
+
console.error(`<pb-split-list> Error caught: ${error}`);
|
|
168
|
+
this.emitTo('pb-end-update');
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
_selectCategory(ev, category) {
|
|
173
|
+
ev.preventDefault();
|
|
174
|
+
this.selected = category;
|
|
175
|
+
this.load();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
_paramsFromSubforms(params) {
|
|
179
|
+
if (this.subforms) {
|
|
180
|
+
document.querySelectorAll(this.subforms).forEach(form => {
|
|
181
|
+
if (form.serializeForm) {
|
|
182
|
+
Object.assign(params, form.serializeForm());
|
|
185
183
|
}
|
|
186
|
-
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
render() {
|
|
190
|
-
return html`
|
|
191
|
-
<header>
|
|
192
|
-
${
|
|
193
|
-
this._categories.map((cat) =>
|
|
194
|
-
html`
|
|
195
|
-
<a part="${this.selected === cat.category ? 'active-category' : 'category'}" href="#${cat.category}" title="${cat.count}" class="${this.selected === cat.category ? 'active' : ''}"
|
|
196
|
-
@click="${(ev) => this._selectCategory(ev, cat.category)}">
|
|
197
|
-
${cat.label ? unsafeHTML(cat.label) : cat.category}
|
|
198
|
-
</a>
|
|
199
|
-
`
|
|
200
|
-
)
|
|
201
|
-
}
|
|
202
|
-
</header>
|
|
203
|
-
<div id="items" part="items"><slot></slot></div>
|
|
204
|
-
`;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
static get styles() {
|
|
208
|
-
return css`
|
|
209
|
-
:host {
|
|
210
|
-
display: block;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
header {
|
|
214
|
-
display: flex;
|
|
215
|
-
flex-wrap: wrap;
|
|
216
|
-
column-gap: 10px;
|
|
217
|
-
width: 100%;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
#items {
|
|
221
|
-
display: grid;
|
|
222
|
-
grid-template-columns: repeat(var(--pb-categorized-list-columns, 2), auto);
|
|
223
|
-
grid-auto-rows: 1fr;
|
|
224
|
-
column-gap: 10px;
|
|
225
|
-
width: 100%;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
[part=category], #items a {
|
|
229
|
-
text-decoration: none;
|
|
230
|
-
color: var(--pb-link-color);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
[part=active-category] {
|
|
234
|
-
text-decoration: none;
|
|
235
|
-
color: var(--pb-highlight-color);
|
|
236
|
-
}
|
|
237
|
-
`;
|
|
184
|
+
});
|
|
238
185
|
}
|
|
186
|
+
return params;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
render() {
|
|
190
|
+
return html`
|
|
191
|
+
<header>
|
|
192
|
+
${this._categories.map(
|
|
193
|
+
cat =>
|
|
194
|
+
html`
|
|
195
|
+
<a
|
|
196
|
+
part="${this.selected === cat.category ? 'active-category' : 'category'}"
|
|
197
|
+
href="#${cat.category}"
|
|
198
|
+
title="${cat.count}"
|
|
199
|
+
class="${this.selected === cat.category ? 'active' : ''}"
|
|
200
|
+
@click="${ev => this._selectCategory(ev, cat.category)}"
|
|
201
|
+
>
|
|
202
|
+
${cat.label ? unsafeHTML(cat.label) : cat.category}
|
|
203
|
+
</a>
|
|
204
|
+
`,
|
|
205
|
+
)}
|
|
206
|
+
</header>
|
|
207
|
+
<div id="items" part="items"><slot></slot></div>
|
|
208
|
+
`;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
static get styles() {
|
|
212
|
+
return css`
|
|
213
|
+
:host {
|
|
214
|
+
display: block;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
header {
|
|
218
|
+
display: flex;
|
|
219
|
+
flex-wrap: wrap;
|
|
220
|
+
column-gap: 10px;
|
|
221
|
+
width: 100%;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
#items {
|
|
225
|
+
display: grid;
|
|
226
|
+
grid-template-columns: repeat(var(--pb-categorized-list-columns, 2), auto);
|
|
227
|
+
grid-auto-rows: 1fr;
|
|
228
|
+
column-gap: 10px;
|
|
229
|
+
width: 100%;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
[part='category'],
|
|
233
|
+
#items a {
|
|
234
|
+
text-decoration: none;
|
|
235
|
+
color: var(--pb-link-color);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
[part='active-category'] {
|
|
239
|
+
text-decoration: none;
|
|
240
|
+
color: var(--pb-highlight-color);
|
|
241
|
+
}
|
|
242
|
+
`;
|
|
243
|
+
}
|
|
239
244
|
}
|
|
240
|
-
customElements.define('pb-split-list', PbSplitList);
|
|
245
|
+
customElements.define('pb-split-list', PbSplitList);
|
package/src/pb-svg.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { LitElement, html, css } from 'lit-element';
|
|
2
|
-
import
|
|
2
|
+
import '@lrnwebcomponents/es-global-bridge';
|
|
3
3
|
import { pbMixin } from './pb-mixin.js';
|
|
4
4
|
|
|
5
|
-
|
|
6
5
|
/**
|
|
7
6
|
* Show an SVG image with zoom and pan functionality. The image URL may
|
|
8
7
|
* either be specified via the `url` property or an `pb-show-annotation` event
|
|
@@ -14,94 +13,96 @@ import { pbMixin } from './pb-mixin.js';
|
|
|
14
13
|
* @cssprop --pb-svg-width - Width of the SVG element
|
|
15
14
|
*/
|
|
16
15
|
export class PbSvg extends pbMixin(LitElement) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
16
|
+
static get properties() {
|
|
17
|
+
return {
|
|
18
|
+
...super.properties,
|
|
19
|
+
/**
|
|
20
|
+
* The URL to load the SVG from.
|
|
21
|
+
*/
|
|
22
|
+
url: {
|
|
23
|
+
type: String,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
constructor() {
|
|
29
|
+
super();
|
|
30
|
+
this._pan = null;
|
|
31
|
+
}
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
connectedCallback() {
|
|
34
|
+
super.connectedCallback();
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
window.ESGlobalBridge.requestAvailability();
|
|
37
|
+
window.ESGlobalBridge.instance.load(
|
|
38
|
+
'svg-pan-zoom',
|
|
39
|
+
`https://cdn.jsdelivr.net/npm/svg-pan-zoom@3.6.1/dist/svg-pan-zoom.min.js`,
|
|
40
|
+
);
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
this.subscribeTo('pb-show-annotation', ev => {
|
|
43
|
+
if (this.url === ev.detail.file) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.url = ev.detail.file;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
47
49
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
firstUpdated() {
|
|
51
|
+
super.firstUpdated();
|
|
50
52
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
this.container = this.shadowRoot.getElementById('image');
|
|
54
|
+
}
|
|
53
55
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
56
|
+
updated(changed) {
|
|
57
|
+
if (changed.has('url') && this.url && this.url !== changed.get('url')) {
|
|
58
|
+
this.load();
|
|
58
59
|
}
|
|
60
|
+
}
|
|
59
61
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
const uri = this.toAbsoluteURL(this.url);
|
|
65
|
-
console.log('<pb-svg> Loading %s', uri);
|
|
66
|
-
if (this._pan) {
|
|
67
|
-
this._pan.destroy();
|
|
68
|
-
this._pan = null;
|
|
69
|
-
this.container.innerHTML = '';
|
|
70
|
-
}
|
|
71
|
-
fetch(uri)
|
|
72
|
-
.then((response) => response.text())
|
|
73
|
-
.then((data) => {
|
|
74
|
-
if (!window.svgPanZoom) {
|
|
75
|
-
console.error('<pb-svg> svgPanZoom not available');
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const doc = new DOMParser().parseFromString(data, "image/svg+xml");
|
|
79
|
-
const svg = doc.documentElement;
|
|
80
|
-
this.container.appendChild(svg);
|
|
81
|
-
this._pan =
|
|
82
|
-
window.svgPanZoom(svg, {
|
|
83
|
-
controlIconsEnabled: true,
|
|
84
|
-
fit: true,
|
|
85
|
-
center: true
|
|
86
|
-
});
|
|
87
|
-
});
|
|
62
|
+
load() {
|
|
63
|
+
if (!this.url) {
|
|
64
|
+
return;
|
|
88
65
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
66
|
+
const uri = this.toAbsoluteURL(this.url);
|
|
67
|
+
console.log('<pb-svg> Loading %s', uri);
|
|
68
|
+
if (this._pan) {
|
|
69
|
+
this._pan.destroy();
|
|
70
|
+
this._pan = null;
|
|
71
|
+
this.container.innerHTML = '';
|
|
92
72
|
}
|
|
73
|
+
fetch(uri)
|
|
74
|
+
.then(response => response.text())
|
|
75
|
+
.then(data => {
|
|
76
|
+
if (!window.svgPanZoom) {
|
|
77
|
+
console.error('<pb-svg> svgPanZoom not available');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const doc = new DOMParser().parseFromString(data, 'image/svg+xml');
|
|
81
|
+
const svg = doc.documentElement;
|
|
82
|
+
this.container.appendChild(svg);
|
|
83
|
+
this._pan = window.svgPanZoom(svg, {
|
|
84
|
+
controlIconsEnabled: true,
|
|
85
|
+
fit: true,
|
|
86
|
+
center: true,
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
93
90
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
display: block;
|
|
98
|
-
}
|
|
91
|
+
render() {
|
|
92
|
+
return html`<div id="image"></div>`;
|
|
93
|
+
}
|
|
99
94
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
95
|
+
static get styles() {
|
|
96
|
+
return css`
|
|
97
|
+
:host {
|
|
98
|
+
display: block;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
#image svg {
|
|
102
|
+
height: var(--pb-svg-height, 100%);
|
|
103
|
+
width: var(--pb-svg-width, 100%);
|
|
104
|
+
}
|
|
105
|
+
`;
|
|
106
|
+
}
|
|
106
107
|
}
|
|
107
|
-
customElements.define('pb-svg', PbSvg);
|
|
108
|
+
customElements.define('pb-svg', PbSvg);
|