@panoramax/web-viewer 3.1.1-develop-9c3a5399 → 3.1.1-develop-74158191

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panoramax/web-viewer",
3
- "version": "3.1.1-develop-9c3a5399",
3
+ "version": "3.1.1-develop-74158191",
4
4
  "description": "Panoramax web viewer for geolocated pictures",
5
5
  "main": "build/index.js",
6
6
  "author": "Panoramax team",
package/src/Viewer.js CHANGED
@@ -235,6 +235,7 @@ class Viewer extends CoreView {
235
235
  const userSearchField = document.getElementById("gvs-filter-search-user").querySelector("input");
236
236
  if(userSearchField) {
237
237
  userSearchField.setItem(userNames);
238
+ userSearchField.parentNode.classList.add("gvs-filter-active");
238
239
  }
239
240
  }).catch(e => console.warn("Error when looking up for user names", e));
240
241
  }
@@ -33,4 +33,9 @@
33
33
  .gvs-psv-tour-arrows svg {
34
34
  width: 100%;
35
35
  height: auto;
36
+ }
37
+
38
+ /* No virtual tour arrows if photo is reduced */
39
+ .gvs-mini .gvs-psv .psv-virtual-tour-arrows {
40
+ display: none;
36
41
  }
@@ -62,6 +62,19 @@ export function createExpandableButton(id, icon, label, container, classes = [])
62
62
  btn.title = label;
63
63
  }
64
64
  btn.classList.add("gvs-btn", "gvs-widget-bg", "gvs-btn-expandable", ...classes);
65
+ btn.setActive = val => {
66
+ let span = btn.querySelector(".gvs-filters-active");
67
+ if(val && !span) {
68
+ span = document.createElement("span");
69
+ span.classList.add("gvs-filters-active");
70
+ const svg = btn.querySelector("svg");
71
+ if(svg.nextSibling) { btn.insertBefore(span, svg.nextSibling); }
72
+ else { btn.appendChild(span); }
73
+ }
74
+ else if(!val && span) {
75
+ span.remove();
76
+ }
77
+ };
65
78
  return btn;
66
79
  }
67
80
 
@@ -207,6 +207,63 @@ span.gvs-input-btn {
207
207
  width: 100%;
208
208
  }
209
209
 
210
+ /* Checkbox looking like buttons */
211
+ .gvs-input-group.gvs-checkbox-btns {
212
+ gap: 0;
213
+ }
214
+ .gvs-checkbox-btns label {
215
+ display: inline-block;
216
+ padding: 2px 7px;
217
+ background: none;
218
+ border: 1px solid var(--widget-border-btn);
219
+ color: var(--widget-font-btn-direct);
220
+ cursor: pointer;
221
+ font-size: 16px;
222
+ text-decoration: none;
223
+ border-left-width: 0px;
224
+ }
225
+ .gvs-checkbox-btns label:hover {
226
+ background-color: var(--widget-bg-hover);
227
+ }
228
+ .gvs-checkbox-btns label:first-of-type {
229
+ border-top-left-radius: 8px;
230
+ border-bottom-left-radius: 8px;
231
+ border-left-width: 1px;
232
+ }
233
+ .gvs-checkbox-btns label:last-of-type {
234
+ border-top-right-radius: 8px;
235
+ border-bottom-right-radius: 8px;
236
+ }
237
+ .gvs-checkbox-btns input[type="checkbox"] { display: none; }
238
+ .gvs-checkbox-btns input[type="checkbox"]:checked + label {
239
+ background-color: var(--widget-bg-active);
240
+ color: var(--widget-font-active);
241
+ }
242
+ .gvs-checkbox-btns input[type="checkbox"]:checked + label:first-of-type {
243
+ border-right-color: white;
244
+ }
245
+
246
+ /* Input shortcuts */
247
+ .gvs-input-shortcuts {
248
+ margin-top: -10px;
249
+ margin-bottom: 5px;
250
+ }
251
+ .gvs-input-shortcuts button {
252
+ border: none;
253
+ height: 20px;
254
+ line-height: 20px;
255
+ font-size: 11px;
256
+ padding: 0 8px;
257
+ vertical-align: middle;
258
+ background-color: var(--grey-pale);
259
+ color: var(--black);
260
+ border-radius: 10px;
261
+ cursor: pointer;
262
+ }
263
+ .gvs-input-shortcuts button:hover {
264
+ background-color: #d9dcd9;
265
+ }
266
+
210
267
 
211
268
  /* Group */
212
269
  .gvs-group {
@@ -591,10 +648,25 @@ a.gvs-btn { text-decoration: none; }
591
648
 
592
649
  /* Filters */
593
650
  #gvs-filter { margin-bottom: 5px; }
651
+ .gvs-filters-active {
652
+ width: 15px;
653
+ height: 15px;
654
+ border-radius: 8px;
655
+ border: 3px solid white;
656
+ position: absolute;
657
+ left: 20px;
658
+ top: 5px;
659
+ background-color: var(--orange);
660
+ }
594
661
  #gvs-filter-panel {
595
662
  width: 350px;
596
663
  max-width: 350px;
597
664
  }
665
+ #gvs-filter-panel .gvs-filter-active {
666
+ background-color: var(--widget-bg-active);
667
+ border-color: var(--widget-bg-active);
668
+ color: var(--widget-font-active);
669
+ }
598
670
  #gvs-filter-panel input[type=date] {
599
671
  min-width: 0;
600
672
  flex-grow: 2;
@@ -602,6 +674,10 @@ a.gvs-btn { text-decoration: none; }
602
674
  text-align: center;
603
675
  }
604
676
  #gvs-filter-camera-model, #gvs-filter-search-user { width: 100%; }
677
+ #gvs-filter-search-user.gvs-filter-active input {
678
+ color: var(--widget-font-active);
679
+ background: none;
680
+ }
605
681
  #gvs-filter-zoomin {
606
682
  text-align: center;
607
683
  font-weight: bold;
@@ -978,17 +978,21 @@ export default class Widgets {
978
978
  <form id="gvs-filter-form">
979
979
  <div id="gvs-filter-zoomin">${fat(faTriangleExclamation)} ${this._t.gvs.filter_zoom_in}</div>
980
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]}">1 mois</button>
983
+ <button data-for="gvs-filter-date-from" data-value="${new Date(new Date().setFullYear(new Date().getFullYear() - 1)).toISOString().split("T")[0]}">1 an</button>
984
+ </div>
981
985
  <div class="gvs-input-group">
982
986
  <input type="date" id="gvs-filter-date-from" />
983
987
  ${fat(faArrowRight)}
984
988
  <input type="date" id="gvs-filter-date-end" />
985
989
  </div>
986
990
  <h4>${fat(faImage)} ${this._t.gvs.filter_picture}</h4>
987
- <div class="gvs-input-group" style="justify-content: center;">
991
+ <div class="gvs-input-group gvs-checkbox-btns" style="justify-content: center;">
988
992
  <input type="checkbox" id="gvs-filter-type-flat" name="flat" checked />
989
- <label for="gvs-filter-type-flat" style="margin-right: 20px">${this._t.gvs.picture_flat}</label>
993
+ <label for="gvs-filter-type-flat">${fat(faImage)} ${this._t.gvs.picture_flat}</label>
990
994
  <input type="checkbox" id="gvs-filter-type-360" name="360" checked />
991
- <label for="gvs-filter-type-360">${this._t.gvs.picture_360}</label>
995
+ <label for="gvs-filter-type-360">${fat(faPanorama)} ${this._t.gvs.picture_360}</label>
992
996
  </div>
993
997
  </form>
994
998
  `;
@@ -1046,17 +1050,25 @@ export default class Widgets {
1046
1050
  input.id = "gvs-filter-user";
1047
1051
  input.classList.add("gvs-input-group");
1048
1052
 
1049
- const userSearch = createSearchBar(
1053
+ let userSearch;
1054
+ userSearch = createSearchBar(
1050
1055
  "gvs-filter-search-user",
1051
1056
  this._t.gvs.search_user,
1052
- q => this._viewer._api.searchUsers(q)
1053
- .then(data => ((data || [])
1054
- .map(f => ({
1055
- title: f.label,
1056
- data: f
1057
- }))
1058
- )),
1059
- d => this._viewer.map.setVisibleUsers(d ? [d.data.id] : ["geovisio"]),
1057
+ q => {
1058
+ userSearch.classList.remove("gvs-filter-active");
1059
+ return this._viewer._api.searchUsers(q)
1060
+ .then(data => ((data || [])
1061
+ .map(f => ({
1062
+ title: f.label,
1063
+ data: f
1064
+ }))
1065
+ ));
1066
+ },
1067
+ d => {
1068
+ if(d) { userSearch.classList.add("gvs-filter-active"); }
1069
+ else { userSearch.classList.remove("gvs-filter-active"); }
1070
+ return this._viewer.map.setVisibleUsers(d ? [d.data.id] : ["geovisio"]);
1071
+ },
1060
1072
  this,
1061
1073
  true
1062
1074
  );
@@ -1064,6 +1076,27 @@ export default class Widgets {
1064
1076
  form.appendChild(input);
1065
1077
  }
1066
1078
 
1079
+ // Shortcuts
1080
+ pnlFilter.querySelectorAll(".gvs-input-shortcuts button").forEach(btn => {
1081
+ btn.addEventListener("click", () => {
1082
+ const elem = document.getElementById(btn.getAttribute("data-for"));
1083
+ const val = btn.getAttribute("data-value");
1084
+ if(elem && elem.value !== val) { elem.value = val; }
1085
+ else { elem.value = ""; }
1086
+ });
1087
+ });
1088
+
1089
+ // Fields change events (for active highlighting)
1090
+ const fMinDate = document.getElementById("gvs-filter-date-from");
1091
+ const fMaxDate = document.getElementById("gvs-filter-date-end");
1092
+ [fMinDate, fMaxDate].forEach(f => {
1093
+ f.addEventListener("change", () => {
1094
+ if(f.value) { f.classList.add("gvs-filter-active"); }
1095
+ else { f.classList.remove("gvs-filter-active"); }
1096
+ });
1097
+ });
1098
+
1099
+ // Form update events
1067
1100
  this._formDelay = null;
1068
1101
 
1069
1102
  const onFormChange = () => {
@@ -1136,6 +1169,7 @@ export default class Widgets {
1136
1169
  * @private
1137
1170
  */
1138
1171
  _listenMapFiltersChanges() {
1172
+ const btnFilter = document.getElementById("gvs-filter");
1139
1173
  const fMinDate = document.getElementById("gvs-filter-date-from");
1140
1174
  const fMaxDate = document.getElementById("gvs-filter-date-end");
1141
1175
  const fTypeFlat = document.getElementById("gvs-filter-type-flat");
@@ -1149,8 +1183,16 @@ export default class Widgets {
1149
1183
 
1150
1184
  // Update widget based on programmatic filter changes
1151
1185
  this._viewer.addEventListener("filters-changed", e => {
1152
- if(e.detail.minDate) { fMinDate.value = e.detail.minDate; }
1153
- if(e.detail.maxDate) { fMaxDate.value = e.detail.maxDate; }
1186
+ if(e.detail.minDate) {
1187
+ fMinDate.value = e.detail.minDate;
1188
+ fMinDate.classList.add("gvs-filter-active");
1189
+ }
1190
+ else { fMinDate.classList.remove("gvs-filter-active"); }
1191
+ if(e.detail.maxDate) {
1192
+ fMaxDate.value = e.detail.maxDate;
1193
+ fMaxDate.classList.add("gvs-filter-active");
1194
+ }
1195
+ else { fMaxDate.classList.remove("gvs-filter-active"); }
1154
1196
  if(e.detail.theme) { fMapTheme.value = e.detail.theme; }
1155
1197
  if(e.detail.type) {
1156
1198
  fType360.checked = ["", "equirectangular"].includes(e.detail.type);
@@ -1163,6 +1205,7 @@ export default class Widgets {
1163
1205
  fScoreD.checked = e.detail.qualityscore.includes(2) && e.detail.qualityscore.length < 5;
1164
1206
  fScoreE.checked = e.detail.qualityscore.includes(1) && e.detail.qualityscore.length < 5;
1165
1207
  }
1208
+ btnFilter.setActive(Object.keys(e.detail).filter(d => d && d !== "theme").length > 0);
1166
1209
  this._onMapThemeChange();
1167
1210
  });
1168
1211