@teipublisher/pb-components 2.26.1-next.3 → 3.0.0-next-4.1

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