@panoramax/web-viewer 3.2.1 → 3.2.2-develop-69587b96

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.
@@ -533,10 +533,12 @@ export default class Widgets {
533
533
 
534
534
  // Picture quality level
535
535
  if(this._viewer?.map?._hasQualityScore()) {
536
- popupContent.push(createHeader(
536
+ const qsHeader = createHeader(
537
537
  "h4",
538
- `${fat(faMedal)} ${this._t.gvs.metadata_quality} <a href="https://docs.panoramax.fr/pictures-metadata/quality_score/" target="_blank" title="${this._t.gvs.metadata_quality_help}">${fat(faInfoCircle)}</a>`
539
- ));
538
+ `${fat(faMedal)} ${this._t.gvs.metadata_quality} <button class="gvs-btn-link" title="${this._t.gvs.metadata_quality_help}">${fat(faInfoCircle)}</button>`
539
+ );
540
+ qsHeader.lastChild.addEventListener("click", () => this._showQualityScoreDoc());
541
+ popupContent.push(qsHeader);
540
542
  const gpsGrade = getGrade(QUALITYSCORE_GPS_VALUES, picMeta?.properties?.["quality:horizontal_accuracy"]);
541
543
  const resGrade = getGrade(
542
544
  picMeta?.horizontalFov === 360 ? QUALITYSCORE_RES_360_VALUES : QUALITYSCORE_RES_FLAT_VALUES,
@@ -567,6 +569,30 @@ export default class Widgets {
567
569
  this._viewer.dispatchEvent(new CustomEvent("focus-changed", { detail: { focus: "meta" } }));
568
570
  }
569
571
 
572
+ _showQualityScoreDoc() {
573
+ const popupContent = [];
574
+ popupContent.push(createHeader("h4", `${fat(faMedal)} ${this._t.gvs.qualityscore_title}`));
575
+
576
+ const link = document.createElement("a");
577
+ link.setAttribute("href", "https://docs.panoramax.fr/pictures-metadata/quality_score/");
578
+ link.setAttribute("target", "_blank");
579
+ link.appendChild(document.createTextNode(this._t.gvs.qualityscore_doc_link));
580
+
581
+ [
582
+ document.createTextNode(this._t.gvs.qualityscore_doc_1),
583
+ document.createTextNode(this._t.gvs.qualityscore_doc_2),
584
+ showQualityScore(5),
585
+ document.createTextNode(this._t.gvs.qualityscore_doc_3),
586
+ link
587
+ ].forEach(elem => {
588
+ const p = document.createElement("p");
589
+ p.appendChild(elem);
590
+ popupContent.push(p);
591
+ });
592
+
593
+ this._viewer.setPopup(true, popupContent);
594
+ }
595
+
570
596
  _showReportForm() {
571
597
  const picMeta = this._viewer.psv.getPictureMetadata();
572
598
  if (!picMeta) { throw new Error("No picture currently selected"); }
@@ -705,6 +731,9 @@ export default class Widgets {
705
731
  _initWidgetMiniActions() {
706
732
  // Mini widget expand
707
733
  const imgExpand = document.createElement("img");
734
+ imgExpand.alt = "";
735
+ imgExpand.height = 120;
736
+ imgExpand.draggable = false;
708
737
  imgExpand.src = SwitchBig;
709
738
  const lblExpand = document.createElement("span");
710
739
  lblExpand.classList.add("gvs-mobile-hidden");
@@ -718,6 +747,9 @@ export default class Widgets {
718
747
 
719
748
  // Mini widget hide
720
749
  const imgReduce = document.createElement("img");
750
+ imgReduce.alt = this._t.gvs.minimize_short;
751
+ imgReduce.height = 120;
752
+ imgReduce.draggable = false;
721
753
  imgReduce.src = SwitchMini;
722
754
  const btnHide = createButton("gvs-mini-hide", imgReduce, this._t.gvs.minimize, ["gvs-only-mini", "gvs-print-hidden"]);
723
755
  this._corners["mini-bottom-left"].appendChild(btnHide);
@@ -848,12 +880,12 @@ export default class Widgets {
848
880
  <div id="gvs-map-bg" class="gvs-input-group">
849
881
  <input type="radio" id="gvs-map-bg-streets" name="gvs-map-bg" value="streets" />
850
882
  <label for="gvs-map-bg-streets">
851
- <img id="gvs-map-bg-streets-img" />
883
+ <img id="gvs-map-bg-streets-img" alt="" />
852
884
  ${this._t.gvs.map_background_streets}
853
885
  </label>
854
886
  <input type="radio" id="gvs-map-bg-aerial" name="gvs-map-bg" value="aerial" />
855
887
  <label for="gvs-map-bg-aerial">
856
- <img id="gvs-map-bg-aerial-img" />
888
+ <img id="gvs-map-bg-aerial-img" alt="" />
857
889
  ${this._t.gvs.map_background_aerial}
858
890
  </label>
859
891
  </div>`;
@@ -905,9 +937,12 @@ export default class Widgets {
905
937
  </div>
906
938
  <div id="gvs-map-theme-legend-score" class="gvs-map-theme-legend gvs-hidden">
907
939
  ${QUALITYSCORE_VALUES.map(pv => "<span class=\"gvs-qualityscore\" style=\"background-color: "+pv.color+";\">"+pv.label+"</span>").join("")}
940
+ <button id="gvs-map-theme-quality-help" class="gvs-btn-link" title="${this._t.gvs.metadata_quality_help}">${fat(faInfoCircle, {transform: {x: 6, size: 24}})}</button>
908
941
  </div>
909
942
  </div>`;
910
943
 
944
+ pnlLayers.querySelector("#gvs-map-theme-quality-help").addEventListener("click", () => this._showQualityScoreDoc());
945
+
911
946
  // Map theme events
912
947
  const fMapTheme = pnlLayers.querySelector("#gvs-map-theme");
913
948
  const onChange = () => {
@@ -955,7 +990,9 @@ export default class Widgets {
955
990
  */
956
991
  _onMapThemeChange() {
957
992
  const fMapTheme = document.getElementById("gvs-map-theme");
993
+ const layerBtn = document.getElementById("gvs-map-layers");
958
994
  const t = fMapTheme.value;
995
+ layerBtn.setActive(t !== "default");
959
996
  for(let d of document.getElementsByClassName("gvs-map-theme-legend")) {
960
997
  if(d.id == "gvs-map-theme-legend-"+t) {
961
998
  d.classList.remove("gvs-hidden");
@@ -972,27 +1009,31 @@ export default class Widgets {
972
1009
  * @private
973
1010
  */
974
1011
  _initWidgetFilters(hasUserSearch, hasQualityScore) {
975
- const btnFilter = createExpandableButton("gvs-filter", faSliders, this._t.gvs.filters, this);
1012
+ const btnFilter = createExpandableButton("gvs-filter", faSliders, this._t.gvs.filters, this, ["gvs-filter-unset-btn"]);
976
1013
  const pnlFilter = createPanel(this, btnFilter, []);
977
1014
  pnlFilter.innerHTML = `
978
1015
  <form id="gvs-filter-form">
979
- <div id="gvs-filter-zoomin">${fat(faTriangleExclamation)} ${this._t.gvs.filter_zoom_in}</div>
980
- <h4>${fat(faCalendar)} ${this._t.gvs.filter_date}</h4>
981
- <div class="gvs-input-shortcuts">
982
- <button data-for="gvs-filter-date-from" data-value="${new Date(new Date().setMonth(new Date().getMonth() - 1)).toISOString().split("T")[0]}">${this._t.gvs.filter_date_1month}</button>
983
- <button data-for="gvs-filter-date-from" data-value="${new Date(new Date().setFullYear(new Date().getFullYear() - 1)).toISOString().split("T")[0]}">${this._t.gvs.filter_date_1year}</button>
984
- </div>
985
- <div class="gvs-input-group">
986
- <input type="date" id="gvs-filter-date-from" />
987
- ${fat(faArrowRight)}
988
- <input type="date" id="gvs-filter-date-end" />
1016
+ <div class="gvs-filter-block">
1017
+ <div class="gvs-filter-zoomin">${this._t.gvs.filter_zoom_in}</div>
1018
+ <h4>${fat(faCalendar)} ${this._t.gvs.filter_date}</h4>
1019
+ <div class="gvs-input-shortcuts">
1020
+ <button data-for="gvs-filter-date-from" data-value="${new Date(new Date().setMonth(new Date().getMonth() - 1)).toISOString().split("T")[0]}">${this._t.gvs.filter_date_1month}</button>
1021
+ <button data-for="gvs-filter-date-from" data-value="${new Date(new Date().setFullYear(new Date().getFullYear() - 1)).toISOString().split("T")[0]}">${this._t.gvs.filter_date_1year}</button>
1022
+ </div>
1023
+ <div class="gvs-input-group">
1024
+ <input type="date" id="gvs-filter-date-from" />
1025
+ ${fat(faArrowRight)}
1026
+ <input type="date" id="gvs-filter-date-end" />
1027
+ </div>
989
1028
  </div>
990
- <h4>${fat(faImage)} ${this._t.gvs.filter_picture}</h4>
991
- <div class="gvs-input-group gvs-checkbox-btns" style="justify-content: center;">
992
- <input type="checkbox" id="gvs-filter-type-flat" name="flat" checked />
993
- <label for="gvs-filter-type-flat">${fat(faImage)} ${this._t.gvs.picture_flat}</label>
994
- <input type="checkbox" id="gvs-filter-type-360" name="360" checked />
995
- <label for="gvs-filter-type-360">${fat(faPanorama)} ${this._t.gvs.picture_360}</label>
1029
+ <div class="gvs-filter-block">
1030
+ <h4>${fat(faImage)} ${this._t.gvs.filter_picture}</h4>
1031
+ <div class="gvs-input-group gvs-checkbox-btns" style="justify-content: center;">
1032
+ <input type="checkbox" id="gvs-filter-type-flat" name="flat" />
1033
+ <label for="gvs-filter-type-flat">${fat(faImage)} ${this._t.gvs.picture_flat}</label>
1034
+ <input type="checkbox" id="gvs-filter-type-360" name="360" />
1035
+ <label for="gvs-filter-type-360">${fat(faPanorama)} ${this._t.gvs.picture_360}</label>
1036
+ </div>
996
1037
  </div>
997
1038
  </form>
998
1039
  `;
@@ -1004,6 +1045,14 @@ export default class Widgets {
1004
1045
  [btnFilter, pnlFilter],
1005
1046
  ["gvs-group-large", "gvs-group-btnpanel", "gvs-only-map", "gvs-print-hidden"]
1006
1047
  );
1048
+
1049
+ const resetBtn = btnFilter.querySelector(".gvs-filter-unset-btn");
1050
+ if(resetBtn) {
1051
+ resetBtn.addEventListener("click", e => {
1052
+ e.stopPropagation();
1053
+ form.reset();
1054
+ });
1055
+ }
1007
1056
 
1008
1057
  if(this._viewer.isWidthSmall()) {
1009
1058
  pnlFilter.style.width = `${this._viewer.container.offsetWidth - 70}px`;
@@ -1011,10 +1060,20 @@ export default class Widgets {
1011
1060
 
1012
1061
  // Create qualityscore filter
1013
1062
  if(hasQualityScore) {
1063
+ const block = document.createElement("div");
1064
+ block.classList.add("gvs-filter-block");
1065
+ form.appendChild(block);
1066
+
1067
+ const zoomLbl = document.createElement("div");
1068
+ zoomLbl.classList.add("gvs-filter-zoomin");
1069
+ zoomLbl.appendChild(document.createTextNode(this._t.gvs.filter_zoom_in));
1070
+ block.appendChild(zoomLbl);
1071
+
1014
1072
  const title = document.createElement("h4");
1015
- title.innerHTML = `${fat(faMedal)} ${this._t.gvs.filter_qualityscore}`;
1073
+ title.innerHTML = `${fat(faMedal)} ${this._t.gvs.filter_qualityscore} <button class="gvs-btn-link" title="${this._t.gvs.metadata_quality_help}">${fat(faInfoCircle)}</button>`;
1016
1074
  title.style.marginBottom = "3px";
1017
- form.appendChild(title);
1075
+ title.lastChild.addEventListener("click", () => this._showQualityScoreDoc());
1076
+ block.appendChild(title);
1018
1077
 
1019
1078
  const div = document.createElement("div");
1020
1079
  div.id = "gvs-filter-qualityscore";
@@ -1037,14 +1096,18 @@ export default class Widgets {
1037
1096
  div.appendChild(label);
1038
1097
  });
1039
1098
 
1040
- form.appendChild(div);
1099
+ block.appendChild(div);
1041
1100
  }
1042
1101
 
1043
1102
  // Create search bar for users
1044
1103
  if(hasUserSearch) {
1104
+ const block = document.createElement("div");
1105
+ block.classList.add("gvs-filter-block");
1106
+ form.appendChild(block);
1107
+
1045
1108
  const title = document.createElement("h4");
1046
1109
  title.innerHTML = `${fat(faUser)} ${this._t.gvs.filter_user}`;
1047
- form.appendChild(title);
1110
+ block.appendChild(title);
1048
1111
 
1049
1112
  // Shortcut for my own pictures
1050
1113
  const userAccount = getUserAccount();
@@ -1055,7 +1118,7 @@ export default class Widgets {
1055
1118
  mypics = document.createElement("button");
1056
1119
  mypics.appendChild(document.createTextNode(this._t.gvs.filter_user_mypics));
1057
1120
  shortcuts.appendChild(mypics);
1058
- form.appendChild(shortcuts);
1121
+ block.appendChild(shortcuts);
1059
1122
  }
1060
1123
 
1061
1124
  const input = document.createElement("div");
@@ -1084,8 +1147,12 @@ export default class Widgets {
1084
1147
  this,
1085
1148
  true
1086
1149
  );
1150
+ block.addEventListener("reset", () => {
1151
+ userSearch.classList.remove("gvs-filter-active");
1152
+ userSearch.resetSearch();
1153
+ });
1087
1154
  input.appendChild(userSearch);
1088
- form.appendChild(input);
1155
+ block.appendChild(input);
1089
1156
 
1090
1157
  // Trigger "my pictures" shortcut action
1091
1158
  if(userAccount) {
@@ -1250,10 +1317,12 @@ export default class Widgets {
1250
1317
  });
1251
1318
 
1252
1319
  // Show/hide zoom in warning when map zoom changes
1253
- const lblZoomIn = document.getElementById("gvs-filter-zoomin");
1320
+ const lblsZoomIn = document.getElementsByClassName("gvs-filter-zoomin");
1254
1321
  const changeLblZoomInDisplay = () => {
1255
- if(this._viewer.map.getZoom() < 7) { lblZoomIn.style.display = null; }
1256
- else { lblZoomIn.style.display = "none"; }
1322
+ for(let lblZoomIn of lblsZoomIn) {
1323
+ if(this._viewer.map.getZoom() < 7) { lblZoomIn.style.display = null; }
1324
+ else { lblZoomIn.style.display = "none"; }
1325
+ }
1257
1326
  };
1258
1327
  changeLblZoomInDisplay();
1259
1328
  this._viewer.map.on("zoomend", changeLblZoomInDisplay);
@@ -16,6 +16,7 @@ exports[`_addMapBackgroundWidget works 1`] = `
16
16
  for="gvs-map-bg-streets"
17
17
  >
18
18
  <img
19
+ alt=""
19
20
  src="bg_streets.jpg"
20
21
  />
21
22
  Streets
@@ -30,6 +31,7 @@ exports[`_addMapBackgroundWidget works 1`] = `
30
31
  for="gvs-map-bg-aerial"
31
32
  >
32
33
  <img
34
+ alt=""
33
35
  src="bg_aerial.jpg"
34
36
  />
35
37
  Aerial
@@ -1,6 +1,6 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`constructor works 1`] = `"<img src=\\"marker.svg\\" title=\\"undefined\\" class=\\"gvs-loader-img\\"><div><span>Loading...</span></div>"`;
3
+ exports[`constructor works 1`] = `"<img src=\\"marker.svg\\" alt=\\"\\" title=\\"undefined\\" class=\\"gvs-loader-img\\"><div><span>Loading...</span></div>"`;
4
4
 
5
5
  exports[`dismiss works when no error set 1`] = `
6
6
  Array [
@@ -12,4 +12,4 @@ Array [
12
12
  ]
13
13
  `;
14
14
 
15
- exports[`dismiss works with error set 1`] = `"<img src=\\"logo_dead.svg\\" title=\\"undefined\\" class=\\"gvs-loader-img\\" style=\\"width: 200px; animation: unset;\\"><div>undefined<br>Oops it's broken<br><small>undefined</small></div>"`;
15
+ exports[`dismiss works with error set 1`] = `"<img src=\\"logo_dead.svg\\" alt=\\"\\" title=\\"undefined\\" class=\\"gvs-loader-img\\" style=\\"width: 200px; animation: unset;\\"><div>undefined<br>Oops it's broken<br><small>undefined</small></div>"`;
@@ -19,6 +19,7 @@ Object {
19
19
  Object {
20
20
  "arrowStyle": Object {
21
21
  "element": <img
22
+ alt=""
22
23
  src="arrow_triangle.svg"
23
24
  />,
24
25
  "size": Object {
@@ -38,6 +39,7 @@ Object {
38
39
  Object {
39
40
  "arrowStyle": Object {
40
41
  "element": <img
42
+ alt=""
41
43
  src="arrow_triangle.svg"
42
44
  />,
43
45
  "size": Object {
@@ -21,7 +21,7 @@ Array [
21
21
  ]
22
22
  `;
23
23
 
24
- exports[`createSearchBar works 1`] = `"<input type=\\"text\\" placeholder=\\"no res\\" id=\\"mysrch-input\\"><span class=\\"gvs-search-bar-icon\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"magnifying-glass\\" class=\\"svg-inline--fa fa-magnifying-glass\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z\\"></path></svg></span><div id=\\"mysrch-panel\\" class=\\"gvs-panel gvs-widget-bg gvs-hidden gvs-search-bar-results\\"></div>"`;
24
+ exports[`createSearchBar works 1`] = `"<input type=\\"text\\" placeholder=\\"no res\\" id=\\"mysrch-input\\" autocomplete=\\"off\\"><span class=\\"gvs-search-bar-icon\\"><svg aria-hidden=\\"true\\" focusable=\\"false\\" data-prefix=\\"fas\\" data-icon=\\"magnifying-glass\\" class=\\"svg-inline--fa fa-magnifying-glass\\" role=\\"img\\" xmlns=\\"http://www.w3.org/2000/svg\\" viewBox=\\"0 0 512 512\\"><path fill=\\"currentColor\\" d=\\"M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z\\"></path></svg></span><div id=\\"mysrch-panel\\" class=\\"gvs-panel gvs-widget-bg gvs-hidden gvs-search-bar-results\\"></div>"`;
25
25
 
26
26
  exports[`fa works 1`] = `
27
27
  <svg