@panoramax/web-viewer 5.0.0-develop-d7206514 → 5.0.0-develop-d26305dd
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/build/bundle.cjs +3399 -0
- package/build/bundle.cjs.map +1 -0
- package/build/bundle_photoviewer.cjs +2510 -0
- package/build/bundle_photoviewer.cjs.map +1 -0
- package/build/cjs/index.js +1 -1
- package/build/cjs/index_photoviewer.js +1 -1
- package/build/components/core/Basic.css +56 -0
- package/build/components/core/Basic.js +378 -0
- package/build/components/core/CoverageMap.css +10 -0
- package/build/components/core/CoverageMap.js +169 -0
- package/build/components/core/Editor.css +33 -0
- package/build/components/core/Editor.js +398 -0
- package/build/components/core/PhotoViewer.css +70 -0
- package/build/components/core/PhotoViewer.js +650 -0
- package/build/components/core/Viewer.css +130 -0
- package/build/components/core/Viewer.js +711 -0
- package/build/components/core/index.js +10 -0
- package/build/components/index.js +11 -0
- package/build/components/index_photoviewer.js +6 -0
- package/build/components/layout/BottomDrawer.js +258 -0
- package/build/components/layout/CorneredGrid.js +143 -0
- package/build/components/layout/Mini.js +121 -0
- package/build/components/layout/Tabs.js +140 -0
- package/build/components/layout/index.js +9 -0
- package/build/components/menus/LocationPrecisionDoc.js +42 -0
- package/build/components/menus/MapBackground.js +110 -0
- package/build/components/menus/MapFilters.js +567 -0
- package/build/components/menus/MapLayers.js +238 -0
- package/build/components/menus/MapLegend.js +68 -0
- package/build/components/menus/MiniPictureLegend.js +73 -0
- package/build/components/menus/PictureLegend.js +379 -0
- package/build/components/menus/PictureMetadata.js +380 -0
- package/build/components/menus/PlayerOptions.js +93 -0
- package/build/components/menus/QualityScoreDoc.js +42 -0
- package/build/components/menus/ReportForm.js +132 -0
- package/build/components/menus/SemanticsDoc.js +38 -0
- package/build/components/menus/SemanticsDownload.js +33 -0
- package/build/components/menus/SemanticsFilters.js +153 -0
- package/build/components/menus/SemanticsList.js +413 -0
- package/build/components/menus/SemanticsMetadata.js +368 -0
- package/build/components/menus/Share.js +105 -0
- package/build/components/menus/index.js +22 -0
- package/build/components/menus/index_photoviewer.js +11 -0
- package/build/components/styles.js +557 -0
- package/build/components/ui/AnnotationsSwitch.js +159 -0
- package/build/components/ui/Button.js +77 -0
- package/build/components/ui/ButtonGroup.css +59 -0
- package/build/components/ui/ButtonGroup.js +69 -0
- package/build/components/ui/CopyButton.js +110 -0
- package/build/components/ui/Grade.js +54 -0
- package/build/components/ui/GradeFilter.js +122 -0
- package/build/components/ui/IconSwitch.js +193 -0
- package/build/components/ui/LinkButton.js +67 -0
- package/build/components/ui/ListGroup.js +66 -0
- package/build/components/ui/ListItem.js +90 -0
- package/build/components/ui/Loader.js +203 -0
- package/build/components/ui/Map.css +63 -0
- package/build/components/ui/Map.js +853 -0
- package/build/components/ui/MapMore.js +175 -0
- package/build/components/ui/Photo.css +50 -0
- package/build/components/ui/Photo.js +1502 -0
- package/build/components/ui/Popup.js +145 -0
- package/build/components/ui/ProgressBar.js +104 -0
- package/build/components/ui/QualityScore.js +147 -0
- package/build/components/ui/SearchBar.js +374 -0
- package/build/components/ui/SemanticsEditor.js +191 -0
- package/build/components/ui/SemanticsTable.js +88 -0
- package/build/components/ui/Switch.js +139 -0
- package/build/components/ui/TogglableGroup.js +157 -0
- package/build/components/ui/index.js +29 -0
- package/build/components/ui/index_photoviewer.js +21 -0
- package/build/components/ui/widgets/CopyCoordinates.js +75 -0
- package/build/components/ui/widgets/GeoSearch.css +21 -0
- package/build/components/ui/widgets/GeoSearch.js +150 -0
- package/build/components/ui/widgets/Legend.js +190 -0
- package/build/components/ui/widgets/LevelSelect.css +51 -0
- package/build/components/ui/widgets/LevelSelect.js +143 -0
- package/build/components/ui/widgets/MapFiltersButton.js +114 -0
- package/build/components/ui/widgets/MapLayersButton.js +79 -0
- package/build/components/ui/widgets/OSMEditors.js +155 -0
- package/build/components/ui/widgets/PictureLegendActions.js +99 -0
- package/build/components/ui/widgets/Player.css +7 -0
- package/build/components/ui/widgets/Player.js +154 -0
- package/build/components/ui/widgets/SemanticsFiltersButton.js +65 -0
- package/build/components/ui/widgets/Zoom.js +84 -0
- package/build/components/ui/widgets/index.js +16 -0
- package/build/components/ui/widgets/index_photoviewer.js +7 -0
- package/build/esm/components/core/Basic.js +1 -1
- package/build/img/arrow_360.svg +14 -0
- package/build/img/arrow_flat.svg +11 -0
- package/build/img/arrow_triangle.svg +9 -0
- package/build/img/arrow_turn.svg +8 -0
- package/build/img/bg_aerial.jpg +0 -0
- package/build/img/bg_streets.jpg +0 -0
- package/build/img/loader_base.jpg +0 -0
- package/build/img/logo_dead.svg +91 -0
- package/build/img/marker.svg +17 -0
- package/build/img/marker_blue.svg +20 -0
- package/build/img/osm.svg +49 -0
- package/build/img/panoramax.svg +13 -0
- package/build/img/switch_big.svg +54 -0
- package/build/img/switch_mini.svg +48 -0
- package/build/img/wd.svg +1 -0
- package/build/index_photoviewer.js +4 -0
- package/build/package.json +148 -0
- package/build/servers.js +14 -0
- package/build/translations/ar.json +1 -0
- package/build/translations/be.json +257 -0
- package/build/translations/br.json +81 -0
- package/build/translations/cy.json +117 -0
- package/build/translations/da.json +300 -0
- package/build/translations/de.json +309 -0
- package/build/translations/en.json +294 -0
- package/build/translations/eo.json +235 -0
- package/build/translations/es.json +292 -0
- package/build/translations/fi.json +1 -0
- package/build/translations/fr.json +294 -0
- package/build/translations/hr.json +294 -0
- package/build/translations/hu.json +294 -0
- package/build/translations/it.json +306 -0
- package/build/translations/ja.json +182 -0
- package/build/translations/ko.json +1 -0
- package/build/translations/nl.json +305 -0
- package/build/translations/nn.json +1 -0
- package/build/translations/pl.json +169 -0
- package/build/translations/pt.json +296 -0
- package/build/translations/pt_BR.json +304 -0
- package/build/translations/sv.json +182 -0
- package/build/translations/ti.json +9 -0
- package/build/translations/tr.json +297 -0
- package/build/translations/uk.json +268 -0
- package/build/translations/zh_Hant.json +309 -0
- package/build/utils/API.js +928 -0
- package/build/utils/InitParameters.js +521 -0
- package/build/utils/MapStyleComposer.js +889 -0
- package/build/utils/PanoraMapProtocol.js +49 -0
- package/build/utils/PhotoAdapter.js +49 -0
- package/build/utils/PresetsManager.js +148 -0
- package/build/utils/SemanticsMapProtocol.js +144 -0
- package/build/utils/URLHandler.js +426 -0
- package/build/utils/geocoder.js +203 -0
- package/build/utils/i18n.js +128 -0
- package/build/utils/index.js +17 -0
- package/build/utils/index_photoviewer.js +14 -0
- package/build/utils/indoor.js +200 -0
- package/build/utils/map.js +788 -0
- package/build/utils/picture.js +507 -0
- package/build/utils/semantics.js +321 -0
- package/build/utils/services.js +148 -0
- package/build/utils/utils.js +433 -0
- package/build/utils/widgets.js +110 -0
- package/package.json +1 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { LitElement, css, html, nothing } from "lit";
|
|
2
|
+
import { fa, onceParentAvailable } from "../../../utils/widgets.js";
|
|
3
|
+
import { josmBboxParameters } from "../../../utils/utils.js";
|
|
4
|
+
import { IdEditorURL } from "../../../utils/services.js";
|
|
5
|
+
import {
|
|
6
|
+
faExternalLinkAlt, faLocationDot, faSatelliteDish
|
|
7
|
+
} from "@fortawesome/free-solid-svg-icons";
|
|
8
|
+
|
|
9
|
+
const JOSM_REMOTE_URL = "http://127.0.0.1:8111";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* OSM Editors component offers direct links to OpenStreetMap's iD and JOSM editors.
|
|
13
|
+
* @class Panoramax.components.ui.widgets.OSMEditors
|
|
14
|
+
* @element pnx-widget-osmeditors
|
|
15
|
+
* @extends [lit.LitElement](https://lit.dev/docs/api/LitElement/)
|
|
16
|
+
* @example
|
|
17
|
+
* ```html
|
|
18
|
+
* <pnx-widget-osmeditors _parent=${viewer} />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export default class OSMEditors extends LitElement {
|
|
22
|
+
/** @private */
|
|
23
|
+
static properties = {
|
|
24
|
+
_pic: {state: true},
|
|
25
|
+
_josm: {state: true},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** @private */
|
|
29
|
+
static styles = css`
|
|
30
|
+
:host { display: inline-flex; gap: 5px; }
|
|
31
|
+
:host > * { flex: 1; }
|
|
32
|
+
pnx-link-button::part(btn) { height: auto; }
|
|
33
|
+
`;
|
|
34
|
+
|
|
35
|
+
constructor() {
|
|
36
|
+
super();
|
|
37
|
+
this._josm = false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** @private */
|
|
41
|
+
connectedCallback() {
|
|
42
|
+
super.connectedCallback();
|
|
43
|
+
onceParentAvailable(this).then(() => this._parent.onceReady()).then(() => {
|
|
44
|
+
this._parent.onceFirstPicLoaded().then(this._onPictureLoad.bind(this));
|
|
45
|
+
this._parent.psv.addEventListener("picture-loaded", this._onPictureLoad.bind(this));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** @private */
|
|
50
|
+
_onPictureLoad() {
|
|
51
|
+
this._pic = this._parent?.psv?.getPictureMetadata();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Enable or disable JOSM live editing using [Remote](https://josm.openstreetmap.de/wiki/Help/RemoteControlCommands)
|
|
56
|
+
* @private
|
|
57
|
+
*/
|
|
58
|
+
_toggleJOSMLive() {
|
|
59
|
+
this._josm = !this._josm;
|
|
60
|
+
|
|
61
|
+
if(this._josm) {
|
|
62
|
+
// Check if JOSM remote is enabled
|
|
63
|
+
fetch(JOSM_REMOTE_URL+"/version")
|
|
64
|
+
.then(() => {
|
|
65
|
+
// First loading : download + zoom
|
|
66
|
+
const p1 = josmBboxParameters(this._parent?.psv?.getPictureMetadata?.());
|
|
67
|
+
if(p1) {
|
|
68
|
+
const url = `${JOSM_REMOTE_URL}/load_and_zoom?${p1}`;
|
|
69
|
+
fetch(url).catch(e => {
|
|
70
|
+
console.warn(e);
|
|
71
|
+
this._toggleJOSMLive();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Enable event listening
|
|
76
|
+
this._josmListener = () => {
|
|
77
|
+
const p2 = josmBboxParameters(this._parent?.psv?.getPictureMetadata?.());
|
|
78
|
+
if(p2) {
|
|
79
|
+
// Next loadings : just zoom
|
|
80
|
+
// This avoids desktop focus to go on JOSM instead of
|
|
81
|
+
// Staying on web browser
|
|
82
|
+
const url = `${JOSM_REMOTE_URL}/zoom?${p2}`;
|
|
83
|
+
fetch(url).catch(e => {
|
|
84
|
+
console.warn(e);
|
|
85
|
+
this._toggleJOSMLive();
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
this._parent?.psv?.addEventListener?.("picture-loaded", this._josmListener);
|
|
90
|
+
this._parent?.psv?.addEventListener?.("picture-loading", this._josmListener);
|
|
91
|
+
})
|
|
92
|
+
.catch(e => {
|
|
93
|
+
console.warn(e);
|
|
94
|
+
alert(this._parent?._t.pnx.error_josm);
|
|
95
|
+
this._toggleJOSMLive();
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
if(this._josmListener) {
|
|
100
|
+
this._parent?.psv?.removeEventListener?.("picture-loading", this._josmListener);
|
|
101
|
+
this._parent?.psv?.removeEventListener?.("picture-loaded", this._josmListener);
|
|
102
|
+
delete this._josmListener;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** @private */
|
|
108
|
+
render() {
|
|
109
|
+
if(!this._pic) { return nothing; }
|
|
110
|
+
|
|
111
|
+
// Mobile -> Geo URI
|
|
112
|
+
if(this._parent?.isWidthSmall()) {
|
|
113
|
+
return html`
|
|
114
|
+
<pnx-link-button
|
|
115
|
+
size="sm"
|
|
116
|
+
href="geo:${this._pic.gps[1]},${this._pic.gps[0]};u=3"
|
|
117
|
+
>
|
|
118
|
+
${fa(faExternalLinkAlt)} ${this._parent?._t.pnx.geo_uri}
|
|
119
|
+
</pnx-link-button>
|
|
120
|
+
`;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const idOpts = {
|
|
124
|
+
"map": `19/${this._pic.gps[1]}/${this._pic.gps[0]}`,
|
|
125
|
+
"source": "Panoramax",
|
|
126
|
+
"photo_overlay": "panoramax",
|
|
127
|
+
"photo": `panoramax/${this._pic.id}`,
|
|
128
|
+
};
|
|
129
|
+
const idUrl = idOpts && `${IdEditorURL()}#${new URLSearchParams(idOpts).toString()}`;
|
|
130
|
+
|
|
131
|
+
return html`
|
|
132
|
+
<pnx-link-button
|
|
133
|
+
size="sm"
|
|
134
|
+
href=${idUrl}
|
|
135
|
+
target="_blank"
|
|
136
|
+
title="${this._parent?._t.pnx.contribute_id}"
|
|
137
|
+
>
|
|
138
|
+
${fa(faLocationDot)} ${this._parent?._t.pnx.id}
|
|
139
|
+
</pnx-link-button>
|
|
140
|
+
|
|
141
|
+
<pnx-button
|
|
142
|
+
id="pnx-edit-josm"
|
|
143
|
+
size="sm"
|
|
144
|
+
active=${this._josm ? "" : nothing}
|
|
145
|
+
@click=${this._toggleJOSMLive}
|
|
146
|
+
title="${this._parent?._t.pnx.josm_live}"
|
|
147
|
+
>
|
|
148
|
+
${fa(faSatelliteDish)} ${this._parent?._t.pnx.josm}
|
|
149
|
+
</pnx-button>
|
|
150
|
+
`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
customElements.define("pnx-widget-osmeditors", OSMEditors);
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { LitElement, css, html, nothing } from "lit";
|
|
2
|
+
import { fa, onceParentAvailable } from "../../../utils/widgets.js";
|
|
3
|
+
import { faEllipsisV } from "@fortawesome/free-solid-svg-icons";
|
|
4
|
+
import { noprint } from "../../styles.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Picture Legend Actions is a menu showing up complementary actions for picture legend.
|
|
8
|
+
* @class Panoramax.components.ui.widgets.PictureLegendActions
|
|
9
|
+
* @element pnx-picture-legend-actions
|
|
10
|
+
* @extends [lit.LitElement](https://lit.dev/docs/api/LitElement/)
|
|
11
|
+
* @example
|
|
12
|
+
* ```html
|
|
13
|
+
* <pnx-picture-legend-actions _parent=${viewer} />
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export default class PictureLegendActions extends LitElement {
|
|
17
|
+
/** @private */
|
|
18
|
+
static styles = [ noprint, css`
|
|
19
|
+
pnx-togglable-group::part(menu) {
|
|
20
|
+
border-radius: 5px;
|
|
21
|
+
min-width: unset;
|
|
22
|
+
}
|
|
23
|
+
`];
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Component properties.
|
|
27
|
+
* @memberof Panoramax.components.ui.widgets.PictureLegendActions#
|
|
28
|
+
* @type {Object}
|
|
29
|
+
* @property {boolean} [full=false] Show advanced actions
|
|
30
|
+
*/
|
|
31
|
+
static properties = {
|
|
32
|
+
full: { type: Boolean },
|
|
33
|
+
_meta: { state: true },
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
constructor() {
|
|
37
|
+
super();
|
|
38
|
+
this.full = false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** @private */
|
|
42
|
+
connectedCallback() {
|
|
43
|
+
super.connectedCallback();
|
|
44
|
+
|
|
45
|
+
onceParentAvailable(this).then(() => this._parent.onceReady()).then(() => {
|
|
46
|
+
this._meta = this._parent.psv.getPictureMetadata();
|
|
47
|
+
this._parent.psv.addEventListener("picture-loaded", () => {
|
|
48
|
+
this._meta = this._parent.psv.getPictureMetadata();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** @private */
|
|
54
|
+
_onPrint() {
|
|
55
|
+
this._closeGroup();
|
|
56
|
+
window.print();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** @private */
|
|
60
|
+
_closeGroup() {
|
|
61
|
+
this.renderRoot.querySelector("#pic-legend-headline-menu").close();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** @private */
|
|
65
|
+
render() {
|
|
66
|
+
return html`<pnx-togglable-group padded="false" id="pic-legend-headline-menu" ._parent=${this._parent}>
|
|
67
|
+
<pnx-button slot="button" kind="inline">${fa(faEllipsisV)}</pnx-button>
|
|
68
|
+
<pnx-list-group class="pnx-print-hidden" @click=${this._closeMenu}>
|
|
69
|
+
${this._meta ? html`<pnx-copy-button ._t=${this._parent?._t} text=${this._meta.id} unstyled>
|
|
70
|
+
${this._parent?._t.pnx.metadata_general_copy_picid}
|
|
71
|
+
</pnx-copy-button>` : nothing}
|
|
72
|
+
|
|
73
|
+
<a
|
|
74
|
+
download
|
|
75
|
+
target="_blank"
|
|
76
|
+
href=${this._meta?.panorama?.hdUrl}
|
|
77
|
+
@click=${this._closeGroup}
|
|
78
|
+
>${this._parent?._t.pnx.share_image}</a>
|
|
79
|
+
|
|
80
|
+
${this._parent.isWidthSmall() ? nothing : html`<button @click=${this._onPrint}>
|
|
81
|
+
${this._parent?._t.pnx.share_print}
|
|
82
|
+
</button>`}
|
|
83
|
+
|
|
84
|
+
${this._parent?.api?.getRSSURL() && !this._parent.isWidthSmall() && html`
|
|
85
|
+
<a
|
|
86
|
+
target="_blank"
|
|
87
|
+
href=${this._parent?.api.getRSSURL(this._parent?.map?.getBounds?.())}
|
|
88
|
+
title=${this._parent?._t.pnx.share_rss_title}
|
|
89
|
+
@click=${this._closeGroup}
|
|
90
|
+
>
|
|
91
|
+
${this._parent?._t.pnx.share_rss}
|
|
92
|
+
</a>
|
|
93
|
+
`}
|
|
94
|
+
</pnx-list-group>
|
|
95
|
+
</pnx-togglable-group>`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
customElements.define("pnx-picture-legend-actions", PictureLegendActions);
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { LitElement, html, nothing } from "lit";
|
|
2
|
+
import { fa, onceParentAvailable } from "../../../utils/widgets.js";
|
|
3
|
+
import {
|
|
4
|
+
faBackward, faEllipsisVertical, faForward, faPause, faPlay
|
|
5
|
+
} from "@fortawesome/free-solid-svg-icons";
|
|
6
|
+
import PlayerStyles from "./Player.css" with { type: "css" };
|
|
7
|
+
document.adoptedStyleSheets.push(PlayerStyles);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Player widget shows prev/play/pause/next/more buttons in a unified toolbar.
|
|
11
|
+
* @class Panoramax.components.ui.widgets.Player
|
|
12
|
+
* @element pnx-widget-player
|
|
13
|
+
* @extends [lit.LitElement](https://lit.dev/docs/api/LitElement/)
|
|
14
|
+
* @example
|
|
15
|
+
* ```html
|
|
16
|
+
* <pnx-widget-player _parent=${viewer} />
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export default class Player extends LitElement {
|
|
20
|
+
/**
|
|
21
|
+
* Component properties.
|
|
22
|
+
* @memberof Panoramax.components.ui.widgets.Player#
|
|
23
|
+
* @type {Object}
|
|
24
|
+
* @property {boolean} [playing=false] Is sequence currently playing ?
|
|
25
|
+
* @property {string} [size=xl] Group size (md, xl)
|
|
26
|
+
* @property {string} [more=depends] Should we display the "more options" button ("always", "never", "depends" = only on large screens (default))
|
|
27
|
+
*/
|
|
28
|
+
static properties = {
|
|
29
|
+
playing: {type: Boolean, reflect: true},
|
|
30
|
+
size: {type: String},
|
|
31
|
+
more: {type: String},
|
|
32
|
+
_activePrev: {state: true},
|
|
33
|
+
_activePlay: {state: true},
|
|
34
|
+
_activeNext: {state: true},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
constructor() {
|
|
38
|
+
super();
|
|
39
|
+
|
|
40
|
+
this.playing = false;
|
|
41
|
+
this.size = "xl";
|
|
42
|
+
this.more = "depends";
|
|
43
|
+
this._activePrev = true;
|
|
44
|
+
this._activePlay = true;
|
|
45
|
+
this._activeNext = true;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** @private */
|
|
49
|
+
createRenderRoot() {
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** @private */
|
|
54
|
+
connectedCallback() {
|
|
55
|
+
super.connectedCallback();
|
|
56
|
+
|
|
57
|
+
onceParentAvailable(this).then(() => this._parent?.oncePSVReady?.().then(() => {
|
|
58
|
+
this._parent.psv.addEventListener("sequence-playing", () => this.playing = true);
|
|
59
|
+
this._parent.psv.addEventListener("sequence-stopped", () => this.playing = false);
|
|
60
|
+
this._parent.psv.addEventListener("picture-loaded", this._changeActiveStates.bind(this));
|
|
61
|
+
this._parent.psv.addEventListener("pictures-navigation-changed", this._changeActiveStates.bind(this));
|
|
62
|
+
this._changeActiveStates();
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** @private */
|
|
67
|
+
_changeActiveStates() {
|
|
68
|
+
if(this._parent.psv.getPicturesNavigation?.() === "pic") {
|
|
69
|
+
this._activeNext = false;
|
|
70
|
+
this._activePlay = false;
|
|
71
|
+
this._activePrev = false;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this._activePrev = this._parent.psv.getPictureMetadata()?.sequence?.prevPic != null;
|
|
75
|
+
|
|
76
|
+
if(this._parent.psv.getPictureMetadata()?.sequence?.nextPic != null) {
|
|
77
|
+
this._activeNext = true;
|
|
78
|
+
this._activePlay = true;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this._activeNext = false;
|
|
82
|
+
this._activePlay = false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
this.requestUpdate();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** @private */
|
|
89
|
+
_onPlayClick() {
|
|
90
|
+
if(this._parent?.psv?.isSequencePlaying()) {
|
|
91
|
+
this.playing = false;
|
|
92
|
+
this._parent?.psv?.stopSequence();
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this.playing = true;
|
|
96
|
+
this._parent?.psv?.playSequence();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** @private */
|
|
101
|
+
render() {
|
|
102
|
+
if(!this._parent?.psv?.addEventListener) { return nothing; }
|
|
103
|
+
|
|
104
|
+
return html`
|
|
105
|
+
<pnx-button-group
|
|
106
|
+
id="pnx-widget-player"
|
|
107
|
+
dir="row"
|
|
108
|
+
size=${this.size}
|
|
109
|
+
class="pnx-print-hidden"
|
|
110
|
+
style=${!this._activePrev && !this._activePlay && !this._activeNext ? "display: none": ""}
|
|
111
|
+
>
|
|
112
|
+
<pnx-button
|
|
113
|
+
kind="superflat"
|
|
114
|
+
id="pnx-player-prev"
|
|
115
|
+
title=${this._parent?._t.pnx.sequence_prev}
|
|
116
|
+
@click=${() => this._parent?.psv?.goToPrevPicture()}
|
|
117
|
+
.disabled=${!this._activePrev}
|
|
118
|
+
>${fa(faBackward)}</pnx-button>
|
|
119
|
+
|
|
120
|
+
<pnx-button
|
|
121
|
+
kind="superflat"
|
|
122
|
+
id="pnx-player-play"
|
|
123
|
+
title=${this.playing ? this._parent?._t.pnx.sequence_pause : this._parent?._t.pnx.sequence_play}
|
|
124
|
+
.disabled=${!this._activePlay}
|
|
125
|
+
@click=${this._onPlayClick.bind(this)}
|
|
126
|
+
>${this.playing ? fa(faPause) : fa(faPlay)}</pnx-button>
|
|
127
|
+
|
|
128
|
+
<pnx-button
|
|
129
|
+
kind="superflat"
|
|
130
|
+
id="pnx-player-next"
|
|
131
|
+
title=${this._parent?._t.pnx.sequence_next}
|
|
132
|
+
.disabled=${!this._activeNext}
|
|
133
|
+
@click=${() => this._parent?.psv?.goToNextPicture()}
|
|
134
|
+
>${fa(faForward)}</pnx-button>
|
|
135
|
+
|
|
136
|
+
${this.more === "never" || (this.more !== "always" && this._parent?.isWidthSmall()) ? nothing : html`
|
|
137
|
+
<pnx-togglable-group padded="false" ._parent=${this._parent}>
|
|
138
|
+
<pnx-button
|
|
139
|
+
kind="flat"
|
|
140
|
+
id="pnx-player-more"
|
|
141
|
+
title=${this._parent?._t.pnx.sequence_more}
|
|
142
|
+
class=${this.more === "depends" ? "pnx-xs-hidden" : ""}
|
|
143
|
+
slot="button"
|
|
144
|
+
>${fa(faEllipsisVertical)}</pnx-button>
|
|
145
|
+
|
|
146
|
+
<pnx-player-options ._parent=${this._parent}></pnx-player-options>
|
|
147
|
+
</pnx-togglable-group>
|
|
148
|
+
`}
|
|
149
|
+
</pnx-button-group>
|
|
150
|
+
`;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
customElements.define("pnx-widget-player", Player);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { LitElement, html, nothing } from "lit";
|
|
2
|
+
import { fa, onceParentAvailable } from "../../../utils/widgets.js";
|
|
3
|
+
import {
|
|
4
|
+
faChevronDown, faTags, faXmark
|
|
5
|
+
} from "@fortawesome/free-solid-svg-icons";
|
|
6
|
+
import { activeIcon } from "../../styles.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Collapsible button showing off tags filters menus.
|
|
10
|
+
* @class Panoramax.components.ui.widgets.SemanticsFiltersButton
|
|
11
|
+
* @element pnx-widget-semantics-filters
|
|
12
|
+
* @extends [lit.LitElement](https://lit.dev/docs/api/LitElement/)
|
|
13
|
+
* @example
|
|
14
|
+
* ```html
|
|
15
|
+
* <pnx-widget-semantics-filters _parent=${viewer} />
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export default class SemanticsFiltersButton extends LitElement {
|
|
19
|
+
/** @private */
|
|
20
|
+
static styles = [activeIcon];
|
|
21
|
+
|
|
22
|
+
constructor() {
|
|
23
|
+
super();
|
|
24
|
+
onceParentAvailable(this).then(() => this._parent.onceMapReady?.().then(() => {
|
|
25
|
+
this._parent?.mapStyleComposer?.addEventListener("dataoverlay-added", () => this.requestUpdate());
|
|
26
|
+
this._parent?.map?.addEventListener("styledata", () => this.requestUpdate());
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** @private */
|
|
31
|
+
render() {
|
|
32
|
+
const o = this._parent.map?.getSemanticOverlays?.();
|
|
33
|
+
if(!o || o.length === 0) { return; }
|
|
34
|
+
|
|
35
|
+
const active = o.filter(l => l.metadata && this._parent.mapStyleComposer.dataOverlays.has(l.source)).length > 0;
|
|
36
|
+
const isSmall = this._parent?.isWidthSmall() || this._parent?.isWidthMedium();
|
|
37
|
+
const resetIcon = fa(faXmark, {styles: {"pointer-events": "auto"}});
|
|
38
|
+
resetIcon.addEventListener("click", e => {
|
|
39
|
+
e.stopPropagation();
|
|
40
|
+
this._parent?.map?.toggleAllSemanticOverlays(false);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
return html`
|
|
44
|
+
<pnx-togglable-group
|
|
45
|
+
id="pnx-widget-semantics-filter"
|
|
46
|
+
class="pnx-only-map pnx-print-hidden"
|
|
47
|
+
._parent=${this._parent}
|
|
48
|
+
>
|
|
49
|
+
<pnx-button kind="flat" size="xl" slot="button">
|
|
50
|
+
${fa(faTags)}
|
|
51
|
+
${active ? html`<span class="pnx-active-icon"></span>` : nothing}
|
|
52
|
+
${isSmall ? nothing : this._parent?._t.pnx.semantics_title}
|
|
53
|
+
${isSmall ? nothing : (active ? resetIcon : fa(faChevronDown))}
|
|
54
|
+
</pnx-button>
|
|
55
|
+
<pnx-map-semantics-filters-menu
|
|
56
|
+
id="pnx-map-semantics-filters-menu"
|
|
57
|
+
._parent=${this._parent}
|
|
58
|
+
@change=${this._onLayersChange}
|
|
59
|
+
></pnx-map-semantics-filters-menu>
|
|
60
|
+
</pnx-togglable-group>
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
customElements.define("pnx-widget-semantics-filters", SemanticsFiltersButton);
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { LitElement, html } from "lit";
|
|
2
|
+
import { PSV_ANIM_DURATION, PSV_DEFAULT_ZOOM } from "../Photo.js";
|
|
3
|
+
import { PSV_ZOOM_DELTA } from "../../core/PhotoViewer.js";
|
|
4
|
+
import { fa, onceParentAvailable } from "../../../utils/widgets.js";
|
|
5
|
+
import { faMinus, faPlus } from "@fortawesome/free-solid-svg-icons";
|
|
6
|
+
import ButtonGroupStyles from "../ButtonGroup.css" with { type: "css" };
|
|
7
|
+
document.adoptedStyleSheets.push(ButtonGroupStyles);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Widget for +/- zoom on PSV or Map.
|
|
11
|
+
* @class Panoramax.components.ui.widgets.Zoom
|
|
12
|
+
* @element pnx-widget-zoom
|
|
13
|
+
* @extends [lit.LitElement](https://lit.dev/docs/api/LitElement/)
|
|
14
|
+
* @example
|
|
15
|
+
* ```html
|
|
16
|
+
* <pnx-widget-zoom _parent=${viewer} />
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export default class Zoom extends LitElement {
|
|
20
|
+
/** @private */
|
|
21
|
+
static properties = {
|
|
22
|
+
_lastWantedZoom: {state: true},
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** @private */
|
|
26
|
+
createRenderRoot() {
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** @private */
|
|
31
|
+
connectedCallback() {
|
|
32
|
+
super.connectedCallback();
|
|
33
|
+
onceParentAvailable(this).then(() => this._parent?.oncePSVReady?.().then(() => {
|
|
34
|
+
this._lastWantedZoom = this._parent?.psv?.getZoomLevel() || PSV_DEFAULT_ZOOM;
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** @private */
|
|
39
|
+
_onClick(e, zoomIn) {
|
|
40
|
+
if(this._parent.map && this._parent.isMapWide()) {
|
|
41
|
+
if(zoomIn) { this._parent.map.zoomIn({}, {originalEvent: e}); }
|
|
42
|
+
else { this._parent.map.zoomOut({}, {originalEvent: e}); }
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if(this._parent.lastPsvAnim) { this._parent.lastPsvAnim.cancel(); }
|
|
46
|
+
const goToZoom = zoomIn ?
|
|
47
|
+
Math.min(100, this._lastWantedZoom + PSV_ZOOM_DELTA)
|
|
48
|
+
: Math.max(0, this._lastWantedZoom - PSV_ZOOM_DELTA);
|
|
49
|
+
this._parent.lastPsvAnim = this._parent.psv.animate({
|
|
50
|
+
speed: PSV_ANIM_DURATION,
|
|
51
|
+
zoom: goToZoom
|
|
52
|
+
});
|
|
53
|
+
this._lastWantedZoom = goToZoom;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** @private */
|
|
58
|
+
render() {
|
|
59
|
+
return html`
|
|
60
|
+
<pnx-button-group
|
|
61
|
+
id="pnx-widget-zoom"
|
|
62
|
+
dir="column"
|
|
63
|
+
size="xl"
|
|
64
|
+
class="pnx-mobile-hidden pnx-print-hidden"
|
|
65
|
+
>
|
|
66
|
+
<pnx-button
|
|
67
|
+
id="pnx-zoom-in"
|
|
68
|
+
kind="superflat"
|
|
69
|
+
title=${this._parent?._t.pnx.zoomIn}
|
|
70
|
+
@click=${e => this._onClick(e, true)}
|
|
71
|
+
>${fa(faPlus)}</pnx-button>
|
|
72
|
+
|
|
73
|
+
<pnx-button
|
|
74
|
+
id="pnx-zoom-out"
|
|
75
|
+
kind="superflat"
|
|
76
|
+
title=${this._parent?._t.pnx.zoomOut}
|
|
77
|
+
@click=${e => this._onClick(e, false)}
|
|
78
|
+
>${fa(faMinus)}</pnx-button>
|
|
79
|
+
</pnx-button-group>
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
customElements.define("pnx-widget-zoom", Zoom);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-assembled UI pieces components
|
|
3
|
+
* @module Panoramax:components:ui:widgets
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export {default as CopyCoordinates} from "./CopyCoordinates.js";
|
|
7
|
+
export {default as GeoSearch} from "./GeoSearch.js";
|
|
8
|
+
export {default as Legend} from "./Legend.js";
|
|
9
|
+
export {default as LevelSelect} from "./LevelSelect.js";
|
|
10
|
+
export {default as MapFiltersButton} from "./MapFiltersButton.js";
|
|
11
|
+
export {default as MapLayersButton} from "./MapLayersButton.js";
|
|
12
|
+
export {default as OSMEditors} from "./OSMEditors.js";
|
|
13
|
+
export {default as PictureLegendActions} from "./PictureLegendActions.js";
|
|
14
|
+
export {default as Player} from "./Player.js";
|
|
15
|
+
export {default as SemanticsFiltersButton} from "./SemanticsFiltersButton.js";
|
|
16
|
+
export {default as Zoom} from "./Zoom.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Lightweight export for PhotoViewer
|
|
2
|
+
export {default as CopyCoordinates} from "./CopyCoordinates.js";
|
|
3
|
+
export {default as Legend} from "./Legend.js";
|
|
4
|
+
export {default as OSMEditors} from "./OSMEditors.js";
|
|
5
|
+
export {default as PictureLegendActions} from "./PictureLegendActions.js";
|
|
6
|
+
export {default as Player} from "./Player.js";
|
|
7
|
+
export {default as Zoom} from "./Zoom.js";
|
|
@@ -9,7 +9,7 @@ import BasicStyles from "./Basic.css" with { type: "css" };
|
|
|
9
9
|
document.adoptedStyleSheets.push(AtkinsonStyles);
|
|
10
10
|
document.adoptedStyleSheets.push(BasicStyles);
|
|
11
11
|
|
|
12
|
-
const __COMMIT_HASH__ = "
|
|
12
|
+
const __COMMIT_HASH__ = "d26305d";
|
|
13
13
|
const __PACKAGE_VERSION__ = "5.0.0";
|
|
14
14
|
const __PACKAGE_ISSUES_URL__ = "https://gitlab.com/panoramax/clients/web-viewer/-/work_items";
|
|
15
15
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
width="48"
|
|
4
|
+
height="48"
|
|
5
|
+
viewBox="0 0 48 48"
|
|
6
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
+
xmlns:svg="http://www.w3.org/2000/svg">
|
|
8
|
+
<path
|
|
9
|
+
style="fill:#ffcc80;fill-opacity:1;stroke:#ffffff;stroke-width:2.63736;stroke-dasharray:none;stroke-opacity:1"
|
|
10
|
+
d="M 24 1.3183594 A 22.68132 22.68132 0 0 0 1.3183594 24 A 22.68132 22.68132 0 0 0 24 46.681641 A 22.68132 22.68132 0 0 0 46.681641 24 A 22.68132 22.68132 0 0 0 24 1.3183594 z M 24 14.021484 A 9.9777565 9.9777565 0 0 1 33.978516 24 A 9.9777565 9.9777565 0 0 1 24 33.978516 A 9.9777565 9.9777565 0 0 1 14.021484 24 A 9.9777565 9.9777565 0 0 1 24 14.021484 z " />
|
|
11
|
+
<path
|
|
12
|
+
style="fill:#bf360c;fill-opacity:1;stroke:#ffffff;stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
13
|
+
d="M 24 1.2421875 A 22.594107 22.594107 0 0 0 8.0214844 7.859375 L 17.042969 16.882812 A 9.9777565 9.9777565 0 0 1 24 14.021484 A 9.9777565 9.9777565 0 0 1 30.974609 16.867188 L 39.978516 7.8632812 A 22.594107 22.594107 0 0 0 24 1.2421875 z " />
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<svg
|
|
3
|
+
width="48"
|
|
4
|
+
height="48"
|
|
5
|
+
viewBox="0 0 48 48"
|
|
6
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
7
|
+
xmlns:svg="http://www.w3.org/2000/svg">
|
|
8
|
+
<path
|
|
9
|
+
style="fill:#bf360c;fill-opacity:1;stroke:#ffffff;stroke-width:2.50003;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
10
|
+
d="M 24 1.2421875 A 22.594107 22.594107 0 0 0 8.0214844 7.859375 L 17.042969 16.882812 A 9.9777565 9.9777565 0 0 1 24 14.021484 A 9.9777565 9.9777565 0 0 1 30.974609 16.867188 L 39.978516 7.8632812 A 22.594107 22.594107 0 0 0 24 1.2421875 z " />
|
|
11
|
+
</svg>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg
|
|
2
|
+
viewBox="0 0 64 64"
|
|
3
|
+
width="64" height="64"
|
|
4
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
5
|
+
xmlns:svg="http://www.w3.org/2000/svg">
|
|
6
|
+
<path
|
|
7
|
+
d="M 27.359486,12.65513 1.4316349,43.49917 c -3.2999082,3.906014 -0.53876046,9.96707 4.6468097,9.96707 H 57.934146 c 5.118225,0 7.946718,-5.993711 4.64681,-9.96707 L 36.653105,12.65513 c -2.424422,-2.8284931 -6.869197,-2.8284931 -9.293619,0 z"
|
|
8
|
+
style="fill: currentColor;fill-opacity:1;stroke-width:0.673451" />
|
|
9
|
+
</svg>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg viewBox="0 0 64 192" width="64" height="192" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
|
|
2
|
+
<circle
|
|
3
|
+
cx="32"
|
|
4
|
+
cy="32"
|
|
5
|
+
r="29.897806"
|
|
6
|
+
style="fill: currentColor;fill-opacity:1;stroke:#ffffff;stroke-width:4.20439;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
|
7
|
+
<path d="m 34.279873,20.262171 6.711442,6.714294 c 0.891465,0.891465 2.339986,0.891465 3.231451,0 0.891466,-0.891465 0.891466,-2.339985 0,-3.23145 -9.662902,-9.665829 -3.794285,-3.794286 -8.180297,-8.180298 -1.071396,-1.074322 -2.525696,-1.677165 -4.039972,-1.677165 -1.517129,0 -2.968576,0.602858 -4.042825,1.677165 l -8.180298,8.180298 c -0.894317,0.891465 -0.894317,2.339986 0,3.23145 0.891466,0.891465 2.339987,0.891465 3.231452,0 l 6.697106,-6.694253 v 27.703943 c 0,0 -0.109706,2.126292 2.285971,2.126292 2.395676,0 2.28597,-2.126292 2.28597,-2.126292 z" style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke-width:0.731429" />
|
|
8
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|