@teipublisher/pb-components 2.26.1-next.2 → 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.
- package/.github/workflows/docker-cypress.yml +54 -0
- package/.github/workflows/main.yml +6 -4
- package/.github/workflows/node.js.yml +56 -21
- package/.github/workflows/release.js.yml +19 -17
- package/.releaserc.json +1 -1
- package/CHANGELOG.md +351 -9
- 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/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-6e4cee3a.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 -40
- package/src/polymer-hack.js +0 -6
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { LitElement, html, css } from 'lit
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
154
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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
|
-
|
|
279
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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);
|