@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.
Files changed (262) hide show
  1. package/.github/workflows/docker-cypress.yml +53 -0
  2. package/.github/workflows/node.js.yml +70 -21
  3. package/.releaserc.json +7 -2
  4. package/CHANGELOG.md +363 -11
  5. package/Dockerfile +78 -70
  6. package/README.md +112 -4
  7. package/css/components.css +5 -5
  8. package/css/gridjs/mermaid.min.css +1 -1
  9. package/css/leaflet/Control.Geocoder.css +1 -126
  10. package/css/leaflet/images/layers.png +0 -0
  11. package/css/tify/tify.css +6 -5
  12. package/css/tom-select/tom-select.bootstrap4.min.css +1 -1
  13. package/css/tom-select/tom-select.bootstrap5.min.css +1 -1
  14. package/css/tom-select/tom-select.default.min.css +1 -1
  15. package/css/tom-select/tom-select.default.min.css.map +1 -0
  16. package/css/tom-select/tom-select.min.css +1 -1
  17. package/cypress.config.js +84 -0
  18. package/dist/api.html +1 -1
  19. package/dist/css/design-system.css +607 -0
  20. package/dist/demo/bundle-test.html +4 -3
  21. package/dist/demo/components.css +46 -1
  22. package/dist/demo/design-system.html +710 -0
  23. package/dist/demo/dts-client.html +2 -2
  24. package/dist/demo/pb-autocomplete.html +23 -11
  25. package/dist/demo/pb-autocomplete2.html +66 -55
  26. package/dist/demo/pb-autocomplete3.html +17 -8
  27. package/dist/demo/pb-blacklab-highlight.html +28 -11
  28. package/dist/demo/pb-blacklab-results.html +3 -2
  29. package/dist/demo/pb-browse-docs.html +24 -24
  30. package/dist/demo/pb-browse-docs2.html +3 -3
  31. package/dist/demo/pb-clipboard.html +32 -28
  32. package/dist/demo/pb-code-editor.html +6 -6
  33. package/dist/demo/pb-code-highlight.html +63 -63
  34. package/dist/demo/pb-codepen.html +1 -1
  35. package/dist/demo/pb-collapse.html +1 -1
  36. package/dist/demo/pb-collapse2.html +2 -2
  37. package/dist/demo/pb-combo-box.html +135 -130
  38. package/dist/demo/pb-custom-form.html +64 -55
  39. package/dist/demo/pb-dialog.html +12 -6
  40. package/dist/demo/pb-document.html +1 -1
  41. package/dist/demo/pb-download.html +68 -59
  42. package/dist/demo/pb-drawer.html +67 -46
  43. package/dist/demo/pb-drawer2.html +65 -58
  44. package/dist/demo/pb-edit-app.html +2 -2
  45. package/dist/demo/pb-edit-xml.html +1 -1
  46. package/dist/demo/pb-facsimile-2.html +26 -11
  47. package/dist/demo/pb-facsimile-3.html +25 -10
  48. package/dist/demo/pb-facsimile-dedup-test-2.html +48 -0
  49. package/dist/demo/pb-facsimile-dedup-test.html +48 -0
  50. package/dist/demo/pb-facsimile.html +4 -4
  51. package/dist/demo/pb-formula.html +1 -1
  52. package/dist/demo/pb-grid.html +22 -8
  53. package/dist/demo/pb-highlight.html +2 -2
  54. package/dist/demo/pb-i18n-simple.html +1 -0
  55. package/dist/demo/pb-i18n.html +15 -5
  56. package/dist/demo/pb-image-strip-standalone.html +2 -2
  57. package/dist/demo/pb-image-strip-view.html +2 -2
  58. package/dist/demo/pb-leaflet-map.html +3 -3
  59. package/dist/demo/pb-leaflet-map2.html +2 -2
  60. package/dist/demo/pb-leaflet-map3.html +3 -3
  61. package/dist/demo/pb-link.html +1 -1
  62. package/dist/demo/pb-load.html +2 -6
  63. package/dist/demo/pb-login.html +1 -3
  64. package/dist/demo/pb-manage-odds.html +9 -4
  65. package/dist/demo/pb-markdown.html +1 -1
  66. package/dist/demo/pb-media-query.html +2 -2
  67. package/dist/demo/pb-mei.html +2 -2
  68. package/dist/demo/pb-mei2.html +2 -2
  69. package/dist/demo/pb-message.html +2 -3
  70. package/dist/demo/pb-odd-editor.html +54 -52
  71. package/dist/demo/pb-page-header.html +27 -0
  72. package/dist/demo/pb-popover.html +1 -1
  73. package/dist/demo/pb-print-preview.html +2 -2
  74. package/dist/demo/pb-progress.html +4 -4
  75. package/dist/demo/pb-repeat.html +32 -36
  76. package/dist/demo/pb-search.html +16 -5
  77. package/dist/demo/pb-search2.html +4 -4
  78. package/dist/demo/pb-search3.html +3 -3
  79. package/dist/demo/pb-search4.html +3 -3
  80. package/dist/demo/pb-select-feature.html +4 -4
  81. package/dist/demo/pb-select-feature2.html +4 -4
  82. package/dist/demo/pb-select-feature3.html +2 -2
  83. package/dist/demo/pb-select-i18n.html +58 -53
  84. package/dist/demo/pb-select-odd.html +1 -1
  85. package/dist/demo/pb-select.html +190 -75
  86. package/dist/demo/pb-select2.html +91 -37
  87. package/dist/demo/pb-select3.html +109 -41
  88. package/dist/demo/pb-svg.html +1 -1
  89. package/dist/demo/pb-table-grid.html +26 -15
  90. package/dist/demo/pb-tabs.html +15 -7
  91. package/dist/demo/pb-tify.html +7 -7
  92. package/dist/demo/pb-timeline.html +1 -1
  93. package/dist/demo/pb-timeline2.html +1 -1
  94. package/dist/demo/pb-toggle-feature.html +26 -23
  95. package/dist/demo/pb-toggle-feature2.html +4 -4
  96. package/dist/demo/pb-toggle-feature3.html +2 -2
  97. package/dist/demo/pb-toggle-feature4.html +56 -54
  98. package/dist/demo/pb-version.html +2 -2
  99. package/dist/demo/pb-view.html +78 -40
  100. package/dist/demo/pb-view2.html +69 -46
  101. package/dist/demo/pb-view3.html +53 -48
  102. package/dist/demo/pb-view4.html +70 -49
  103. package/dist/demo/pb-zoom.html +2 -2
  104. package/dist/{es-global-bridge-d8ce175d.js → es-global-bridge-D8ZcUcx_.js} +0 -4
  105. package/dist/focus-mixin-VCsFap6b.js +768 -0
  106. package/dist/images/icons.svg +217 -0
  107. package/dist/jinn-codemirror-DETLdm08.js +1 -0
  108. package/dist/lib/openseadragon.min.js +80 -0
  109. package/dist/lib/openseadragon.min.js.map +1 -0
  110. package/dist/pb-code-editor.js +25 -20
  111. package/dist/pb-component-docs.js +414 -3225
  112. package/dist/pb-components-bundle.js +3046 -4402
  113. package/dist/pb-dialog-tklYGWfc.js +121 -0
  114. package/dist/pb-edit-app.js +208 -107
  115. package/dist/pb-elements.json +716 -249
  116. package/dist/pb-facsimile.js +46 -0
  117. package/dist/pb-i18n-C0NDma4h.js +1 -0
  118. package/dist/pb-leaflet-map.js +23 -23
  119. package/dist/pb-mei.js +152 -134
  120. package/dist/pb-mixin-DHoWQheB.js +1 -0
  121. package/dist/pb-odd-editor.js +1671 -1231
  122. package/dist/pb-tify.js +1 -27
  123. package/dist/unsafe-html-D5VGo9Oq.js +1 -0
  124. package/dist/urls-BEONu_g4.js +1 -0
  125. package/eslint.config.mjs +92 -0
  126. package/gh-pages.js +5 -3
  127. package/i18n/common/en.json +6 -0
  128. package/i18n/common/pl.json +2 -2
  129. package/images/icons.svg +217 -0
  130. package/index.html +0 -5
  131. package/lib/leaflet-src.js.map +1 -0
  132. package/lib/leaflet.markercluster-src.js.map +1 -0
  133. package/lib/openseadragon.min.js +6 -6
  134. package/package.json +56 -81
  135. package/pb-elements.json +716 -249
  136. package/rollup.config.mjs +312 -0
  137. package/src/assets/components.css +5 -5
  138. package/src/assets/design-system.css +607 -0
  139. package/src/authority/airtable.js +20 -21
  140. package/src/authority/anton.js +129 -129
  141. package/src/authority/custom.js +70 -27
  142. package/src/authority/geonames.js +38 -32
  143. package/src/authority/gnd.js +50 -42
  144. package/src/authority/kbga.js +136 -134
  145. package/src/authority/metagrid.js +44 -46
  146. package/src/authority/reconciliation.js +66 -68
  147. package/src/authority/registry.js +4 -4
  148. package/src/docs/demo-utils.js +91 -0
  149. package/src/docs/pb-component-docs.js +287 -147
  150. package/src/docs/pb-component-view.js +380 -273
  151. package/src/docs/pb-components-list.js +115 -51
  152. package/src/docs/pb-demo-snippet.js +199 -174
  153. package/src/dts-client.js +306 -303
  154. package/src/dts-select-endpoint.js +125 -85
  155. package/src/parse-date-service.js +184 -135
  156. package/src/pb-ajax.js +175 -173
  157. package/src/pb-authority-lookup.js +198 -158
  158. package/src/pb-autocomplete.js +731 -313
  159. package/src/pb-blacklab-highlight.js +266 -260
  160. package/src/pb-blacklab-results.js +230 -225
  161. package/src/pb-browse-docs.js +601 -484
  162. package/src/pb-browse.js +68 -65
  163. package/src/pb-clipboard.js +97 -76
  164. package/src/pb-code-editor.js +111 -103
  165. package/src/pb-code-highlight.js +234 -204
  166. package/src/pb-codepen.js +81 -73
  167. package/src/pb-collapse.js +265 -152
  168. package/src/pb-combo-box.js +191 -191
  169. package/src/pb-components-bundle.js +1 -7
  170. package/src/pb-components.js +2 -6
  171. package/src/pb-custom-form.js +230 -141
  172. package/src/pb-dialog.js +99 -63
  173. package/src/pb-document.js +118 -91
  174. package/src/pb-download.js +214 -198
  175. package/src/pb-drawer.js +146 -149
  176. package/src/pb-edit-app.js +471 -240
  177. package/src/pb-edit-xml.js +101 -98
  178. package/src/pb-events.js +126 -107
  179. package/src/pb-facs-link.js +130 -101
  180. package/src/pb-facsimile.js +494 -410
  181. package/src/pb-fetch.js +389 -0
  182. package/src/pb-formula.js +152 -154
  183. package/src/pb-geolocation.js +130 -132
  184. package/src/pb-grid-action.js +59 -56
  185. package/src/pb-grid.js +388 -228
  186. package/src/pb-highlight.js +142 -142
  187. package/src/pb-hotkeys.js +40 -42
  188. package/src/pb-i18n.js +115 -127
  189. package/src/pb-icon-button.js +108 -0
  190. package/src/pb-icon.js +283 -0
  191. package/src/pb-image-strip.js +85 -79
  192. package/src/pb-lang.js +142 -57
  193. package/src/pb-leaflet-map.js +551 -483
  194. package/src/pb-link.js +132 -126
  195. package/src/pb-load.js +495 -428
  196. package/src/pb-login.js +303 -248
  197. package/src/pb-manage-odds.js +384 -338
  198. package/src/pb-map-icon.js +90 -90
  199. package/src/pb-map-layer.js +86 -86
  200. package/src/pb-markdown.js +107 -110
  201. package/src/pb-media-query.js +75 -73
  202. package/src/pb-mei.js +523 -303
  203. package/src/pb-message.js +144 -98
  204. package/src/pb-mixin.js +268 -265
  205. package/src/pb-navigation.js +83 -96
  206. package/src/pb-observable.js +39 -39
  207. package/src/pb-odd-editor.js +1209 -948
  208. package/src/pb-odd-elementspec-editor.js +375 -310
  209. package/src/pb-odd-model-editor.js +1189 -941
  210. package/src/pb-odd-parameter-editor.js +269 -170
  211. package/src/pb-odd-rendition-editor.js +184 -131
  212. package/src/pb-page.js +451 -422
  213. package/src/pb-paginate.js +260 -178
  214. package/src/pb-panel.js +217 -183
  215. package/src/pb-popover-themes.js +16 -9
  216. package/src/pb-popover.js +297 -288
  217. package/src/pb-print-preview.js +128 -128
  218. package/src/pb-progress.js +52 -52
  219. package/src/pb-repeat.js +141 -108
  220. package/src/pb-restricted.js +85 -78
  221. package/src/pb-search.js +258 -230
  222. package/src/pb-select-feature.js +210 -126
  223. package/src/pb-select-odd.js +184 -118
  224. package/src/pb-select-template.js +113 -78
  225. package/src/pb-select.js +330 -229
  226. package/src/pb-split-list.js +181 -176
  227. package/src/pb-svg.js +81 -80
  228. package/src/pb-table-column.js +55 -55
  229. package/src/pb-table-grid.js +334 -205
  230. package/src/pb-tabs.js +238 -61
  231. package/src/pb-tify.js +3331 -126
  232. package/src/pb-timeline.js +394 -255
  233. package/src/pb-toggle-feature.js +196 -188
  234. package/src/pb-upload.js +201 -176
  235. package/src/pb-version.js +22 -34
  236. package/src/pb-view-annotate.js +138 -102
  237. package/src/pb-view.js +1722 -1272
  238. package/src/pb-zoom.js +144 -46
  239. package/src/search-result-service.js +256 -223
  240. package/src/seed-element.js +14 -22
  241. package/src/settings.js +4 -4
  242. package/src/theming.js +98 -91
  243. package/src/urls.js +403 -289
  244. package/src/utils.js +53 -51
  245. package/vite.config.js +86 -0
  246. package/.github/workflows/main.yml +0 -24
  247. package/.github/workflows/release.js.yml +0 -34
  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,12 +1,13 @@
1
- import { LitElement, html, css } from 'lit-element';
1
+ import { LitElement, html, css } from 'lit';
2
2
  import { pbMixin, waitOnce } from './pb-mixin.js';
3
+ import './pb-icon-button.js';
3
4
 
4
5
  /**
5
6
  * This component queries the blacklab API of TEI-Publisher for a list of text matches
6
7
  * in a given document. The query is given as a CQL querystring (see pattern property).
7
8
  *
8
- * **Note**: There's no demo for this component yet as it would need a blacklab instance.
9
- *
9
+ * **Note**: There's no demo for this component yet as it would need a blacklab instance.
10
+ *
10
11
  * The component displays 2 navigation buttons to jump to previous / next match and
11
12
  * a display of the current index and total number of matches.
12
13
  *
@@ -30,298 +31,303 @@ import { pbMixin, waitOnce } from './pb-mixin.js';
30
31
  *
31
32
  */
32
33
  export class PbBlacklabHighlight extends pbMixin(LitElement) {
33
- static get properties() {
34
- return {
35
- ...super.properties,
36
- /**
37
- * one-based index of the current highlight
38
- */
39
- current: {
40
- type: Number
41
- },
42
- /**
43
- * the id of the view for which highlights shall be displayed
44
- */
45
- view: {
46
- type: String
47
- },
48
- /**
49
- * CQL search pattern send to the Blacklab API
50
- */
51
- pattern: {
52
- type: String
53
- },
54
- /**
55
- * optional match parameter on the URL. If present page will display appropriate hit
56
- */
57
- match: {
58
- type: String
59
- },
60
- /**
61
- * the document id
62
- */
63
- docid: {
64
- type: String
65
- },
66
- /**
67
- * holds the results of querying the 'api/blacklab/doc' endpoint
68
- */
69
- hits: {
70
- type: Array
71
- },
72
- /**
73
- * contains full response after successful loading
74
- */
75
- kwicData: {
76
- type: Object
77
- },
78
- /**
79
- * optional: may hold id of match element to be highlighted
80
- */
81
- matchParam: {
82
- type: String
83
- },
84
- /**
85
- * the pageId to display
86
- */
87
- pageId: {
88
- type: String
89
- },
90
- /**
91
- * how many hits shall be loaded. Defaults to 100. This value is passed to the blacklab API
92
- */
93
- perDocument: {
94
- type: Number,
95
- attribute: 'per-document'
96
- }
97
- };
98
- }
99
-
100
- connectedCallback() {
101
- super.connectedCallback();
102
- this.current = 1;
103
- this.perDocument = 100;
104
- this.hits = [];
105
- this.kwicData = {};
106
-
107
- /*
108
- * waiting for the page to be ready before storing a reference to the shadowDOM of the view element this
109
- * component is attached to via the 'view' attribute.
110
- */
111
- waitOnce('pb-page-ready', () => {
112
- this.viewElement = document.getElementById(this.view);
113
- if (!this.viewElement) {
114
- console.error(`${this}: view element with id ${this.view} does not exist`);
115
- return;
116
- }
117
- this.shadow = this.viewElement.shadowRoot;
118
- });
34
+ static get properties() {
35
+ return {
36
+ ...super.properties,
37
+ /**
38
+ * one-based index of the current highlight
39
+ */
40
+ current: {
41
+ type: Number,
42
+ },
43
+ /**
44
+ * the id of the view for which highlights shall be displayed
45
+ */
46
+ view: {
47
+ type: String,
48
+ },
49
+ /**
50
+ * CQL search pattern send to the Blacklab API
51
+ */
52
+ pattern: {
53
+ type: String,
54
+ },
55
+ /**
56
+ * optional match parameter on the URL. If present page will display appropriate hit
57
+ */
58
+ match: {
59
+ type: String,
60
+ },
61
+ /**
62
+ * the document id
63
+ */
64
+ docid: {
65
+ type: String,
66
+ },
67
+ /**
68
+ * holds the results of querying the 'api/blacklab/doc' endpoint
69
+ */
70
+ hits: {
71
+ type: Array,
72
+ },
73
+ /**
74
+ * contains full response after successful loading
75
+ */
76
+ kwicData: {
77
+ type: Object,
78
+ },
79
+ /**
80
+ * optional: may hold id of match element to be highlighted
81
+ */
82
+ matchParam: {
83
+ type: String,
84
+ },
85
+ /**
86
+ * the pageId to display
87
+ */
88
+ pageId: {
89
+ type: String,
90
+ },
91
+ /**
92
+ * how many hits shall be loaded. Defaults to 100. This value is passed to the blacklab API
93
+ */
94
+ perDocument: {
95
+ type: Number,
96
+ attribute: 'per-document',
97
+ },
98
+ };
99
+ }
119
100
 
120
- this.subscribeTo('pb-update', () => {
121
- this._loadDocResults();
122
- });
123
- this.subscribeTo('pb-refresh', (ev) => {
124
- this.dynMatch = ev.detail.match;
125
- });
126
- }
127
-
128
- render() {
129
- return html`
130
- ${this.hits.length !== 0
131
- ? html`
132
- <section class="kwic-display">
133
- <paper-icon-button icon="icons:arrow-back" @click="${this._handlePrev}" ?disabled="${this.current === 1}"></paper-icon-button>
134
- <span class="current">${this.current}</span> / <span class="counter">${this.count}</span>
135
- <paper-icon-button icon="icons:arrow-forward" @click="${this._handleNext}" ?disabled="${this.current === this.hits.length}"></paper-icon-button>
136
- </section>` : ''
137
- }
138
- `;
139
- }
101
+ connectedCallback() {
102
+ super.connectedCallback();
103
+ this.current = 1;
104
+ this.perDocument = 100;
105
+ this.hits = [];
106
+ this.kwicData = {};
140
107
 
141
- /**
142
- * loads matches from blacklab API, marks matches with CSS classes and displays the current match.
143
- *
144
- * The URL query params are used to set params for blacklab API
145
- *
146
- * @returns {Promise<void>}
147
- * @private
108
+ /*
109
+ * waiting for the page to be ready before storing a reference to the shadowDOM of the view element this
110
+ * component is attached to via the 'view' attribute.
148
111
  */
149
- async _loadDocResults() {
150
- // console.log('endpoint for loading kwic matches', this.getEndpoint());
151
- if (!this.getEndpoint()) return;
112
+ waitOnce('pb-page-ready', () => {
113
+ this.viewElement = document.getElementById(this.view);
114
+ if (!this.viewElement) {
115
+ console.error(`${this}: view element with id ${this.view} does not exist`);
116
+ return;
117
+ }
118
+ this.shadow = this.viewElement.shadowRoot;
119
+ });
152
120
 
153
- const params = new URLSearchParams(window.location.search);
154
- this.pattern = params.get('pattern');
121
+ this.subscribeTo('pb-update', () => {
122
+ this._loadDocResults();
123
+ });
124
+ this.subscribeTo('pb-refresh', ev => {
125
+ this.dynMatch = ev.detail.match;
126
+ });
127
+ }
155
128
 
156
- /*
157
- * a dynMatch exists when the reloading was triggered by an nav action (prev/next)
158
- * the match param will be passed by the respective nav handler
159
- */
160
- if(this.dynMatch){
161
- this.matchParam = this.dynMatch;
162
- }else{
163
- this.matchParam = params.get('match');
164
- }
165
- this.pageId = params.get('id');
166
- this.docId = params.get('doc');
129
+ render() {
130
+ return html`
131
+ ${this.hits.length !== 0
132
+ ? html` <section class="kwic-display">
133
+ <pb-icon-button
134
+ icon="icons:arrow-back"
135
+ @click="${this._handlePrev}"
136
+ ?disabled="${this.current === 1}"
137
+ ></pb-icon-button>
138
+ <span class="current">${this.current}</span> /
139
+ <span class="counter">${this.count}</span>
140
+ <pb-icon-button
141
+ icon="icons:arrow-forward"
142
+ @click="${this._handleNext}"
143
+ ?disabled="${this.current === this.hits.length}"
144
+ ></pb-icon-button>
145
+ </section>`
146
+ : ''}
147
+ `;
148
+ }
167
149
 
168
- const url = `${this.getEndpoint()}/api/blacklab/doc?pattern=${this.pattern}&doc=${this.docId}&per-document=${this.perDocument}&format=json`;
169
- await fetch(url, {
170
- method: 'GET',
171
- mode: 'cors',
172
- credentials: 'same-origin'
173
- })
174
- .then((response) => response.json())
175
- .then((data) => {
176
- this.kwicData = data;
177
- })
178
- .then(() => {
179
- this._markAllMatches();
180
- this._showMatch(this.matchParam);
181
- })
182
- .catch((error) => {
183
- console.error('Error retrieving remote content: ', error);
184
- });
185
- }
150
+ /**
151
+ * loads matches from blacklab API, marks matches with CSS classes and displays the current match.
152
+ *
153
+ * The URL query params are used to set params for blacklab API
154
+ *
155
+ * @returns {Promise<void>}
156
+ * @private
157
+ */
158
+ async _loadDocResults() {
159
+ // console.log('endpoint for loading kwic matches', this.getEndpoint());
160
+ if (!this.getEndpoint()) return;
186
161
 
187
- _markAllMatches() {
188
- const docs = this.kwicData.documents;
189
- this.count = this.kwicData.hits;
190
- this.hits = docs[Object.keys(docs)[0]].hits; // 'jump over' docPid
191
- if (Array.isArray(this.hits)) {
192
- this.hits.forEach((hit) => {
193
- const startId = hit.match.words[0];
194
- const endId = hit.match.words[1];
195
- this._addMarkerClasses(startId, endId);
196
- });
197
- }else{
198
- // ### it's just a single hit and we get object instead of array
199
- const startId = this.hits.match.words[0];
200
- const endId = this.hits.match.words[1];
201
- this._addMarkerClasses(startId, endId);
202
- // this._scrollTo(startId, endId);
203
- }
204
- this.requestUpdate();
162
+ const params = new URLSearchParams(window.location.search);
163
+ this.pattern = params.get('pattern');
164
+
165
+ /*
166
+ * a dynMatch exists when the reloading was triggered by an nav action (prev/next)
167
+ * the match param will be passed by the respective nav handler
168
+ */
169
+ if (this.dynMatch) {
170
+ this.matchParam = this.dynMatch;
171
+ } else {
172
+ this.matchParam = params.get('match');
205
173
  }
174
+ this.pageId = params.get('id');
175
+ this.docId = params.get('doc');
206
176
 
177
+ const url = `${this.getEndpoint()}/api/blacklab/doc?pattern=${this.pattern}&doc=${
178
+ this.docId
179
+ }&per-document=${this.perDocument}&format=json`;
180
+ await fetch(url, {
181
+ method: 'GET',
182
+ mode: 'cors',
183
+ credentials: 'same-origin',
184
+ })
185
+ .then(response => response.json())
186
+ .then(data => {
187
+ this.kwicData = data;
188
+ })
189
+ .then(() => {
190
+ this._markAllMatches();
191
+ this._showMatch(this.matchParam);
192
+ })
193
+ .catch(error => {
194
+ console.error('Error retrieving remote content: ', error);
195
+ });
196
+ }
207
197
 
208
- _showMatch(matchId){
209
- const matchObj = this._getMatchObject(matchId);
210
- this._navigateToMatch(matchObj);
198
+ _markAllMatches() {
199
+ const docs = this.kwicData.documents;
200
+ this.count = this.kwicData.hits;
201
+ this.hits = docs[Object.keys(docs)[0]].hits; // 'jump over' docPid
202
+ if (Array.isArray(this.hits)) {
203
+ this.hits.forEach(hit => {
204
+ const startId = hit.match.words[0];
205
+ const endId = hit.match.words[1];
206
+ this._addMarkerClasses(startId, endId);
207
+ });
208
+ } else {
209
+ // ### it's just a single hit and we get object instead of array
210
+ const startId = this.hits.match.words[0];
211
+ const endId = this.hits.match.words[1];
212
+ this._addMarkerClasses(startId, endId);
213
+ // this._scrollTo(startId, endId);
211
214
  }
215
+ this.requestUpdate();
216
+ }
212
217
 
213
- /**
214
- * If a match id is given it will be looked up in the loaded data and returned.
215
- *
216
- * If no match is given the first match in the response will be used.
217
- *
218
- * @param match
219
- * @returns {[]|*}
220
- * @private
221
- */
222
- _getMatchObject(match){
223
- // ### if there's no match param passed in from url return the appropriate object representing current match
224
- if(!match){
225
- if(Array.isArray(this.hits)){
226
- // return this.hits[0];
227
- return this.hits[this.current - 1];
228
- }
229
- return this.hits;
230
- }
218
+ _showMatch(matchId) {
219
+ const matchObj = this._getMatchObject(matchId);
220
+ this._navigateToMatch(matchObj);
221
+ }
231
222
 
232
- if(Array.isArray(this.hits)){
233
- const targetHit = this.hits.find(hit => hit.match.words[0] === match);
234
- this.current = this.hits.findIndex(hit => hit === targetHit) + 1 ;
235
- return targetHit;
236
- }
237
- this.current=1;
238
- return this.hits;
223
+ /**
224
+ * If a match id is given it will be looked up in the loaded data and returned.
225
+ *
226
+ * If no match is given the first match in the response will be used.
227
+ *
228
+ * @param match
229
+ * @returns {[]|*}
230
+ * @private
231
+ */
232
+ _getMatchObject(match) {
233
+ // ### if there's no match param passed in from url return the appropriate object representing current match
234
+ if (!match) {
235
+ if (Array.isArray(this.hits)) {
236
+ // return this.hits[0];
237
+ return this.hits[this.current - 1];
238
+ }
239
+ return this.hits;
239
240
  }
240
241
 
241
- _navigateToMatch(matchObj){
242
- const matchPage = matchObj.page[0];
243
- const matchId = matchObj.match.words[0];
244
- const newUrl = `${this._endpoint}/${this.docId}.xml?doc=${this.docId}&pattern=${this.pattern}&match=${matchObj.match.words[0]}&id=${matchPage}`;
245
- if(this.pageId !== matchPage){
246
- this.emitTo('pb-refresh', {id: matchPage, match:matchId});
247
- }else{
248
- this._highlight(matchObj);
249
- window.history.replaceState({},'',newUrl);
250
- }
242
+ if (Array.isArray(this.hits)) {
243
+ const targetHit = this.hits.find(hit => hit.match.words[0] === match);
244
+ this.current = this.hits.findIndex(hit => hit === targetHit) + 1;
245
+ return targetHit;
251
246
  }
247
+ this.current = 1;
248
+ return this.hits;
249
+ }
252
250
 
253
- _highlight(matchObj){
254
- this._resetCurrentMarker();
255
-
256
- const startid = matchObj.match.words[0];
257
- const endid = matchObj.match.words[1];
258
- const startElem = this.shadow.querySelector(`#${startid}`);
259
- if (startElem) {
260
- startElem.parentNode.classList.add('kwic-current');
261
- }
262
- const endElem = this.shadow.querySelector(`#${endid}`);
263
- if (endElem) {
264
- endElem.parentNode.classList.add('kwic-current');
265
- }
266
- startElem.scrollIntoView({block: "center", inline: "nearest"});
267
-
251
+ _navigateToMatch(matchObj) {
252
+ const matchPage = matchObj.page[0];
253
+ const matchId = matchObj.match.words[0];
254
+ const newUrl = `${this._endpoint}/${this.docId}.xml?doc=${this.docId}&pattern=${this.pattern}&match=${matchObj.match.words[0]}&id=${matchPage}`;
255
+ if (this.pageId !== matchPage) {
256
+ this.emitTo('pb-refresh', { id: matchPage, match: matchId });
257
+ } else {
258
+ this._highlight(matchObj);
259
+ window.history.replaceState({}, '', newUrl);
268
260
  }
261
+ }
269
262
 
263
+ _highlight(matchObj) {
264
+ this._resetCurrentMarker();
270
265
 
271
- _resetCurrentMarker() {
272
- const old = this.shadow.querySelectorAll('.kwic-current');
273
- Array.from(old).forEach(elem => {
274
- elem.classList.remove('kwic-current');
275
- });
266
+ const startid = matchObj.match.words[0];
267
+ const endid = matchObj.match.words[1];
268
+ const startElem = this.shadow.querySelector(`#${startid}`);
269
+ if (startElem) {
270
+ startElem.parentNode.classList.add('kwic-current');
276
271
  }
277
-
278
- _addMarkerClasses(startId, endId) {
279
- const start = this.shadow.querySelector(`#${startId}`);
280
- if (!start) {
281
- return;
282
- }
283
- start.parentNode.classList.add('kwic-start');
284
-
285
- const end = this.shadow.getElementById(endId);
286
- if (end) {
287
- end.parentNode.classList.add('kwic-end');
288
- }else{
289
- start.classList.add('kwic-end');
290
- }
272
+ const endElem = this.shadow.querySelector(`#${endid}`);
273
+ if (endElem) {
274
+ endElem.parentNode.classList.add('kwic-current');
291
275
  }
276
+ startElem.scrollIntoView({ block: 'center', inline: 'nearest' });
277
+ }
278
+
279
+ _resetCurrentMarker() {
280
+ const old = this.shadow.querySelectorAll('.kwic-current');
281
+ Array.from(old).forEach(elem => {
282
+ elem.classList.remove('kwic-current');
283
+ });
284
+ }
292
285
 
293
- _handlePrev() {
294
- this.current -= 1;
295
- const prevMatchObj = this.hits[this.current - 1];
296
- this._navigateToMatch(prevMatchObj);
286
+ _addMarkerClasses(startId, endId) {
287
+ const start = this.shadow.querySelector(`#${startId}`);
288
+ if (!start) {
289
+ return;
297
290
  }
291
+ start.parentNode.classList.add('kwic-start');
298
292
 
299
- _handleNext() {
300
- const nextMatchObj = this.hits[this.current];
301
- this._navigateToMatch(nextMatchObj);
302
- this.current += 1;
293
+ const end = this.shadow.getElementById(endId);
294
+ if (end) {
295
+ end.parentNode.classList.add('kwic-end');
296
+ } else {
297
+ start.classList.add('kwic-end');
303
298
  }
299
+ }
304
300
 
301
+ _handlePrev() {
302
+ this.current -= 1;
303
+ const prevMatchObj = this.hits[this.current - 1];
304
+ this._navigateToMatch(prevMatchObj);
305
+ }
305
306
 
306
- static get styles() {
307
- return css`
308
- :host {
309
- display: block;
310
- }
311
- .counter, .current{
312
- padding:0 0.5rem;
313
- }
307
+ _handleNext() {
308
+ const nextMatchObj = this.hits[this.current];
309
+ this._navigateToMatch(nextMatchObj);
310
+ this.current += 1;
311
+ }
314
312
 
315
- `;
316
- }
313
+ static get styles() {
314
+ return css`
315
+ :host {
316
+ display: block;
317
+ }
318
+ .counter,
319
+ .current {
320
+ padding: 0 0.5rem;
321
+ }
322
+ `;
323
+ }
317
324
 
318
- /*
325
+ /*
319
326
  _handleClear(ev) {
320
327
  ev.preventDefault();
321
328
  localStorage.removeItem('pb-kwic-doc-matches');
322
329
  }
323
330
  */
324
-
325
331
  }
326
332
 
327
333
  customElements.define('pb-blacklab-highlight', PbBlacklabHighlight);