@teipublisher/pb-components 2.26.1-next.3 → 3.0.0-next-4.2
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/docker-cypress.yml +53 -0
- package/.github/workflows/node.js.yml +70 -21
- package/.releaserc.json +7 -2
- package/CHANGELOG.md +363 -11
- package/Dockerfile +78 -70
- package/README.md +112 -4
- package/css/components.css +5 -5
- package/css/gridjs/mermaid.min.css +1 -1
- package/css/leaflet/Control.Geocoder.css +1 -126
- package/css/leaflet/images/layers.png +0 -0
- package/css/tify/tify.css +6 -5
- package/css/tom-select/tom-select.bootstrap4.min.css +1 -1
- package/css/tom-select/tom-select.bootstrap5.min.css +1 -1
- package/css/tom-select/tom-select.default.min.css +1 -1
- package/css/tom-select/tom-select.default.min.css.map +1 -0
- package/css/tom-select/tom-select.min.css +1 -1
- package/cypress.config.js +84 -0
- package/dist/api.html +1 -1
- package/dist/css/design-system.css +607 -0
- package/dist/demo/bundle-test.html +4 -3
- package/dist/demo/components.css +46 -1
- package/dist/demo/design-system.html +710 -0
- package/dist/demo/dts-client.html +2 -2
- package/dist/demo/pb-autocomplete.html +23 -11
- package/dist/demo/pb-autocomplete2.html +66 -55
- package/dist/demo/pb-autocomplete3.html +17 -8
- package/dist/demo/pb-blacklab-highlight.html +28 -11
- package/dist/demo/pb-blacklab-results.html +3 -2
- package/dist/demo/pb-browse-docs.html +24 -24
- package/dist/demo/pb-browse-docs2.html +3 -3
- package/dist/demo/pb-clipboard.html +32 -28
- package/dist/demo/pb-code-editor.html +6 -6
- package/dist/demo/pb-code-highlight.html +63 -63
- package/dist/demo/pb-codepen.html +1 -1
- package/dist/demo/pb-collapse.html +1 -1
- package/dist/demo/pb-collapse2.html +2 -2
- package/dist/demo/pb-combo-box.html +135 -130
- package/dist/demo/pb-custom-form.html +64 -55
- package/dist/demo/pb-dialog.html +12 -6
- package/dist/demo/pb-document.html +1 -1
- package/dist/demo/pb-download.html +68 -59
- package/dist/demo/pb-drawer.html +67 -46
- package/dist/demo/pb-drawer2.html +65 -58
- package/dist/demo/pb-edit-app.html +2 -2
- package/dist/demo/pb-edit-xml.html +1 -1
- package/dist/demo/pb-facsimile-2.html +26 -11
- package/dist/demo/pb-facsimile-3.html +25 -10
- package/dist/demo/pb-facsimile-dedup-test-2.html +48 -0
- package/dist/demo/pb-facsimile-dedup-test.html +48 -0
- package/dist/demo/pb-facsimile.html +4 -4
- package/dist/demo/pb-formula.html +1 -1
- package/dist/demo/pb-grid.html +22 -8
- package/dist/demo/pb-highlight.html +2 -2
- package/dist/demo/pb-i18n-simple.html +1 -0
- package/dist/demo/pb-i18n.html +15 -5
- package/dist/demo/pb-image-strip-standalone.html +2 -2
- package/dist/demo/pb-image-strip-view.html +2 -2
- package/dist/demo/pb-leaflet-map.html +3 -3
- package/dist/demo/pb-leaflet-map2.html +2 -2
- package/dist/demo/pb-leaflet-map3.html +3 -3
- package/dist/demo/pb-link.html +1 -1
- package/dist/demo/pb-load.html +2 -6
- package/dist/demo/pb-login.html +1 -3
- package/dist/demo/pb-manage-odds.html +9 -4
- package/dist/demo/pb-markdown.html +1 -1
- package/dist/demo/pb-media-query.html +2 -2
- package/dist/demo/pb-mei.html +2 -2
- package/dist/demo/pb-mei2.html +2 -2
- package/dist/demo/pb-message.html +2 -3
- package/dist/demo/pb-odd-editor.html +54 -52
- package/dist/demo/pb-page-header.html +27 -0
- package/dist/demo/pb-popover.html +1 -1
- package/dist/demo/pb-print-preview.html +2 -2
- package/dist/demo/pb-progress.html +4 -4
- package/dist/demo/pb-repeat.html +32 -36
- package/dist/demo/pb-search.html +16 -5
- package/dist/demo/pb-search2.html +4 -4
- package/dist/demo/pb-search3.html +3 -3
- package/dist/demo/pb-search4.html +3 -3
- package/dist/demo/pb-select-feature.html +4 -4
- package/dist/demo/pb-select-feature2.html +4 -4
- package/dist/demo/pb-select-feature3.html +2 -2
- package/dist/demo/pb-select-i18n.html +58 -53
- package/dist/demo/pb-select-odd.html +1 -1
- package/dist/demo/pb-select.html +190 -75
- package/dist/demo/pb-select2.html +91 -37
- package/dist/demo/pb-select3.html +109 -41
- package/dist/demo/pb-svg.html +1 -1
- package/dist/demo/pb-table-grid.html +26 -15
- package/dist/demo/pb-tabs.html +15 -7
- package/dist/demo/pb-tify.html +7 -7
- package/dist/demo/pb-timeline.html +1 -1
- package/dist/demo/pb-timeline2.html +1 -1
- package/dist/demo/pb-toggle-feature.html +26 -23
- package/dist/demo/pb-toggle-feature2.html +4 -4
- package/dist/demo/pb-toggle-feature3.html +2 -2
- package/dist/demo/pb-toggle-feature4.html +56 -54
- package/dist/demo/pb-version.html +2 -2
- package/dist/demo/pb-view.html +78 -40
- package/dist/demo/pb-view2.html +69 -46
- package/dist/demo/pb-view3.html +53 -48
- package/dist/demo/pb-view4.html +70 -49
- package/dist/demo/pb-zoom.html +2 -2
- package/dist/{es-global-bridge-d8ce175d.js → es-global-bridge-D8ZcUcx_.js} +0 -4
- package/dist/focus-mixin-VCsFap6b.js +768 -0
- package/dist/images/icons.svg +217 -0
- package/dist/jinn-codemirror-DETLdm08.js +1 -0
- package/dist/lib/openseadragon.min.js +80 -0
- package/dist/lib/openseadragon.min.js.map +1 -0
- package/dist/pb-code-editor.js +25 -20
- package/dist/pb-component-docs.js +414 -3225
- package/dist/pb-components-bundle.js +3046 -4402
- package/dist/pb-dialog-tklYGWfc.js +121 -0
- package/dist/pb-edit-app.js +208 -107
- package/dist/pb-elements.json +716 -249
- package/dist/pb-facsimile.js +46 -0
- package/dist/pb-i18n-C0NDma4h.js +1 -0
- package/dist/pb-leaflet-map.js +23 -23
- package/dist/pb-mei.js +152 -134
- package/dist/pb-mixin-DHoWQheB.js +1 -0
- package/dist/pb-odd-editor.js +1671 -1231
- package/dist/pb-tify.js +1 -27
- package/dist/unsafe-html-D5VGo9Oq.js +1 -0
- package/dist/urls-BEONu_g4.js +1 -0
- package/eslint.config.mjs +92 -0
- package/gh-pages.js +5 -3
- package/i18n/common/en.json +6 -0
- package/i18n/common/pl.json +2 -2
- package/images/icons.svg +217 -0
- package/index.html +0 -5
- package/lib/leaflet-src.js.map +1 -0
- package/lib/leaflet.markercluster-src.js.map +1 -0
- package/lib/openseadragon.min.js +6 -6
- package/package.json +56 -81
- package/pb-elements.json +716 -249
- package/rollup.config.mjs +312 -0
- package/src/assets/components.css +5 -5
- package/src/assets/design-system.css +607 -0
- package/src/authority/airtable.js +20 -21
- package/src/authority/anton.js +129 -129
- package/src/authority/custom.js +70 -27
- package/src/authority/geonames.js +38 -32
- package/src/authority/gnd.js +50 -42
- package/src/authority/kbga.js +136 -134
- package/src/authority/metagrid.js +44 -46
- package/src/authority/reconciliation.js +66 -68
- package/src/authority/registry.js +4 -4
- package/src/docs/demo-utils.js +91 -0
- package/src/docs/pb-component-docs.js +287 -147
- package/src/docs/pb-component-view.js +380 -273
- package/src/docs/pb-components-list.js +115 -51
- package/src/docs/pb-demo-snippet.js +199 -174
- package/src/dts-client.js +306 -303
- package/src/dts-select-endpoint.js +125 -85
- package/src/parse-date-service.js +184 -135
- package/src/pb-ajax.js +175 -173
- package/src/pb-authority-lookup.js +198 -158
- package/src/pb-autocomplete.js +731 -313
- package/src/pb-blacklab-highlight.js +266 -260
- package/src/pb-blacklab-results.js +230 -225
- package/src/pb-browse-docs.js +601 -484
- package/src/pb-browse.js +68 -65
- package/src/pb-clipboard.js +97 -76
- package/src/pb-code-editor.js +111 -103
- package/src/pb-code-highlight.js +234 -204
- package/src/pb-codepen.js +81 -73
- package/src/pb-collapse.js +265 -152
- package/src/pb-combo-box.js +191 -191
- package/src/pb-components-bundle.js +1 -7
- package/src/pb-components.js +2 -6
- package/src/pb-custom-form.js +230 -141
- package/src/pb-dialog.js +99 -63
- package/src/pb-document.js +118 -91
- package/src/pb-download.js +214 -198
- package/src/pb-drawer.js +146 -149
- package/src/pb-edit-app.js +471 -240
- package/src/pb-edit-xml.js +101 -98
- package/src/pb-events.js +126 -107
- package/src/pb-facs-link.js +130 -101
- package/src/pb-facsimile.js +494 -410
- package/src/pb-fetch.js +389 -0
- package/src/pb-formula.js +152 -154
- package/src/pb-geolocation.js +130 -132
- package/src/pb-grid-action.js +59 -56
- package/src/pb-grid.js +388 -228
- package/src/pb-highlight.js +142 -142
- package/src/pb-hotkeys.js +40 -42
- package/src/pb-i18n.js +115 -127
- package/src/pb-icon-button.js +108 -0
- package/src/pb-icon.js +283 -0
- package/src/pb-image-strip.js +85 -79
- package/src/pb-lang.js +142 -57
- package/src/pb-leaflet-map.js +551 -483
- package/src/pb-link.js +132 -126
- package/src/pb-load.js +495 -428
- package/src/pb-login.js +303 -248
- package/src/pb-manage-odds.js +384 -338
- package/src/pb-map-icon.js +90 -90
- package/src/pb-map-layer.js +86 -86
- package/src/pb-markdown.js +107 -110
- package/src/pb-media-query.js +75 -73
- package/src/pb-mei.js +523 -303
- package/src/pb-message.js +144 -98
- package/src/pb-mixin.js +268 -265
- package/src/pb-navigation.js +83 -96
- package/src/pb-observable.js +39 -39
- package/src/pb-odd-editor.js +1209 -948
- package/src/pb-odd-elementspec-editor.js +375 -310
- package/src/pb-odd-model-editor.js +1189 -941
- package/src/pb-odd-parameter-editor.js +269 -170
- package/src/pb-odd-rendition-editor.js +184 -131
- package/src/pb-page.js +451 -422
- package/src/pb-paginate.js +260 -178
- package/src/pb-panel.js +217 -183
- package/src/pb-popover-themes.js +16 -9
- package/src/pb-popover.js +297 -288
- package/src/pb-print-preview.js +128 -128
- package/src/pb-progress.js +52 -52
- package/src/pb-repeat.js +141 -108
- package/src/pb-restricted.js +85 -78
- package/src/pb-search.js +258 -230
- package/src/pb-select-feature.js +210 -126
- package/src/pb-select-odd.js +184 -118
- package/src/pb-select-template.js +113 -78
- package/src/pb-select.js +330 -229
- package/src/pb-split-list.js +181 -176
- package/src/pb-svg.js +81 -80
- package/src/pb-table-column.js +55 -55
- package/src/pb-table-grid.js +334 -205
- package/src/pb-tabs.js +238 -61
- package/src/pb-tify.js +3331 -126
- package/src/pb-timeline.js +394 -255
- package/src/pb-toggle-feature.js +196 -188
- package/src/pb-upload.js +201 -176
- package/src/pb-version.js +22 -34
- package/src/pb-view-annotate.js +138 -102
- package/src/pb-view.js +1722 -1272
- package/src/pb-zoom.js +144 -46
- package/src/search-result-service.js +256 -223
- package/src/seed-element.js +14 -22
- package/src/settings.js +4 -4
- package/src/theming.js +98 -91
- package/src/urls.js +403 -289
- package/src/utils.js +53 -51
- package/vite.config.js +86 -0
- package/.github/workflows/main.yml +0 -24
- package/.github/workflows/release.js.yml +0 -34
- package/css/pb-styles.css +0 -51
- package/dist/iron-form-3b8dcaa7.js +0 -210
- package/dist/jinn-codemirror-da0e2d1f.js +0 -1
- package/dist/paper-checkbox-515a5284.js +0 -1597
- package/dist/paper-icon-button-b1d31571.js +0 -398
- package/dist/paper-listbox-a3b7175c.js +0 -1265
- package/dist/pb-i18n-0611135a.js +0 -1
- package/dist/pb-mixin-b1caa22e.js +0 -158
- package/dist/polymer-hack.js +0 -1
- package/dist/vaadin-element-mixin-fe4a4883.js +0 -527
- package/lib/Control.Geocoder.min.js +0 -2
- package/lib/Control.Geocoder.min.js.map +0 -1
- package/src/assets/pb-styles.css +0 -51
- package/src/pb-light-dom.js +0 -41
- package/src/polymer-hack.js +0 -6
package/src/pb-document.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { LitElement } from 'lit
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
2
|
import { pbMixin } from './pb-mixin.js';
|
|
3
|
-
import { registry } from
|
|
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,135 @@ 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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
+
constructor() {
|
|
67
|
+
super();
|
|
68
|
+
this.path = null;
|
|
69
|
+
this.rootPath = '';
|
|
70
|
+
this.disableHistory = false;
|
|
71
|
+
// Internal: coalesce & de-duplicate emitted update events
|
|
72
|
+
this._emitScheduled = false;
|
|
73
|
+
this._lastEventKey = null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
connectedCallback() {
|
|
77
|
+
super.connectedCallback();
|
|
66
78
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
this.
|
|
71
|
-
|
|
79
|
+
if (!this.disableHistory) {
|
|
80
|
+
// if path is unset, use path taken from the URL
|
|
81
|
+
if (registry.state.path && !this.path) {
|
|
82
|
+
this.path = registry.state.path;
|
|
83
|
+
}
|
|
84
|
+
this.view = registry.state.view || this.view;
|
|
85
|
+
this.odd = registry.state.odd || this.odd;
|
|
72
86
|
}
|
|
73
87
|
|
|
74
|
-
|
|
75
|
-
|
|
88
|
+
// Initialize the event key baseline to prevent unnecessary initial events
|
|
89
|
+
this._lastEventKey = this._computeEventKey();
|
|
90
|
+
}
|
|
76
91
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
this.view = registry.state.view || this.view;
|
|
83
|
-
this.odd = registry.state.odd || this.odd;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
92
|
+
attributeChangedCallback(name, oldVal, newVal) {
|
|
93
|
+
super.attributeChangedCallback(name, oldVal, newVal);
|
|
94
|
+
// No-op if value did not change (prevents churn)
|
|
95
|
+
if (oldVal === newVal) return;
|
|
86
96
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if (oldVal) {
|
|
90
|
-
console.log('<pb-document> Emit update event');
|
|
91
|
-
this.emitTo('pb-document', this);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
97
|
+
// Coalesce multiple rapid attribute updates into a single emit
|
|
98
|
+
if (this._emitScheduled) return;
|
|
94
99
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
this._emitScheduled = true;
|
|
101
|
+
setTimeout(() => {
|
|
102
|
+
this._emitScheduled = false;
|
|
103
|
+
const key = this._computeEventKey();
|
|
104
|
+
if (key !== this._lastEventKey) {
|
|
105
|
+
this.emitTo('pb-document', this);
|
|
106
|
+
this._lastEventKey = key;
|
|
107
|
+
}
|
|
108
|
+
}, 0);
|
|
109
|
+
}
|
|
103
110
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
111
|
+
_computeEventKey() {
|
|
112
|
+
// Build a stable signature of relevant state used by pb-view
|
|
113
|
+
return JSON.stringify({
|
|
114
|
+
path: this.path || '',
|
|
115
|
+
rootPath: this.rootPath || '',
|
|
116
|
+
odd: this.odd || '',
|
|
117
|
+
view: this.view || '',
|
|
118
|
+
sourceView: this.sourceView || '',
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Returns the name of the document without path.
|
|
124
|
+
*
|
|
125
|
+
* @returns {string} Name of the document
|
|
126
|
+
*/
|
|
127
|
+
getFileName() {
|
|
128
|
+
return this.path.replace(/^.*?([^\/]+)$/, '$1');
|
|
129
|
+
}
|
|
107
130
|
|
|
108
|
-
|
|
131
|
+
getCollection() {
|
|
132
|
+
return this.path.replace(/^(.*?)\/[^\/]+$/, '$1');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
109
136
|
* Returns the full path to the document.
|
|
110
137
|
|
|
111
138
|
* @returns {string} Full path to the document
|
|
112
139
|
*/
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
140
|
+
getFullPath() {
|
|
141
|
+
return `${this.rootPath}/${this.path}`;
|
|
142
|
+
}
|
|
116
143
|
}
|
|
117
144
|
|
|
118
145
|
customElements.define('pb-document', PbDocument);
|
package/src/pb-download.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { LitElement, html, css } from 'lit
|
|
2
|
-
import 'js-cookie
|
|
1
|
+
import { LitElement, html, css } from 'lit';
|
|
2
|
+
import Cookies from 'js-cookie';
|
|
3
3
|
import { pbMixin, waitOnce } from './pb-mixin.js';
|
|
4
|
+
import { themableMixin } from './theming.js';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Generate a link to download a resource. Optionally shows a dialog during the download.
|
|
@@ -11,212 +12,227 @@ import { pbMixin, waitOnce } from './pb-mixin.js';
|
|
|
11
12
|
* @cssprop --pb-download-color - Color of the download title label
|
|
12
13
|
* @cssprop --pb-download-text-decoration - Extra effects for the download title label
|
|
13
14
|
*/
|
|
14
|
-
export class PbDownload extends pbMixin(LitElement) {
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
15
|
+
export class PbDownload extends themableMixin(pbMixin(LitElement)) {
|
|
16
|
+
static get properties() {
|
|
17
|
+
return {
|
|
18
|
+
...super.properties,
|
|
19
|
+
/**
|
|
20
|
+
* optional id reference to a pb-document. If `url` is not specified,
|
|
21
|
+
* a correct download URL is constructed using the given document path and parameters.
|
|
22
|
+
* Otherwise `url` will be used as main URL.
|
|
23
|
+
*/
|
|
24
|
+
src: {
|
|
25
|
+
type: String,
|
|
26
|
+
},
|
|
27
|
+
/**
|
|
28
|
+
* the base URL to construct the link from. If specified, only the ODD and optional parameters
|
|
29
|
+
* will be appended to the URL.
|
|
30
|
+
*/
|
|
31
|
+
url: {
|
|
32
|
+
type: String,
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* optional suffix to append to the constructed URL. Use for getting a PDF, epub or similar.
|
|
36
|
+
*/
|
|
37
|
+
type: {
|
|
38
|
+
type: String,
|
|
39
|
+
},
|
|
40
|
+
/**
|
|
41
|
+
* extra odd parameter to be added. This will correspond to the ODD used by the document, if given.
|
|
42
|
+
*/
|
|
43
|
+
odd: {
|
|
44
|
+
type: String,
|
|
45
|
+
},
|
|
46
|
+
/**
|
|
47
|
+
* id of dialog component to show when downloading. A `pb-dialog` component with this id must
|
|
48
|
+
* exist.
|
|
49
|
+
*/
|
|
50
|
+
dialog: {
|
|
51
|
+
type: String,
|
|
52
|
+
},
|
|
53
|
+
/**
|
|
54
|
+
* title to show in the dialog while download is in progress
|
|
55
|
+
*/
|
|
56
|
+
title: {
|
|
57
|
+
type: String,
|
|
58
|
+
},
|
|
59
|
+
/**
|
|
60
|
+
* add a special parameter 'source=yes' if true. For PDF this will result
|
|
61
|
+
* in generated source code to be displayed
|
|
62
|
+
*/
|
|
63
|
+
source: {
|
|
64
|
+
type: Boolean,
|
|
65
|
+
},
|
|
66
|
+
/**
|
|
67
|
+
* extra params to be added
|
|
68
|
+
*/
|
|
69
|
+
params: {
|
|
70
|
+
type: String,
|
|
71
|
+
},
|
|
72
|
+
_target: {
|
|
73
|
+
type: String,
|
|
74
|
+
reflect: true,
|
|
75
|
+
},
|
|
76
|
+
_href: {
|
|
77
|
+
type: String,
|
|
78
|
+
reflect: true,
|
|
79
|
+
},
|
|
80
|
+
_token: {
|
|
81
|
+
type: String,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
constructor() {
|
|
87
|
+
super();
|
|
88
|
+
|
|
89
|
+
this.source = false;
|
|
90
|
+
this._target = '_self';
|
|
91
|
+
this.type = '';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
firstUpdated() {
|
|
95
|
+
if (this.src) {
|
|
96
|
+
this.subscribeTo('pb-document', ev => {
|
|
97
|
+
if (ev.detail.id === this.src) {
|
|
98
|
+
this.odd = ev.detail.odd;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
83
101
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
102
|
+
this.subscribeTo('pb-refresh', ev => {
|
|
103
|
+
if (ev.detail.odd) {
|
|
104
|
+
this.odd = ev.detail.odd;
|
|
105
|
+
this._href = this._computeURL();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
waitOnce('pb-page-ready', () => {
|
|
109
|
+
this._target = this._computeTarget();
|
|
110
|
+
this._href = this._computeURL();
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
attributeChangedCallback(name, oldVal, newVal) {
|
|
115
|
+
super.attributeChangedCallback(name, oldVal, newVal);
|
|
116
|
+
|
|
117
|
+
if (!oldVal) {
|
|
118
|
+
return;
|
|
91
119
|
}
|
|
92
120
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
});
|
|
107
|
-
waitOnce('pb-page-ready', () => {
|
|
108
|
-
this._target = this._computeTarget();
|
|
109
|
-
this._href = this._computeURL();
|
|
110
|
-
});
|
|
121
|
+
switch (name) {
|
|
122
|
+
case 'source':
|
|
123
|
+
this._target = this._computeTarget();
|
|
124
|
+
break;
|
|
125
|
+
case 'src':
|
|
126
|
+
case 'type':
|
|
127
|
+
case 'file':
|
|
128
|
+
case 'odd':
|
|
129
|
+
case 'params':
|
|
130
|
+
case 'url':
|
|
131
|
+
this._href = this._computeURL();
|
|
132
|
+
break;
|
|
133
|
+
default:
|
|
111
134
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
render() {
|
|
138
|
+
return html`
|
|
139
|
+
<a
|
|
140
|
+
id="button"
|
|
141
|
+
@click="${this._handleClick}"
|
|
142
|
+
title="${this.title}"
|
|
143
|
+
target="${this._target}"
|
|
144
|
+
href="${this._href}"
|
|
145
|
+
><slot></slot
|
|
146
|
+
></a>
|
|
147
|
+
`;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
static get styles() {
|
|
151
|
+
return css`
|
|
152
|
+
:host {
|
|
153
|
+
display: inline-block;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
a {
|
|
157
|
+
text-decoration: var(--pb-download-text-decoration, none);
|
|
158
|
+
}
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
_computeTarget() {
|
|
163
|
+
return this.source ? '_blank' : '_self';
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
_computeURL() {
|
|
167
|
+
this._token = new Date().getTime() * 797;
|
|
168
|
+
let url;
|
|
169
|
+
const doc = this.getDocument();
|
|
170
|
+
if (doc) {
|
|
171
|
+
if (this.url) {
|
|
172
|
+
url = `${this.toAbsoluteURL(this.url)}?odd=${this.odd ? this.odd : doc.odd}.odd`;
|
|
173
|
+
} else {
|
|
174
|
+
const serverPart = `${this.getEndpoint()}/`;
|
|
175
|
+
if (this.lessThanApiVersion('1.0.0')) {
|
|
176
|
+
url = `${doc.getFileName()}${this.type ? `.${this.type}` : ''}?odd=${
|
|
177
|
+
this.odd ? this.odd : doc.odd
|
|
178
|
+
}.odd&cache=no&token=${this._token}`;
|
|
179
|
+
} else {
|
|
180
|
+
url = `${serverPart}api/document/${encodeURIComponent(doc.path)}/${
|
|
181
|
+
this.type || 'html'
|
|
182
|
+
}?odd=${this.odd ? this.odd : doc.odd}.odd&token=${this._token}`;
|
|
133
183
|
}
|
|
184
|
+
}
|
|
185
|
+
} else {
|
|
186
|
+
url = /^(?:[a-z]+:)?\/\//i.test(this.url) ? this.url : `${this.getEndpoint()}/${this.url}`;
|
|
187
|
+
if (this.lessThanApiVersion('1.0.0')) {
|
|
188
|
+
url = `${url}${this.type ? `.${this.type}` : ''}?odd=${this.odd}&cache=no&token='${
|
|
189
|
+
this._token
|
|
190
|
+
}`;
|
|
191
|
+
} else {
|
|
192
|
+
url = `${url}/${this.type}?odd=${this.odd}&token='${this._token}`;
|
|
193
|
+
}
|
|
134
194
|
}
|
|
135
195
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
<a id="button" @click="${this._handleClick}" title="${this.title}" target="${this._target}" href="${this._href}"><slot></slot></a>
|
|
139
|
-
`;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
static get styles() {
|
|
143
|
-
return css`
|
|
144
|
-
:host {
|
|
145
|
-
display: inline-block;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
a {
|
|
149
|
-
text-decoration: var(--pb-download-text-decoration, none);
|
|
150
|
-
color: var(--pb-download-color);
|
|
151
|
-
}
|
|
152
|
-
`;
|
|
196
|
+
if (this.params) {
|
|
197
|
+
url += `&${this.params}`;
|
|
153
198
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return this.source ? '_blank' : '_self';
|
|
199
|
+
if (this.source) {
|
|
200
|
+
url += '&source=true';
|
|
157
201
|
}
|
|
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
|
-
if (this.source) {
|
|
187
|
-
url += '&source=true';
|
|
202
|
+
return url;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
*
|
|
207
|
+
* triggers a document download
|
|
208
|
+
*
|
|
209
|
+
* @param ev
|
|
210
|
+
* @private
|
|
211
|
+
*/
|
|
212
|
+
_handleClick(ev) {
|
|
213
|
+
if (this.dialog) {
|
|
214
|
+
const dialog = document.getElementById(this.dialog);
|
|
215
|
+
|
|
216
|
+
if (dialog) {
|
|
217
|
+
dialog.openDialog();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const token = this._token;
|
|
221
|
+
const downloadCheck = window.setInterval(() => {
|
|
222
|
+
const cookieValue = Cookies.get('simple.token');
|
|
223
|
+
if (cookieValue === token) {
|
|
224
|
+
window.clearInterval(downloadCheck);
|
|
225
|
+
Cookies.remove('simple.token');
|
|
226
|
+
if (dialog) {
|
|
227
|
+
dialog.closeDialog();
|
|
228
|
+
}
|
|
188
229
|
}
|
|
189
|
-
|
|
230
|
+
});
|
|
190
231
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
* triggers a document download
|
|
195
|
-
*
|
|
196
|
-
* @param ev
|
|
197
|
-
* @private
|
|
198
|
-
*/
|
|
199
|
-
_handleClick(ev) {
|
|
200
|
-
if (this.dialog) {
|
|
201
|
-
const dialog = document.getElementById(this.dialog);
|
|
202
|
-
|
|
203
|
-
//todo: this will error when dialog is not found or defined on element.
|
|
204
|
-
dialog.open();
|
|
205
|
-
|
|
206
|
-
const token = this._token;
|
|
207
|
-
const downloadCheck = window.setInterval(() => {
|
|
208
|
-
const cookieValue = Cookies.get("simple.token");
|
|
209
|
-
if (cookieValue === token) {
|
|
210
|
-
window.clearInterval(downloadCheck);
|
|
211
|
-
Cookies.remove("simple.token");
|
|
212
|
-
dialog.close();
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
if (this._target === '_self') {
|
|
217
|
-
ev.preventDefault();
|
|
218
|
-
window.location = this._href;
|
|
219
|
-
}
|
|
232
|
+
if (this._target === '_self') {
|
|
233
|
+
ev.preventDefault();
|
|
234
|
+
window.location = this._href;
|
|
220
235
|
}
|
|
236
|
+
}
|
|
221
237
|
}
|
|
222
|
-
customElements.define('pb-download', PbDownload);
|
|
238
|
+
customElements.define('pb-download', PbDownload);
|