ogm-viewer 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/{index-CVTUnaNg.js → index-mu9UK_Fb.js} +66 -3
- package/dist/cjs/{lerc-TQEssgMv.js → lerc-Df0hDWkS.js} +7 -7
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/{ogm-image.ogm-map.ogm-menubar.ogm-metadata.ogm-settings.ogm-sidebar.ogm-viewer-ifPxRNEo.js → ogm-alerts.ogm-attributes.ogm-image.ogm-map.ogm-menubar.ogm-metadata.ogm-preview.ogm-previews.ogm-settings.ogm-sidebar.ogm-viewer-DMEfXquS.js} +13843 -6976
- package/dist/cjs/ogm-alerts_11.cjs.entry.js +18 -0
- package/dist/cjs/ogm-viewer.cjs.js +2 -2
- package/dist/collection/assets/icons/exclamation-triangle-fill.svg +3 -0
- package/dist/collection/assets/webawesome/styles/color/palettes/base.css +44 -0
- package/dist/collection/assets/webawesome/styles/color/palettes/bright.css +145 -0
- package/dist/collection/assets/webawesome/styles/color/palettes/default.css +146 -0
- package/dist/collection/assets/webawesome/styles/color/palettes/shoelace.css +146 -0
- package/dist/collection/assets/webawesome/styles/color/variants/brand.css +162 -0
- package/dist/collection/assets/webawesome/styles/color/variants/danger.css +162 -0
- package/dist/collection/assets/webawesome/styles/color/variants/neutral.css +162 -0
- package/dist/collection/assets/webawesome/styles/color/variants/success.css +162 -0
- package/dist/collection/assets/webawesome/styles/color/variants/warning.css +162 -0
- package/dist/collection/assets/webawesome/styles/color/variants.css +5 -0
- package/dist/collection/assets/webawesome/styles/component/form-control.styles.d.ts +2 -0
- package/dist/collection/assets/webawesome/styles/component/form-control.styles.ts +43 -0
- package/dist/collection/assets/webawesome/styles/component/host.styles.d.ts +2 -0
- package/dist/collection/assets/webawesome/styles/component/host.styles.ts +18 -0
- package/dist/collection/assets/webawesome/styles/component/segmented-field.styles.d.ts +19 -0
- package/dist/collection/assets/webawesome/styles/component/segmented-field.styles.ts +92 -0
- package/dist/collection/assets/webawesome/styles/component/size.styles.d.ts +2 -0
- package/dist/collection/assets/webawesome/styles/component/size.styles.ts +26 -0
- package/dist/collection/assets/webawesome/styles/component/variants.styles.d.ts +2 -0
- package/dist/collection/assets/webawesome/styles/component/variants.styles.ts +69 -0
- package/dist/collection/assets/webawesome/styles/component/visually-hidden.styles.d.ts +2 -0
- package/dist/collection/assets/webawesome/styles/component/visually-hidden.styles.ts +19 -0
- package/dist/collection/assets/webawesome/styles/layers.css +21 -0
- package/dist/collection/assets/webawesome/styles/native.css +1439 -0
- package/dist/collection/assets/webawesome/styles/themes/awesome.css +614 -0
- package/dist/collection/assets/webawesome/styles/themes/default.css +373 -0
- package/dist/collection/assets/webawesome/styles/themes/shoelace.css +648 -0
- package/dist/collection/assets/webawesome/styles/utilities/align-items.css +44 -0
- package/dist/collection/assets/webawesome/styles/utilities/border-radius.css +20 -0
- package/dist/collection/assets/webawesome/styles/utilities/flex-wrap.css +16 -0
- package/dist/collection/assets/webawesome/styles/utilities/fouce.css +17 -0
- package/dist/collection/assets/webawesome/styles/utilities/gap.css +56 -0
- package/dist/collection/assets/webawesome/styles/utilities/justify-content.css +32 -0
- package/dist/collection/assets/webawesome/styles/utilities/layout.css +159 -0
- package/dist/collection/assets/webawesome/styles/utilities/placeholder.css +9 -0
- package/dist/collection/assets/webawesome/styles/utilities/prose.css +161 -0
- package/dist/collection/assets/webawesome/styles/utilities/scroll-lock.css +20 -0
- package/dist/collection/assets/webawesome/styles/utilities/size.css +21 -0
- package/dist/collection/assets/webawesome/styles/utilities/text.css +262 -0
- package/dist/collection/assets/webawesome/styles/utilities/variants.css +62 -0
- package/dist/collection/assets/webawesome/styles/utilities/visually-hidden.css +17 -0
- package/dist/collection/assets/webawesome/styles/utilities.css +17 -0
- package/dist/collection/assets/webawesome/styles/webawesome.css +11 -0
- package/dist/collection/collection-manifest.json +4 -0
- package/dist/collection/components/ogm-alerts/ogm-alerts.css +51 -0
- package/dist/collection/components/ogm-alerts/ogm-alerts.js +71 -0
- package/dist/collection/components/ogm-alerts/ogm-alerts.test.js +26 -0
- package/dist/collection/components/ogm-attributes/ogm-attributes.css +68 -0
- package/dist/collection/components/ogm-attributes/ogm-attributes.js +112 -0
- package/dist/collection/components/ogm-image/ogm-image.css +1 -1
- package/dist/collection/components/ogm-image/ogm-image.js +70 -20
- package/dist/collection/components/ogm-map/ogm-map.css +43 -44
- package/dist/collection/components/ogm-map/ogm-map.js +229 -91
- package/dist/collection/components/ogm-menubar/ogm-menubar.css +16 -14
- package/dist/collection/components/ogm-menubar/ogm-menubar.js +3 -5
- package/dist/collection/components/ogm-menubar/ogm-menubar.test.js +28 -3
- package/dist/collection/components/ogm-metadata/ogm-metadata.css +6 -492
- package/dist/collection/components/ogm-metadata/ogm-metadata.js +3 -5
- package/dist/collection/components/ogm-metadata/ogm-metadata.test.js +1 -1
- package/dist/collection/components/ogm-preview/ogm-preview.css +16 -0
- package/dist/collection/components/ogm-preview/ogm-preview.js +144 -0
- package/dist/collection/components/ogm-preview/ogm-preview.test.js +37 -0
- package/dist/collection/components/ogm-previews/ogm-previews.css +45 -0
- package/dist/collection/components/ogm-previews/ogm-previews.js +162 -0
- package/dist/collection/components/ogm-previews/ogm-previews.test.js +83 -0
- package/dist/collection/components/ogm-settings/ogm-settings.js +7 -9
- package/dist/collection/components/ogm-sidebar/ogm-sidebar.css +50 -503
- package/dist/collection/components/ogm-sidebar/ogm-sidebar.js +8 -12
- package/dist/collection/components/ogm-viewer/ogm-viewer.css +4 -974
- package/dist/collection/components/ogm-viewer/ogm-viewer.js +69 -32
- package/dist/collection/lib/errors.js +137 -0
- package/dist/collection/lib/errors.test.js +96 -0
- package/dist/collection/lib/previewers/cog-deck.js +14 -9
- package/dist/collection/lib/previewers/cog.js +3 -3
- package/dist/collection/lib/previewers/geojson.js +3 -2
- package/dist/collection/lib/previewers/maplibre.js +9 -15
- package/dist/collection/lib/previewers/pmtiles-raster.js +1 -1
- package/dist/collection/lib/previewers/pmtiles-vector.js +7 -1
- package/dist/collection/lib/previewers/raster.js +1 -1
- package/dist/collection/lib/previewers/vector.js +65 -30
- package/dist/collection/lib/previewers/wms.js +1 -1
- package/dist/collection/lib/record.js +1 -1
- package/dist/collection/lib/record.test.js +1 -1
- package/dist/collection/lib/references.js +0 -65
- package/dist/collection/lib/references.test.js +0 -150
- package/dist/collection/lib/sources/cog.js +5 -2
- package/dist/collection/lib/sources/geojson.js +9 -2
- package/dist/collection/lib/sources/iiif-manifest.js +54 -0
- package/dist/collection/lib/sources/iiif-manifest.test.js +110 -0
- package/dist/collection/lib/sources/iiif.js +11 -0
- package/dist/collection/lib/sources/maplibre.js +8 -0
- package/dist/collection/lib/sources/openindexmap.js +3 -0
- package/dist/collection/lib/sources/pmtiles.js +10 -4
- package/dist/collection/lib/sources/raster.js +3 -3
- package/dist/collection/lib/sources/source.js +26 -7
- package/dist/collection/lib/sources/tilejson.js +7 -1
- package/dist/collection/lib/sources/tms.js +3 -0
- package/dist/collection/lib/sources/vector.js +3 -3
- package/dist/collection/lib/sources/wms.js +6 -11
- package/dist/collection/lib/sources/xyz.js +3 -0
- package/dist/collection/lib/themes/maplibre.js +46 -0
- package/dist/collection/lib/themes/theme.js +23 -0
- package/dist/esm/{index-BdFT_kJa.js → index-DTLAlWKQ.js} +66 -3
- package/dist/esm/{lerc-DFDScDrO.js → lerc-CB_Jcu33.js} +2 -2
- package/dist/esm/loader.js +3 -3
- package/dist/esm/{ogm-image.ogm-map.ogm-menubar.ogm-metadata.ogm-settings.ogm-sidebar.ogm-viewer-r5w_49n3.js → ogm-alerts.ogm-attributes.ogm-image.ogm-map.ogm-menubar.ogm-metadata.ogm-preview.ogm-previews.ogm-settings.ogm-sidebar.ogm-viewer-Dlc6USWB.js} +13840 -6977
- package/dist/esm/ogm-alerts_11.entry.js +2 -0
- package/dist/esm/ogm-viewer.js +3 -3
- package/dist/ogm-viewer/assets/icons/exclamation-triangle-fill.svg +3 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/palettes/base.css +44 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/palettes/bright.css +145 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/palettes/default.css +146 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/palettes/shoelace.css +146 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/variants/brand.css +162 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/variants/danger.css +162 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/variants/neutral.css +162 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/variants/success.css +162 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/variants/warning.css +162 -0
- package/dist/ogm-viewer/assets/webawesome/styles/color/variants.css +5 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/form-control.styles.d.ts +2 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/form-control.styles.ts +43 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/host.styles.d.ts +2 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/host.styles.ts +18 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/segmented-field.styles.d.ts +19 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/segmented-field.styles.ts +92 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/size.styles.d.ts +2 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/size.styles.ts +26 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/variants.styles.d.ts +2 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/variants.styles.ts +69 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/visually-hidden.styles.d.ts +2 -0
- package/dist/ogm-viewer/assets/webawesome/styles/component/visually-hidden.styles.ts +19 -0
- package/dist/ogm-viewer/assets/webawesome/styles/layers.css +21 -0
- package/dist/ogm-viewer/assets/webawesome/styles/native.css +1439 -0
- package/dist/ogm-viewer/assets/webawesome/styles/themes/awesome.css +614 -0
- package/dist/ogm-viewer/assets/webawesome/styles/themes/default.css +373 -0
- package/dist/ogm-viewer/assets/webawesome/styles/themes/shoelace.css +648 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/align-items.css +44 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/border-radius.css +20 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/flex-wrap.css +16 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/fouce.css +17 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/gap.css +56 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/justify-content.css +32 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/layout.css +159 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/placeholder.css +9 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/prose.css +161 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/scroll-lock.css +20 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/size.css +21 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/text.css +262 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/variants.css +62 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities/visually-hidden.css +17 -0
- package/dist/ogm-viewer/assets/webawesome/styles/utilities.css +17 -0
- package/dist/ogm-viewer/assets/webawesome/styles/webawesome.css +11 -0
- package/dist/ogm-viewer/ogm-viewer.esm.js +1 -1
- package/dist/ogm-viewer/p-7936ccc9.entry.js +1 -0
- package/dist/ogm-viewer/p-CWtUrqsM.js +2822 -0
- package/dist/ogm-viewer/p-DTLAlWKQ.js +2 -0
- package/dist/ogm-viewer/{p-BeA3REDA.js → p-DqRDI3AC.js} +1 -1
- package/dist/types/components/ogm-alerts/ogm-alerts.d.ts +6 -0
- package/dist/types/components/ogm-alerts/ogm-alerts.test.d.ts +1 -0
- package/dist/types/components/ogm-attributes/ogm-attributes.d.ts +10 -0
- package/dist/types/components/ogm-image/ogm-image.d.ts +8 -3
- package/dist/types/components/ogm-map/ogm-map.d.ts +38 -14
- package/dist/types/components/ogm-menubar/ogm-menubar.d.ts +1 -1
- package/dist/types/components/ogm-metadata/ogm-metadata.d.ts +1 -1
- package/dist/types/components/ogm-preview/ogm-preview.d.ts +13 -0
- package/dist/types/components/ogm-preview/ogm-preview.test.d.ts +1 -0
- package/dist/types/components/ogm-previews/ogm-previews.d.ts +12 -0
- package/dist/types/components/ogm-previews/ogm-previews.test.d.ts +1 -0
- package/dist/types/components/ogm-settings/ogm-settings.d.ts +2 -2
- package/dist/types/components/ogm-sidebar/ogm-sidebar.d.ts +1 -1
- package/dist/types/components/ogm-viewer/ogm-viewer.d.ts +17 -14
- package/dist/types/components.d.ts +122 -18
- package/dist/types/lib/errors.d.ts +13 -0
- package/dist/types/lib/errors.test.d.ts +1 -0
- package/dist/types/lib/previewers/cog-deck.d.ts +7 -3
- package/dist/types/lib/previewers/cog.d.ts +2 -2
- package/dist/types/lib/previewers/maplibre.d.ts +7 -9
- package/dist/types/lib/previewers/pmtiles-vector.d.ts +1 -0
- package/dist/types/lib/previewers/vector.d.ts +3 -15
- package/dist/types/lib/record.d.ts +1 -1
- package/dist/types/lib/references.d.ts +0 -8
- package/dist/types/lib/sources/cog.d.ts +3 -2
- package/dist/types/lib/sources/geojson.d.ts +3 -2
- package/dist/types/lib/sources/iiif-manifest.d.ts +12 -0
- package/dist/types/lib/sources/iiif-manifest.test.d.ts +1 -0
- package/dist/types/lib/sources/iiif.d.ts +5 -0
- package/dist/types/lib/sources/maplibre.d.ts +7 -0
- package/dist/types/lib/sources/openindexmap.d.ts +1 -0
- package/dist/types/lib/sources/pmtiles.d.ts +6 -4
- package/dist/types/lib/sources/raster.d.ts +3 -3
- package/dist/types/lib/sources/source.d.ts +7 -7
- package/dist/types/lib/sources/tilejson.d.ts +3 -2
- package/dist/types/lib/sources/tms.d.ts +1 -0
- package/dist/types/lib/sources/vector.d.ts +4 -5
- package/dist/types/lib/sources/wms.d.ts +4 -3
- package/dist/types/lib/sources/xyz.d.ts +1 -0
- package/dist/types/lib/themes/maplibre.d.ts +27 -0
- package/dist/types/lib/themes/theme.d.ts +7 -0
- package/package.json +3 -2
- package/dist/cjs/ogm-image_7.cjs.entry.js +0 -14
- package/dist/collection/lib/previewers/index.js +0 -36
- package/dist/collection/lib/sources/index.js +0 -29
- package/dist/esm/ogm-image_7.entry.js +0 -2
- package/dist/ogm-viewer/p-0b81e024.entry.js +0 -1
- package/dist/ogm-viewer/p-33R3d9fV.js +0 -1950
- package/dist/ogm-viewer/p-BdFT_kJa.js +0 -2
- package/dist/types/lib/previewers/index.d.ts +0 -3
- package/dist/types/lib/sources/index.d.ts +0 -3
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { h, Host } from "@stencil/core";
|
|
2
|
+
import IIIFSource from "../../lib/sources/iiif";
|
|
3
|
+
// Wraps a single source's preview and surfaces error(s) during the preview.
|
|
4
|
+
export class OgmPreview {
|
|
5
|
+
theme;
|
|
6
|
+
source;
|
|
7
|
+
previewOpacity;
|
|
8
|
+
sidebarPadding;
|
|
9
|
+
error;
|
|
10
|
+
// A new source is a fresh load attempt, so clear any error left over from the previous one.
|
|
11
|
+
resetError() {
|
|
12
|
+
this.error = undefined;
|
|
13
|
+
}
|
|
14
|
+
// Catch the load error emitted by the child map/image and show it in place of the preview.
|
|
15
|
+
handlePreviewError(event) {
|
|
16
|
+
event.stopPropagation();
|
|
17
|
+
this.error = event.detail;
|
|
18
|
+
}
|
|
19
|
+
// IIIF sources use the image viewer; every other source type is previewed on the map.
|
|
20
|
+
renderPreview() {
|
|
21
|
+
if (this.source instanceof IIIFSource) {
|
|
22
|
+
return h("ogm-image", { theme: this.theme, source: this.source, padding: this.sidebarPadding });
|
|
23
|
+
}
|
|
24
|
+
return h("ogm-map", { "preview-opacity": this.previewOpacity, theme: this.theme, source: this.source, padding: this.sidebarPadding });
|
|
25
|
+
}
|
|
26
|
+
render() {
|
|
27
|
+
return (h(Host, { key: 'c962bdcbebdebb1abde8900b0d0811be218fca46' }, this.renderPreview(), this.error && h("ogm-alerts", { key: '87b8217bbb7d5101d9f306f2492326d3f9f92429', theme: this.theme, error: this.error })));
|
|
28
|
+
}
|
|
29
|
+
static get is() { return "ogm-preview"; }
|
|
30
|
+
static get encapsulation() { return "shadow"; }
|
|
31
|
+
static get originalStyleUrls() {
|
|
32
|
+
return {
|
|
33
|
+
"$": ["ogm-preview.css"]
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
static get styleUrls() {
|
|
37
|
+
return {
|
|
38
|
+
"$": ["ogm-preview.css"]
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
static get properties() {
|
|
42
|
+
return {
|
|
43
|
+
"theme": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"mutable": false,
|
|
46
|
+
"complexType": {
|
|
47
|
+
"original": "'light' | 'dark'",
|
|
48
|
+
"resolved": "\"dark\" | \"light\"",
|
|
49
|
+
"references": {}
|
|
50
|
+
},
|
|
51
|
+
"required": false,
|
|
52
|
+
"optional": false,
|
|
53
|
+
"docs": {
|
|
54
|
+
"tags": [],
|
|
55
|
+
"text": ""
|
|
56
|
+
},
|
|
57
|
+
"getter": false,
|
|
58
|
+
"setter": false,
|
|
59
|
+
"reflect": false,
|
|
60
|
+
"attribute": "theme"
|
|
61
|
+
},
|
|
62
|
+
"source": {
|
|
63
|
+
"type": "unknown",
|
|
64
|
+
"mutable": false,
|
|
65
|
+
"complexType": {
|
|
66
|
+
"original": "Source",
|
|
67
|
+
"resolved": "Source",
|
|
68
|
+
"references": {
|
|
69
|
+
"Source": {
|
|
70
|
+
"location": "global",
|
|
71
|
+
"id": "global::Source"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"required": false,
|
|
76
|
+
"optional": false,
|
|
77
|
+
"docs": {
|
|
78
|
+
"tags": [],
|
|
79
|
+
"text": ""
|
|
80
|
+
},
|
|
81
|
+
"getter": false,
|
|
82
|
+
"setter": false
|
|
83
|
+
},
|
|
84
|
+
"previewOpacity": {
|
|
85
|
+
"type": "number",
|
|
86
|
+
"mutable": false,
|
|
87
|
+
"complexType": {
|
|
88
|
+
"original": "number",
|
|
89
|
+
"resolved": "number",
|
|
90
|
+
"references": {}
|
|
91
|
+
},
|
|
92
|
+
"required": false,
|
|
93
|
+
"optional": false,
|
|
94
|
+
"docs": {
|
|
95
|
+
"tags": [],
|
|
96
|
+
"text": ""
|
|
97
|
+
},
|
|
98
|
+
"getter": false,
|
|
99
|
+
"setter": false,
|
|
100
|
+
"reflect": false,
|
|
101
|
+
"attribute": "preview-opacity"
|
|
102
|
+
},
|
|
103
|
+
"sidebarPadding": {
|
|
104
|
+
"type": "number",
|
|
105
|
+
"mutable": false,
|
|
106
|
+
"complexType": {
|
|
107
|
+
"original": "number",
|
|
108
|
+
"resolved": "number",
|
|
109
|
+
"references": {}
|
|
110
|
+
},
|
|
111
|
+
"required": false,
|
|
112
|
+
"optional": false,
|
|
113
|
+
"docs": {
|
|
114
|
+
"tags": [],
|
|
115
|
+
"text": ""
|
|
116
|
+
},
|
|
117
|
+
"getter": false,
|
|
118
|
+
"setter": false,
|
|
119
|
+
"reflect": false,
|
|
120
|
+
"attribute": "sidebar-padding"
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
static get states() {
|
|
125
|
+
return {
|
|
126
|
+
"error": {}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
static get watchers() {
|
|
130
|
+
return [{
|
|
131
|
+
"propName": "source",
|
|
132
|
+
"methodName": "resetError"
|
|
133
|
+
}];
|
|
134
|
+
}
|
|
135
|
+
static get listeners() {
|
|
136
|
+
return [{
|
|
137
|
+
"name": "previewError",
|
|
138
|
+
"method": "handlePreviewError",
|
|
139
|
+
"target": undefined,
|
|
140
|
+
"capture": false,
|
|
141
|
+
"passive": false
|
|
142
|
+
}];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { describe, it, expect, h, vi } from "@stencil/vitest";
|
|
2
|
+
// Render with Stencil's low-level render directly rather than @stencil/vitest's `render` wrapper: the
|
|
3
|
+
// wrapper re-throws lifecycle errors, and the <ogm-map>/<ogm-image> mounted inside a preview throw
|
|
4
|
+
// when they try to initialize WebGL/OpenSeadragon (unavailable in the test DOM).
|
|
5
|
+
import { render as stencilRender } from "@stencil/core";
|
|
6
|
+
import GeoJSONSource from "../../lib/sources/geojson";
|
|
7
|
+
import { referenceError } from "../../lib/errors";
|
|
8
|
+
// Let Stencil's RAF-based update cycle flush after a state change (mirrors the vitest waitForChanges).
|
|
9
|
+
const flush = () => new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));
|
|
10
|
+
const renderPreview = async (source) => {
|
|
11
|
+
const container = document.createElement('div');
|
|
12
|
+
document.body.appendChild(container);
|
|
13
|
+
const consoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
14
|
+
await stencilRender(h("ogm-preview", { source: source }), container);
|
|
15
|
+
const el = container.firstElementChild;
|
|
16
|
+
await el.componentOnReady?.();
|
|
17
|
+
consoleError.mockRestore();
|
|
18
|
+
return el;
|
|
19
|
+
};
|
|
20
|
+
describe('ogm-preview', () => {
|
|
21
|
+
it('renders a preview for a source', async () => {
|
|
22
|
+
const el = await renderPreview(new GeoJSONSource('id', 'http://example.com/data.json'));
|
|
23
|
+
const shadowRoot = el.shadowRoot;
|
|
24
|
+
expect(shadowRoot.querySelector('ogm-map')).not.toBeNull();
|
|
25
|
+
expect(shadowRoot.querySelector('ogm-alerts')).toBeNull();
|
|
26
|
+
});
|
|
27
|
+
it('shows the error over the preview when a previewError is reported', async () => {
|
|
28
|
+
const el = await renderPreview(new GeoJSONSource('id', 'http://example.com/data.json'));
|
|
29
|
+
const error = referenceError(new TypeError('Failed to fetch'), 'GeoJSON', 'http://example.com/data.json');
|
|
30
|
+
el.dispatchEvent(new CustomEvent('previewError', { detail: error, bubbles: true }));
|
|
31
|
+
await flush();
|
|
32
|
+
const shadowRoot = el.shadowRoot;
|
|
33
|
+
expect(shadowRoot.querySelector('ogm-alerts')).not.toBeNull();
|
|
34
|
+
// The preview stays mounted underneath so its in-flight load can finish and not leak loading state
|
|
35
|
+
expect(shadowRoot.querySelector('ogm-map')).not.toBeNull();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* Preview tabs */
|
|
2
|
+
|
|
3
|
+
:host {
|
|
4
|
+
display: block;
|
|
5
|
+
height: 100%;
|
|
6
|
+
background: var(--wa-color-surface-default);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
wa-tab-group,
|
|
10
|
+
wa-tab-group::part(base) {
|
|
11
|
+
height: 100%;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
wa-tab-group::part(body) {
|
|
15
|
+
flex: 1 1 auto;
|
|
16
|
+
min-height: 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
wa-tab-panel,
|
|
20
|
+
wa-tab-panel::part(base) {
|
|
21
|
+
height: 100%;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
wa-tab-panel::part(base) {
|
|
25
|
+
padding: 0;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Full-width tabs */
|
|
29
|
+
wa-tab {
|
|
30
|
+
flex: 1 1 0;
|
|
31
|
+
text-align: center;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
wa-tab::part(base) {
|
|
35
|
+
justify-content: center;
|
|
36
|
+
padding: 0.5em 0.75em;
|
|
37
|
+
font-size: var(--wa-font-size-s);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* ogm-preview wraps each tab's map/image; ogm-map is also rendered bare as the no-record fallback. */
|
|
41
|
+
ogm-preview,
|
|
42
|
+
ogm-map {
|
|
43
|
+
display: block;
|
|
44
|
+
height: 100%;
|
|
45
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { h, Host } from "@stencil/core";
|
|
2
|
+
import CogSource from "../../lib/sources/cog";
|
|
3
|
+
import GeoJSONSource from "../../lib/sources/geojson";
|
|
4
|
+
import OpenIndexMapSource from "../../lib/sources/openindexmap";
|
|
5
|
+
import PMTilesSource from "../../lib/sources/pmtiles";
|
|
6
|
+
import TileJSONSource from "../../lib/sources/tilejson";
|
|
7
|
+
import TMSSource from "../../lib/sources/tms";
|
|
8
|
+
import WmsSource from "../../lib/sources/wms";
|
|
9
|
+
import XYZSource from "../../lib/sources/xyz";
|
|
10
|
+
import IIIFSource from "../../lib/sources/iiif";
|
|
11
|
+
import IIIFManifestSource from "../../lib/sources/iiif-manifest";
|
|
12
|
+
export class OgmPreviews {
|
|
13
|
+
theme;
|
|
14
|
+
record;
|
|
15
|
+
previewOpacity;
|
|
16
|
+
sidebarPadding;
|
|
17
|
+
sources = [];
|
|
18
|
+
// @Watch only fires on changes; handle the initial load here
|
|
19
|
+
componentWillLoad() {
|
|
20
|
+
if (this.record)
|
|
21
|
+
this.getSources(this.record);
|
|
22
|
+
}
|
|
23
|
+
// Given a record, get all of the valid sources that can be used to preview it on a map
|
|
24
|
+
getSources(record) {
|
|
25
|
+
while (this.sources.length)
|
|
26
|
+
this.sources.pop();
|
|
27
|
+
const recordBounds = record.getBounds();
|
|
28
|
+
if (record.references.iiifImageUrl)
|
|
29
|
+
this.sources.push(new IIIFSource(record.id, record.references.iiifImageUrl, recordBounds));
|
|
30
|
+
if (record.references.iiifManifestUrl)
|
|
31
|
+
this.sources.push(new IIIFManifestSource(record.id, record.references.iiifManifestUrl, recordBounds));
|
|
32
|
+
if (record.references.pmtilesUrl)
|
|
33
|
+
this.sources.push(new PMTilesSource(record.id, record.references.pmtilesUrl, recordBounds));
|
|
34
|
+
if (record.references.tilejsonUrl)
|
|
35
|
+
this.sources.push(new TileJSONSource(record.id, record.references.tilejsonUrl, recordBounds));
|
|
36
|
+
if (record.references.indexMapUrl)
|
|
37
|
+
this.sources.push(new OpenIndexMapSource(record.id, record.references.indexMapUrl, recordBounds));
|
|
38
|
+
if (record.references.geojsonUrl)
|
|
39
|
+
this.sources.push(new GeoJSONSource(record.id, record.references.geojsonUrl, recordBounds));
|
|
40
|
+
if (record.references.cogUrl)
|
|
41
|
+
this.sources.push(new CogSource(record.id, record.references.cogUrl, recordBounds));
|
|
42
|
+
if (record.references.tmsUrl)
|
|
43
|
+
this.sources.push(new TMSSource(record.id, record.references.tmsUrl, recordBounds));
|
|
44
|
+
if (record.references.xyzUrl)
|
|
45
|
+
this.sources.push(new XYZSource(record.id, record.references.xyzUrl, recordBounds));
|
|
46
|
+
if (record.references.wmsUrl && record.wxsIdentifier)
|
|
47
|
+
this.sources.push(new WmsSource(record.id, record.references.wmsUrl, { layerIds: [record.wxsIdentifier] }, recordBounds));
|
|
48
|
+
}
|
|
49
|
+
// Render as tabs for switching between sources
|
|
50
|
+
render() {
|
|
51
|
+
// Render a blank map if there is no record or no sources
|
|
52
|
+
if (!this.record || !this.sources.length)
|
|
53
|
+
return h("ogm-map", { theme: this.theme, padding: this.sidebarPadding });
|
|
54
|
+
return (h(Host, { class: this.theme && `wa-${this.theme}` }, h("wa-tab-group", null, this.sources.map((source, idx) => (h("wa-tab", { key: idx, panel: `${source.constructor.name}-${source.id}-${idx}` }, source.label()))), this.sources.map((source, idx) => (h("wa-tab-panel", { key: idx, name: `${source.constructor.name}-${source.id}-${idx}`, active: idx === 0 }, h("ogm-preview", { theme: this.theme, source: source, "preview-opacity": this.previewOpacity, "sidebar-padding": this.sidebarPadding })))))));
|
|
55
|
+
}
|
|
56
|
+
static get is() { return "ogm-previews"; }
|
|
57
|
+
static get encapsulation() { return "shadow"; }
|
|
58
|
+
static get originalStyleUrls() {
|
|
59
|
+
return {
|
|
60
|
+
"$": ["ogm-previews.css"]
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
static get styleUrls() {
|
|
64
|
+
return {
|
|
65
|
+
"$": ["ogm-previews.css"]
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
static get properties() {
|
|
69
|
+
return {
|
|
70
|
+
"theme": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"mutable": false,
|
|
73
|
+
"complexType": {
|
|
74
|
+
"original": "'light' | 'dark'",
|
|
75
|
+
"resolved": "\"dark\" | \"light\"",
|
|
76
|
+
"references": {}
|
|
77
|
+
},
|
|
78
|
+
"required": false,
|
|
79
|
+
"optional": false,
|
|
80
|
+
"docs": {
|
|
81
|
+
"tags": [],
|
|
82
|
+
"text": ""
|
|
83
|
+
},
|
|
84
|
+
"getter": false,
|
|
85
|
+
"setter": false,
|
|
86
|
+
"reflect": false,
|
|
87
|
+
"attribute": "theme"
|
|
88
|
+
},
|
|
89
|
+
"record": {
|
|
90
|
+
"type": "unknown",
|
|
91
|
+
"mutable": false,
|
|
92
|
+
"complexType": {
|
|
93
|
+
"original": "OgmRecord",
|
|
94
|
+
"resolved": "OgmRecord",
|
|
95
|
+
"references": {
|
|
96
|
+
"OgmRecord": {
|
|
97
|
+
"location": "global",
|
|
98
|
+
"id": "global::OgmRecord"
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"required": false,
|
|
103
|
+
"optional": false,
|
|
104
|
+
"docs": {
|
|
105
|
+
"tags": [],
|
|
106
|
+
"text": ""
|
|
107
|
+
},
|
|
108
|
+
"getter": false,
|
|
109
|
+
"setter": false
|
|
110
|
+
},
|
|
111
|
+
"previewOpacity": {
|
|
112
|
+
"type": "number",
|
|
113
|
+
"mutable": false,
|
|
114
|
+
"complexType": {
|
|
115
|
+
"original": "number",
|
|
116
|
+
"resolved": "number",
|
|
117
|
+
"references": {}
|
|
118
|
+
},
|
|
119
|
+
"required": false,
|
|
120
|
+
"optional": false,
|
|
121
|
+
"docs": {
|
|
122
|
+
"tags": [],
|
|
123
|
+
"text": ""
|
|
124
|
+
},
|
|
125
|
+
"getter": false,
|
|
126
|
+
"setter": false,
|
|
127
|
+
"reflect": false,
|
|
128
|
+
"attribute": "preview-opacity"
|
|
129
|
+
},
|
|
130
|
+
"sidebarPadding": {
|
|
131
|
+
"type": "number",
|
|
132
|
+
"mutable": false,
|
|
133
|
+
"complexType": {
|
|
134
|
+
"original": "number",
|
|
135
|
+
"resolved": "number",
|
|
136
|
+
"references": {}
|
|
137
|
+
},
|
|
138
|
+
"required": false,
|
|
139
|
+
"optional": false,
|
|
140
|
+
"docs": {
|
|
141
|
+
"tags": [],
|
|
142
|
+
"text": ""
|
|
143
|
+
},
|
|
144
|
+
"getter": false,
|
|
145
|
+
"setter": false,
|
|
146
|
+
"reflect": false,
|
|
147
|
+
"attribute": "sidebar-padding"
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
static get states() {
|
|
152
|
+
return {
|
|
153
|
+
"sources": {}
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
static get watchers() {
|
|
157
|
+
return [{
|
|
158
|
+
"propName": "record",
|
|
159
|
+
"methodName": "getSources"
|
|
160
|
+
}];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, it, expect, h, vi } from "@stencil/vitest";
|
|
2
|
+
// Render with Stencil's low-level render directly rather than @stencil/vitest's `render` wrapper: the
|
|
3
|
+
// wrapper re-throws lifecycle errors, and the <ogm-map> mounted inside a preview panel throws when it
|
|
4
|
+
// tries to initialize WebGL (unavailable in the test DOM). Stencil's own safeCall only routes that to
|
|
5
|
+
// console.error, so stencilRender still produces the ogm-previews shadow DOM we want to assert on.
|
|
6
|
+
import { render as stencilRender } from "@stencil/core";
|
|
7
|
+
import OgmRecord from "../../lib/record";
|
|
8
|
+
// Build a minimal Aardvark record, optionally with a WMS reference that yields one previewable source
|
|
9
|
+
const buildRecord = (previewable) => new OgmRecord({
|
|
10
|
+
id: 'berkeley-s7sq63',
|
|
11
|
+
dct_title_s: 'Calaveras County Contours',
|
|
12
|
+
gbl_resourceClass_sm: ['Datasets'],
|
|
13
|
+
dct_accessRights_s: 'Public',
|
|
14
|
+
gbl_mdVersion_s: 'Aardvark',
|
|
15
|
+
...(previewable
|
|
16
|
+
? {
|
|
17
|
+
gbl_wxsIdentifier_s: 's7sq63',
|
|
18
|
+
dct_references_s: JSON.stringify({ 'http://www.opengis.net/def/serviceType/ogc/wms': 'https://example.com/geoserver/wms' }),
|
|
19
|
+
}
|
|
20
|
+
: {}),
|
|
21
|
+
});
|
|
22
|
+
const renderPreviews = async (record) => {
|
|
23
|
+
const container = document.createElement('div');
|
|
24
|
+
document.body.appendChild(container);
|
|
25
|
+
// The mounted <ogm-map> logs a swallowed WebGL init error; keep test output clean
|
|
26
|
+
const consoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
27
|
+
await stencilRender(h("ogm-previews", { record: record }), container);
|
|
28
|
+
const el = container.firstElementChild;
|
|
29
|
+
await el.componentOnReady?.();
|
|
30
|
+
consoleError.mockRestore();
|
|
31
|
+
return el.shadowRoot;
|
|
32
|
+
};
|
|
33
|
+
// Let Stencil's RAF-based update cycle flush so the nested <ogm-preview> renders its own shadow DOM.
|
|
34
|
+
const flush = () => new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));
|
|
35
|
+
// Render previews and drill into the single <ogm-preview> to see which preview (map or image) it
|
|
36
|
+
// chose. Going through <ogm-previews> means the source is constructed in the built component's module
|
|
37
|
+
// realm, so <ogm-preview>'s `instanceof IIIFSource` check holds (unlike a source built in the test).
|
|
38
|
+
const renderPreviewChild = async (record) => {
|
|
39
|
+
const container = document.createElement('div');
|
|
40
|
+
document.body.appendChild(container);
|
|
41
|
+
const consoleError = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
42
|
+
await stencilRender(h("ogm-previews", { record: record }), container);
|
|
43
|
+
const el = container.firstElementChild;
|
|
44
|
+
await el.componentOnReady?.();
|
|
45
|
+
const preview = el.shadowRoot.querySelector('ogm-preview');
|
|
46
|
+
await preview?.componentOnReady?.();
|
|
47
|
+
await flush();
|
|
48
|
+
consoleError.mockRestore();
|
|
49
|
+
return preview.shadowRoot;
|
|
50
|
+
};
|
|
51
|
+
// A minimal Aardvark record whose only reference is the given previewable one
|
|
52
|
+
const buildRecordWith = (references) => new OgmRecord({
|
|
53
|
+
id: 'test-record',
|
|
54
|
+
dct_title_s: 'Test Record',
|
|
55
|
+
gbl_resourceClass_sm: ['Datasets'],
|
|
56
|
+
dct_accessRights_s: 'Public',
|
|
57
|
+
gbl_mdVersion_s: 'Aardvark',
|
|
58
|
+
dct_references_s: JSON.stringify(references),
|
|
59
|
+
});
|
|
60
|
+
describe('ogm-previews', () => {
|
|
61
|
+
it('renders a tab for a record supplied at initial render', async () => {
|
|
62
|
+
const shadowRoot = await renderPreviews(buildRecord(true));
|
|
63
|
+
const tabs = shadowRoot.querySelectorAll('wa-tab');
|
|
64
|
+
expect(shadowRoot.querySelector('wa-tab-group')).not.toBeNull();
|
|
65
|
+
expect(tabs).toHaveLength(1);
|
|
66
|
+
expect(tabs[0].textContent).toContain('WMS');
|
|
67
|
+
});
|
|
68
|
+
it('falls back to an empty map for a record with no previewable sources', async () => {
|
|
69
|
+
const shadowRoot = await renderPreviews(buildRecord(false));
|
|
70
|
+
expect(shadowRoot.querySelector('wa-tab-group')).toBeNull();
|
|
71
|
+
expect(shadowRoot.querySelector('ogm-map')).not.toBeNull();
|
|
72
|
+
});
|
|
73
|
+
it('wraps a map source in an ogm-preview that renders the map', async () => {
|
|
74
|
+
const previewShadow = await renderPreviewChild(buildRecordWith({ 'http://geojson.org/geojson-spec.html': 'https://example.com/data.json' }));
|
|
75
|
+
expect(previewShadow.querySelector('ogm-map')).not.toBeNull();
|
|
76
|
+
expect(previewShadow.querySelector('ogm-image')).toBeNull();
|
|
77
|
+
});
|
|
78
|
+
it('wraps a IIIF image source in an ogm-preview that renders the image viewer', async () => {
|
|
79
|
+
const previewShadow = await renderPreviewChild(buildRecordWith({ 'http://iiif.io/api/image': 'https://example.com/iiif/info.json' }));
|
|
80
|
+
expect(previewShadow.querySelector('ogm-image')).not.toBeNull();
|
|
81
|
+
expect(previewShadow.querySelector('ogm-map')).toBeNull();
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -4,15 +4,15 @@ export class OgmSettings {
|
|
|
4
4
|
record;
|
|
5
5
|
el;
|
|
6
6
|
opacityChange;
|
|
7
|
-
|
|
7
|
+
waSlider;
|
|
8
8
|
componentDidLoad() {
|
|
9
|
-
this.
|
|
9
|
+
this.waSlider = getElement(this.el, 'wa-slider');
|
|
10
10
|
}
|
|
11
11
|
handleOpacityChange() {
|
|
12
|
-
this.opacityChange.emit(this.
|
|
12
|
+
this.opacityChange.emit(this.waSlider.value);
|
|
13
13
|
}
|
|
14
14
|
render() {
|
|
15
|
-
return (h("div", { key: '
|
|
15
|
+
return (h("div", { key: 'e2b21549c2bb82aa80780e99bcbed78497683690', class: "settings" }, h("wa-slider", { key: 'bc45061a08522c2e227be5b422cac15fb6da04c3', disabled: !this.record || this.record.references.iiifOnly, label: "Layer opacity", min: "0", max: "100", step: "1", value: "100" })));
|
|
16
16
|
}
|
|
17
17
|
static get is() { return "ogm-settings"; }
|
|
18
18
|
static get encapsulation() { return "shadow"; }
|
|
@@ -36,10 +36,8 @@ export class OgmSettings {
|
|
|
36
36
|
"resolved": "OgmRecord",
|
|
37
37
|
"references": {
|
|
38
38
|
"OgmRecord": {
|
|
39
|
-
"location": "
|
|
40
|
-
"
|
|
41
|
-
"id": "src/lib/record.ts::OgmRecord",
|
|
42
|
-
"referenceLocation": "OgmRecord"
|
|
39
|
+
"location": "global",
|
|
40
|
+
"id": "global::OgmRecord"
|
|
43
41
|
}
|
|
44
42
|
}
|
|
45
43
|
},
|
|
@@ -75,7 +73,7 @@ export class OgmSettings {
|
|
|
75
73
|
static get elementRef() { return "el"; }
|
|
76
74
|
static get listeners() {
|
|
77
75
|
return [{
|
|
78
|
-
"name": "
|
|
76
|
+
"name": "input",
|
|
79
77
|
"method": "handleOpacityChange",
|
|
80
78
|
"target": undefined,
|
|
81
79
|
"capture": false,
|