@panoramax/web-viewer 3.2.3-develop-d7e5a16d → 3.2.3-develop-6257391e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/.gitlab-ci.yml +3 -0
  2. package/CHANGELOG.md +19 -0
  3. package/CODE_OF_CONDUCT.md +1 -1
  4. package/README.md +1 -1
  5. package/build/editor.html +10 -1
  6. package/build/index.css +2 -2
  7. package/build/index.css.map +1 -1
  8. package/build/index.html +1 -1
  9. package/build/index.js +1682 -5
  10. package/build/index.js.map +1 -1
  11. package/build/map.html +1 -1
  12. package/build/viewer.html +10 -1
  13. package/build/widgets.html +1 -0
  14. package/config/jest/mocks.js +172 -0
  15. package/config/paths.js +1 -0
  16. package/config/webpack.config.js +26 -0
  17. package/docs/03_URL_settings.md +3 -11
  18. package/docs/05_Compatibility.md +59 -76
  19. package/docs/09_Develop.md +30 -11
  20. package/docs/90_Releases.md +2 -2
  21. package/docs/images/class_diagram.drawio +28 -28
  22. package/docs/images/class_diagram.jpg +0 -0
  23. package/docs/index.md +112 -0
  24. package/docs/reference/components/core/Basic.md +153 -0
  25. package/docs/reference/components/core/CoverageMap.md +160 -0
  26. package/docs/reference/components/core/Editor.md +172 -0
  27. package/docs/reference/components/core/Viewer.md +288 -0
  28. package/docs/reference/components/layout/CorneredGrid.md +29 -0
  29. package/docs/reference/components/layout/Mini.md +45 -0
  30. package/docs/reference/components/menus/MapBackground.md +32 -0
  31. package/docs/reference/components/menus/MapFilters.md +15 -0
  32. package/docs/reference/components/menus/MapLayers.md +15 -0
  33. package/docs/reference/components/menus/MapLegend.md +15 -0
  34. package/docs/reference/components/menus/PictureLegend.md +15 -0
  35. package/docs/reference/components/menus/PictureMetadata.md +15 -0
  36. package/docs/reference/components/menus/PlayerOptions.md +15 -0
  37. package/docs/reference/components/menus/QualityScoreDoc.md +15 -0
  38. package/docs/reference/components/menus/ReportForm.md +15 -0
  39. package/docs/reference/components/menus/ShareMenu.md +15 -0
  40. package/docs/reference/components/ui/Button.md +39 -0
  41. package/docs/reference/components/ui/ButtonGroup.md +36 -0
  42. package/docs/reference/components/ui/CopyButton.md +35 -0
  43. package/docs/reference/components/ui/Grade.md +32 -0
  44. package/docs/reference/components/ui/LinkButton.md +44 -0
  45. package/docs/reference/components/ui/Loader.md +54 -0
  46. package/docs/reference/components/ui/Map.md +214 -0
  47. package/docs/reference/components/ui/MapMore.md +233 -0
  48. package/docs/reference/components/ui/Photo.md +369 -0
  49. package/docs/reference/components/ui/Popup.md +56 -0
  50. package/docs/reference/components/ui/QualityScore.md +45 -0
  51. package/docs/reference/components/ui/SearchBar.md +63 -0
  52. package/docs/reference/components/ui/TogglableGroup.md +39 -0
  53. package/docs/reference/components/ui/widgets/GeoSearch.md +32 -0
  54. package/docs/reference/components/ui/widgets/Legend.md +32 -0
  55. package/docs/reference/components/ui/widgets/MapFiltersButton.md +33 -0
  56. package/docs/reference/components/ui/widgets/MapLayersButton.md +15 -0
  57. package/docs/reference/components/ui/widgets/Player.md +32 -0
  58. package/docs/reference/components/ui/widgets/Share.md +15 -0
  59. package/docs/reference/components/ui/widgets/Zoom.md +15 -0
  60. package/docs/reference/utils/API.md +311 -0
  61. package/docs/reference/utils/InitParameters.md +67 -0
  62. package/docs/reference/utils/URLHandler.md +102 -0
  63. package/docs/reference.md +73 -0
  64. package/docs/shortcuts.md +11 -0
  65. package/docs/tutorials/aerial_imagery.md +19 -0
  66. package/docs/tutorials/authentication.md +10 -0
  67. package/docs/tutorials/custom_widgets.md +64 -0
  68. package/docs/tutorials/map_style.md +27 -0
  69. package/docs/tutorials/migrate_v4.md +122 -0
  70. package/docs/tutorials/synced_coverage.md +42 -0
  71. package/mkdocs.yml +60 -5
  72. package/package.json +10 -7
  73. package/public/editor.html +21 -29
  74. package/public/index.html +3 -3
  75. package/public/map.html +19 -18
  76. package/public/viewer.html +18 -24
  77. package/public/widgets.html +265 -0
  78. package/scripts/doc.js +77 -0
  79. package/src/components/core/Basic.css +44 -0
  80. package/src/components/core/Basic.js +258 -0
  81. package/src/components/core/CoverageMap.css +9 -0
  82. package/src/components/core/CoverageMap.js +105 -0
  83. package/src/components/core/Editor.css +23 -0
  84. package/src/components/core/Editor.js +354 -0
  85. package/src/components/core/Viewer.css +109 -0
  86. package/src/components/core/Viewer.js +707 -0
  87. package/src/components/core/index.js +11 -0
  88. package/src/components/index.js +13 -0
  89. package/src/components/layout/CorneredGrid.js +109 -0
  90. package/src/components/layout/Mini.js +117 -0
  91. package/src/components/layout/index.js +7 -0
  92. package/src/components/menus/MapBackground.js +106 -0
  93. package/src/components/menus/MapFilters.js +386 -0
  94. package/src/components/menus/MapLayers.js +143 -0
  95. package/src/components/menus/MapLegend.js +54 -0
  96. package/src/components/menus/PictureLegend.js +103 -0
  97. package/src/components/menus/PictureMetadata.js +188 -0
  98. package/src/components/menus/PlayerOptions.js +96 -0
  99. package/src/components/menus/QualityScoreDoc.js +36 -0
  100. package/src/components/menus/ReportForm.js +133 -0
  101. package/src/components/menus/Share.js +228 -0
  102. package/src/components/menus/index.js +15 -0
  103. package/src/components/styles.js +365 -0
  104. package/src/components/ui/Button.js +75 -0
  105. package/src/components/ui/ButtonGroup.css +49 -0
  106. package/src/components/ui/ButtonGroup.js +68 -0
  107. package/src/components/ui/CopyButton.js +71 -0
  108. package/src/components/ui/Grade.js +54 -0
  109. package/src/components/ui/LinkButton.js +68 -0
  110. package/src/components/ui/Loader.js +188 -0
  111. package/src/components/{Map.css → ui/Map.css} +5 -17
  112. package/src/components/{Map.js → ui/Map.js} +114 -138
  113. package/src/components/ui/MapMore.js +324 -0
  114. package/src/components/{Photo.css → ui/Photo.css} +6 -6
  115. package/src/components/{Photo.js → ui/Photo.js} +279 -90
  116. package/src/components/ui/Popup.js +145 -0
  117. package/src/components/ui/QualityScore.js +152 -0
  118. package/src/components/ui/SearchBar.js +363 -0
  119. package/src/components/ui/TogglableGroup.js +162 -0
  120. package/src/components/ui/index.js +20 -0
  121. package/src/components/ui/widgets/GeoSearch.css +21 -0
  122. package/src/components/ui/widgets/GeoSearch.js +139 -0
  123. package/src/components/ui/widgets/Legend.js +51 -0
  124. package/src/components/ui/widgets/MapFiltersButton.js +104 -0
  125. package/src/components/ui/widgets/MapLayersButton.js +79 -0
  126. package/src/components/ui/widgets/Player.css +7 -0
  127. package/src/components/ui/widgets/Player.js +148 -0
  128. package/src/components/ui/widgets/Share.js +30 -0
  129. package/src/components/ui/widgets/Zoom.js +82 -0
  130. package/src/components/ui/widgets/index.js +12 -0
  131. package/src/img/panoramax.svg +13 -0
  132. package/src/img/switch_big.svg +20 -10
  133. package/src/index.js +6 -9
  134. package/src/translations/da.json +1 -1
  135. package/src/translations/de.json +1 -1
  136. package/src/translations/en.json +5 -3
  137. package/src/translations/eo.json +1 -1
  138. package/src/translations/es.json +1 -1
  139. package/src/translations/fr.json +5 -3
  140. package/src/translations/hu.json +1 -1
  141. package/src/translations/it.json +1 -1
  142. package/src/translations/ja.json +1 -1
  143. package/src/translations/nl.json +1 -1
  144. package/src/translations/pl.json +1 -1
  145. package/src/translations/sv.json +1 -1
  146. package/src/translations/zh_Hant.json +1 -1
  147. package/src/utils/API.js +74 -42
  148. package/src/utils/InitParameters.js +354 -0
  149. package/src/utils/URLHandler.js +364 -0
  150. package/src/utils/geocoder.js +116 -0
  151. package/src/utils/{I18n.js → i18n.js} +3 -1
  152. package/src/utils/index.js +11 -0
  153. package/src/utils/{Map.js → map.js} +216 -80
  154. package/src/utils/picture.js +433 -0
  155. package/src/utils/utils.js +315 -0
  156. package/src/utils/widgets.js +93 -0
  157. package/tests/components/ui/CopyButton.test.js +52 -0
  158. package/tests/components/ui/Loader.test.js +54 -0
  159. package/tests/components/{Map.test.js → ui/Map.test.js} +19 -61
  160. package/tests/components/{Photo.test.js → ui/Photo.test.js} +89 -57
  161. package/tests/components/ui/Popup.test.js +24 -0
  162. package/tests/components/ui/QualityScore.test.js +17 -0
  163. package/tests/components/ui/SearchBar.test.js +107 -0
  164. package/tests/components/ui/__snapshots__/CopyButton.test.js.snap +34 -0
  165. package/tests/components/ui/__snapshots__/Loader.test.js.snap +56 -0
  166. package/tests/components/{__snapshots__ → ui/__snapshots__}/Map.test.js.snap +11 -38
  167. package/tests/components/{__snapshots__ → ui/__snapshots__}/Photo.test.js.snap +57 -4
  168. package/tests/components/ui/__snapshots__/Popup.test.js.snap +29 -0
  169. package/tests/components/ui/__snapshots__/QualityScore.test.js.snap +11 -0
  170. package/tests/components/ui/__snapshots__/SearchBar.test.js.snap +65 -0
  171. package/tests/utils/API.test.js +1 -14
  172. package/tests/utils/InitParameters.test.js +485 -0
  173. package/tests/utils/URLHandler.test.js +350 -0
  174. package/tests/utils/__snapshots__/URLHandler.test.js.snap +21 -0
  175. package/tests/utils/__snapshots__/picture.test.js.snap +315 -0
  176. package/tests/utils/__snapshots__/widgets.test.js.snap +19 -0
  177. package/tests/utils/geocoder.test.js +37 -0
  178. package/tests/utils/{I18n.test.js → i18n.test.js} +1 -1
  179. package/tests/utils/map.test.js +67 -0
  180. package/tests/utils/picture.test.js +745 -0
  181. package/tests/utils/utils.test.js +288 -0
  182. package/tests/utils/widgets.test.js +90 -0
  183. package/docs/01_Start.md +0 -149
  184. package/docs/02_Usage.md +0 -831
  185. package/docs/04_Advanced_examples.md +0 -216
  186. package/src/Editor.css +0 -37
  187. package/src/Editor.js +0 -361
  188. package/src/StandaloneMap.js +0 -114
  189. package/src/Viewer.css +0 -203
  190. package/src/Viewer.js +0 -1246
  191. package/src/components/CoreView.css +0 -70
  192. package/src/components/CoreView.js +0 -175
  193. package/src/components/Loader.css +0 -74
  194. package/src/components/Loader.js +0 -120
  195. package/src/utils/Exif.js +0 -193
  196. package/src/utils/Utils.js +0 -631
  197. package/src/utils/Widgets.js +0 -562
  198. package/src/viewer/URLHash.js +0 -469
  199. package/src/viewer/Widgets.css +0 -880
  200. package/src/viewer/Widgets.js +0 -1470
  201. package/tests/Editor.test.js +0 -126
  202. package/tests/StandaloneMap.test.js +0 -45
  203. package/tests/Viewer.test.js +0 -366
  204. package/tests/__snapshots__/Editor.test.js.snap +0 -298
  205. package/tests/__snapshots__/StandaloneMap.test.js.snap +0 -30
  206. package/tests/__snapshots__/Viewer.test.js.snap +0 -195
  207. package/tests/components/CoreView.test.js +0 -92
  208. package/tests/components/Loader.test.js +0 -38
  209. package/tests/components/__snapshots__/Loader.test.js.snap +0 -15
  210. package/tests/utils/Exif.test.js +0 -124
  211. package/tests/utils/Map.test.js +0 -113
  212. package/tests/utils/Utils.test.js +0 -300
  213. package/tests/utils/Widgets.test.js +0 -107
  214. package/tests/utils/__snapshots__/Exif.test.js.snap +0 -43
  215. package/tests/utils/__snapshots__/Utils.test.js.snap +0 -41
  216. package/tests/utils/__snapshots__/Widgets.test.js.snap +0 -44
  217. package/tests/viewer/URLHash.test.js +0 -559
  218. package/tests/viewer/Widgets.test.js +0 -127
  219. package/tests/viewer/__snapshots__/URLHash.test.js.snap +0 -108
  220. package/tests/viewer/__snapshots__/Widgets.test.js.snap +0 -403
  221. /package/tests/utils/__snapshots__/{Map.test.js.snap → geocoder.test.js.snap} +0 -0
@@ -0,0 +1,68 @@
1
+ import { LitElement, css } from "lit";
2
+ import { btn } from "../styles";
3
+
4
+ /**
5
+ * Link Button element displays a HTML `<a>` anchor with a button style.
6
+ * @class Panoramax.components.ui.LinkButton
7
+ * @element pnx-link-button
8
+ * @extends [lit.LitElement](https://lit.dev/docs/api/LitElement/)
9
+ * @example
10
+ * ```html
11
+ * <pnx-link-button
12
+ * title="Redirect to other website"
13
+ * kind="outline"
14
+ * href="https://panoramax.fr"
15
+ * target="_blank"
16
+ * >
17
+ * Click to go on Panoramax
18
+ * </pnx-link-button>
19
+ * ```
20
+ */
21
+ export default class LinkButton extends LitElement {
22
+ /** @private */
23
+ static styles = [ btn, css`
24
+ .pnx-btn {
25
+ padding: 5px 0;
26
+ }
27
+ ` ];
28
+
29
+ /**
30
+ * Component properties.
31
+ * @memberof Panoramax.components.ui.LinkButton#
32
+ * @type {Object}
33
+ * @property {string} [href] The URL the button should navigate to when clicked
34
+ * @property {string} [target] Specifies where to open the linked document (e.g., '_blank')
35
+ * @property {string} [title] Tooltip text displayed when hovering over the button
36
+ * @property {string} [download] Indicates if the linked resource should be downloaded
37
+ * @property {string} [class] Custom CSS class for additional styling
38
+ * @property {string} [kind=full] The style variation of the button (full, outline, flat, superflat)
39
+ */
40
+ static properties = {
41
+ href: { type: String },
42
+ target: { type: String },
43
+ title: { type: String },
44
+ download: { type: String },
45
+ class: { type: String },
46
+ kind: {type: String},
47
+ };
48
+
49
+ constructor() {
50
+ super();
51
+ this.kind = "full";
52
+ }
53
+
54
+ /** @private */
55
+ render() {
56
+ const a = document.createElement("a");
57
+ a.setAttribute("part", "btn");
58
+ this.constructor.observedAttributes
59
+ .filter(k => this[k] !== undefined)
60
+ .forEach(k => a.setAttribute(k, this[k]));
61
+ a.classList.add("pnx-btn", `pnx-btn-${this.kind}`);
62
+ const slot = document.createElement("slot");
63
+ a.appendChild(slot);
64
+ return a;
65
+ }
66
+ }
67
+
68
+ customElements.define("pnx-link-button", LinkButton);
@@ -0,0 +1,188 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import LogoDead from "../../img/logo_dead.svg";
3
+ import LoaderImg from "../../img/marker.svg";
4
+
5
+ /**
6
+ * Loader component display a full page covering for user waiting.
7
+ * @class Panoramax.components.ui.Loader
8
+ * @element pnx-loader
9
+ * @extends [lit.LitElement](https://lit.dev/docs/api/LitElement/)
10
+ * @example
11
+ * ```html
12
+ * <pnx-loader ._parent=${this.viewer} />
13
+ * ```
14
+ */
15
+ export default class Loader extends LitElement {
16
+ /** @private */
17
+ static styles = css`
18
+ :host {
19
+ position: absolute;
20
+ inset: 0;
21
+ display: flex;
22
+ flex-direction: column;
23
+ justify-content: center;
24
+ gap: 20px;
25
+ align-items: center;
26
+ background: #37474F;
27
+ z-index: 200;
28
+ font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
29
+ font-weight: 550;
30
+ color: white;
31
+ font-size: 1.4em;
32
+ text-align: center;
33
+ visibility: hidden;
34
+ opacity: 0;
35
+ }
36
+ :host(*[visible]) {
37
+ visibility: visible;
38
+ opacity: 1;
39
+ }
40
+
41
+ /* Flashing text */
42
+ div.label {
43
+ animation: blinker 2s linear infinite;
44
+ }
45
+ @keyframes blinker { 50% { opacity: 0.3; } }
46
+
47
+ /* Logo */
48
+ img.logo {
49
+ width: 150px;
50
+ animation: rotating 1.4s linear infinite;
51
+ }
52
+ @keyframes rotating {
53
+ from { transform: rotate(0deg); }
54
+ to { transform: rotate(360deg); }
55
+ }
56
+ img.logo-dead {
57
+ width: 200px;
58
+ }
59
+ `;
60
+
61
+ /**
62
+ * Component properties.
63
+ * @memberof Panoramax.components.ui.Loader#
64
+ * @type {Object}
65
+ * @property {boolean} [visible=true] Is the loader visible to user ?
66
+ */
67
+ static properties = {
68
+ _mode: {state: true},
69
+ _label: {state: true},
70
+ _isLabelFun: {state: true},
71
+ visible: {type: Boolean, reflect: true},
72
+ };
73
+
74
+ constructor() {
75
+ super();
76
+ this.visible = true;
77
+ this._mode = "loading";
78
+ this._isLabelFun = false;
79
+ }
80
+
81
+ /** @private */
82
+ connectedCallback() {
83
+ super.connectedCallback();
84
+ this._nextLabel();
85
+ }
86
+
87
+ /**
88
+ * Is the loader currently visible ?
89
+ * @returns {boolean} True if visible
90
+ * @memberof Panoramax.components.ui.Loader#
91
+ */
92
+ isVisible() {
93
+ return this.visible;
94
+ }
95
+
96
+ /**
97
+ * Dismiss loader, or show error
98
+ * @param {object} [err] Optional error object to show in browser console
99
+ * @param {str} [errMeaningful] Optional error message to show to user
100
+ * @param {fct} [next] Optional function to run after loader dismiss
101
+ * @memberof Panoramax.components.ui.Loader#
102
+ */
103
+ dismiss(err = null, errMeaningful = null, next = null) {
104
+ clearTimeout(this._loaderLabelChanger);
105
+
106
+ if(!err) {
107
+ this._mode = "done";
108
+ this.visible = false;
109
+ this.style.transition = "all 0.5s";
110
+ setTimeout(() => this.parentNode.removeChild(this), 2000);
111
+
112
+ /**
113
+ * Event for component being ready to use (API loaded)
114
+ * @event Panoramax.components.core.Basic#ready
115
+ * @type {CustomEvent}
116
+ */
117
+ const readyEvt = new CustomEvent("ready");
118
+ this._parent.dispatchEvent(readyEvt);
119
+
120
+ if(next) { next(); }
121
+ }
122
+ else {
123
+ if(err !== true) { console.error(err); }
124
+
125
+ let errHtml = [ this._parent?._t.pnx.error, html`<br />` ];
126
+
127
+ if(errMeaningful) { errHtml.push(errMeaningful, html`<br />`); }
128
+
129
+ if(next) {
130
+ errHtml.push(html`<pnx-button kind="full">${this._parent?._t.pnx.error_click}</pnx-button>`);
131
+ this.addEventListener("click", next);
132
+ }
133
+ else { errHtml.push(html`<small>${this._parent?._t.pnx.error_retry}</small>`); }
134
+
135
+ this._mode = "error";
136
+ this._label = errHtml;
137
+
138
+ const errLabel = errMeaningful || "Panoramax JS had a blocking exception";
139
+
140
+ /**
141
+ * Event for viewer failing to initially load
142
+ * @event Panoramax.components.core.Basic#broken
143
+ * @type {CustomEvent}
144
+ * @property {string} detail.error The user-friendly error message to display
145
+ */
146
+ const brokenEvt = new CustomEvent("broken", {
147
+ detail: { error: errLabel }
148
+ });
149
+ this._parent.dispatchEvent(brokenEvt);
150
+
151
+ // Throw error
152
+ throw new Error(errLabel);
153
+ }
154
+ }
155
+
156
+ /** @private */
157
+ _nextLabel() {
158
+ if(!this._isLabelFun) {
159
+ this._label = this._parent?._t.pnx.loading_labels_serious[
160
+ Math.floor(Math.random() * this._parent?._t.pnx.loading_labels_serious.length)
161
+ ];
162
+ this._isLabelFun = true;
163
+ }
164
+ else {
165
+ this._label = this._parent?._t.pnx.loading_labels_fun[
166
+ Math.floor(Math.random() * this._parent?._t.pnx.loading_labels_fun.length)
167
+ ];
168
+ }
169
+ this._loaderLabelChanger = setTimeout(this._nextLabel.bind(this), 500 + Math.random() * 1000);
170
+ }
171
+
172
+ /** @private */
173
+ render() {
174
+ if(this._mode == "error") {
175
+ return html`
176
+ <img class="logo-dead" src=${LogoDead} alt="" title=${this._parent?._t.map.loading} />
177
+ ${this._label}
178
+ `;
179
+ }
180
+
181
+ return html`
182
+ <img class="logo" src=${LoaderImg} alt="" title=${this._parent?._t.map.loading} />
183
+ <div class="label">${this._label}</div>
184
+ `;
185
+ }
186
+ }
187
+
188
+ customElements.define("pnx-loader", Loader);
@@ -1,17 +1,10 @@
1
- /* Force maplibre to fill all available space */
2
- .gvs-map.maplibregl-map {
3
- width: 100%;
4
- height: 100%;
5
- background-color: white;
6
- }
7
-
8
1
  /* Picture thumbnail on map */
9
2
  .maplibregl-popup-content {
10
3
  padding: 5px !important;
11
4
  position: relative;
12
5
  }
13
6
 
14
- .gvs-map-thumb {
7
+ .pnx-map-thumb {
15
8
  display: inline-block;
16
9
  text-align: center;
17
10
  vertical-align: middle;
@@ -24,7 +17,7 @@
24
17
  to { transform: rotate(360deg); }
25
18
  }
26
19
 
27
- .gvs-map-thumb-loader {
20
+ .pnx-map-thumb-loader {
28
21
  background-color: rgb(230,230,230);
29
22
  border-radius: 65px;
30
23
  max-height: 60px;
@@ -32,7 +25,7 @@
32
25
  animation: rotating 2s linear infinite;
33
26
  }
34
27
 
35
- .gvs-map-thumb-legend {
28
+ .pnx-map-thumb-legend {
36
29
  display: block;
37
30
  position: absolute;
38
31
  bottom: 5px;
@@ -47,19 +40,14 @@
47
40
  padding: 0;
48
41
  }
49
42
 
50
- /* Max size for geocoder search bar */
51
- .maplibregl-ctrl-geocoder {
52
- max-width: 60%;
53
- }
54
-
55
43
  .maplibregl-marker {
56
44
  width: 60px;
57
45
  }
58
46
 
59
47
  /* Resize canvas for print */
60
48
  @media print {
61
- .gvs-map.maplibregl-map canvas {
49
+ .pnx-map.maplibregl-map .maplibregl-canvas-container {
62
50
  width: 100% !important;
63
- height: 100% !important;
51
+ height: unset !important;
64
52
  }
65
53
  }