qwc2 2026.8.9 → 2026.8.13

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 (43) hide show
  1. package/actions/bookmark.js +0 -15
  2. package/actions/localConfig.js +0 -7
  3. package/components/BookmarkPanel.js +121 -124
  4. package/components/Icon.js +2 -0
  5. package/components/IdentifyViewer.js +4 -2
  6. package/components/StandardApp.js +0 -5
  7. package/components/map3d/Map3D.js +10 -8
  8. package/components/style/BookmarkPanel.css +2 -0
  9. package/components/style/Icon.css +4 -0
  10. package/components/widgets/InputContainer.js +2 -29
  11. package/components/widgets/style/InputContainer.css +2 -1
  12. package/package.json +1 -1
  13. package/plugins/Bookmark.js +25 -19
  14. package/plugins/BottomBar.js +2 -2
  15. package/plugins/Identify.js +4 -1
  16. package/plugins/MapFilter.js +48 -34
  17. package/plugins/VisibilityPreset.js +34 -23
  18. package/reducers/localConfig.js +2 -21
  19. package/static/translations/bg-BG.json +8 -6
  20. package/static/translations/ca-ES.json +8 -6
  21. package/static/translations/cs-CZ.json +8 -6
  22. package/static/translations/de-CH.json +8 -6
  23. package/static/translations/de-DE.json +8 -6
  24. package/static/translations/en-US.json +8 -6
  25. package/static/translations/es-ES.json +8 -6
  26. package/static/translations/fi-FI.json +8 -6
  27. package/static/translations/fr-FR.json +8 -6
  28. package/static/translations/hu-HU.json +8 -6
  29. package/static/translations/it-IT.json +8 -6
  30. package/static/translations/ja-JP.json +8 -6
  31. package/static/translations/nl-NL.json +8 -6
  32. package/static/translations/no-NO.json +8 -6
  33. package/static/translations/pl-PL.json +8 -6
  34. package/static/translations/pt-BR.json +8 -6
  35. package/static/translations/pt-PT.json +8 -6
  36. package/static/translations/ro-RO.json +8 -6
  37. package/static/translations/ru-RU.json +8 -6
  38. package/static/translations/sv-SE.json +8 -6
  39. package/static/translations/tr-TR.json +8 -6
  40. package/static/translations/tsconfig.json +8 -6
  41. package/static/translations/uk-UA.json +8 -6
  42. package/utils/LayerUtils.js +18 -5
  43. package/utils/PermaLinkUtils.js +254 -286
@@ -8,7 +8,6 @@
8
8
 
9
9
  import bookmarkReducer from '../reducers/bookmark';
10
10
  import ReducerIndex from '../reducers/index';
11
- import { getBookmarks, getVisibilityPresets } from '../utils/PermaLinkUtils';
12
11
  ReducerIndex.register("bookmark", bookmarkReducer);
13
12
  export var SET_BOOKMARKS = 'SET_BOOKMARKS';
14
13
  export var SET_VISIBILITY_PRESETS = 'SET_VISIBILITY_PRESETS';
@@ -23,18 +22,4 @@ export function setVisibilityPresets(visibilityPresets) {
23
22
  type: SET_VISIBILITY_PRESETS,
24
23
  visibilityPresets: visibilityPresets
25
24
  };
26
- }
27
- export function refreshBookmarks() {
28
- return function (dispatch) {
29
- getBookmarks(function (bookmarks) {
30
- return dispatch(setBookmarks(bookmarks));
31
- });
32
- };
33
- }
34
- export function refreshVisibilityPresets() {
35
- return function (dispatch) {
36
- getVisibilityPresets(function (presets) {
37
- return dispatch(setVisibilityPresets(presets));
38
- });
39
- };
40
25
  }
@@ -13,7 +13,6 @@ export var LOCAL_CONFIG_LOADED = 'LOCAL_CONFIG_LOADED';
13
13
  export var SET_STARTUP_PARAMETERS = 'SET_STARTUP_PARAMETERS';
14
14
  export var SET_COLOR_SCHEME = 'SET_COLOR_SCHEME';
15
15
  export var SET_USER_INFO_FIELDS = 'SET_USER_INFO_FIELDS';
16
- export var SET_PERMALINK_PARAMETERS = 'SET_PERMALINK_PARAMETERS';
17
16
  export var REGISTER_CUSTOM_PLUGIN = 'REGISTER_CUSTOM_PLUGIN';
18
17
  export var UNREGISTER_CUSTOM_PLUGIN = 'UNREGISTER_CUSTOM_PLUGIN';
19
18
  export function localConfigLoaded(config) {
@@ -43,12 +42,6 @@ export function setUserInfoFields(fields) {
43
42
  fields: fields
44
43
  };
45
44
  }
46
- export function setPermalinkParameters(params) {
47
- return {
48
- type: SET_PERMALINK_PARAMETERS,
49
- params: params
50
- };
51
- }
52
45
  export function registerCustomPlugin(name, availableIn3D) {
53
46
  return {
54
47
  type: REGISTER_CUSTOM_PLUGIN,
@@ -31,15 +31,6 @@ import ConfigUtils from '../utils/ConfigUtils';
31
31
  import LocaleUtils from '../utils/LocaleUtils';
32
32
  import MiscUtils from '../utils/MiscUtils';
33
33
  import './style/BookmarkPanel.css';
34
-
35
- /**
36
- * Allows managing user bookmarks.
37
- * or user visibility presets if `visibilityPresetsMode` is true.
38
- *
39
- * Bookmarks are only allowed for authenticated users.
40
- *
41
- * Requires `permalinkServiceUrl` to point to a `qwc-permalink-service`.
42
- */
43
34
  var BookmarkPanel = /*#__PURE__*/function (_React$Component) {
44
35
  function BookmarkPanel() {
45
36
  var _this;
@@ -49,193 +40,202 @@ var BookmarkPanel = /*#__PURE__*/function (_React$Component) {
49
40
  }
50
41
  _this = _callSuper(this, BookmarkPanel, [].concat(args));
51
42
  _defineProperty(_this, "state", {
52
- renameBookmark: null,
53
43
  currentBookmark: null,
44
+ rename: false,
54
45
  busy: false
55
46
  });
56
47
  _defineProperty(_this, "bookmarkClicked", function (ev, bookmark) {
57
- if (_this.state.renameBookmark) {
48
+ if (_this.state.rename) {
58
49
  // pass
59
50
  } else if (_this.props.openOnClick) {
60
51
  _this.props.onOpen(bookmark.key, ev.button === 1);
61
- } else if (_this.state.currentBookmark === bookmark.key) {
52
+ } else if (_this.state.currentBookmark === bookmark) {
62
53
  _this.setState({
63
54
  currentBookmark: null,
64
55
  description: ""
65
56
  });
66
57
  } else {
67
58
  _this.setState({
68
- currentBookmark: bookmark.key,
59
+ currentBookmark: bookmark,
69
60
  description: bookmark.description
70
61
  });
71
62
  }
72
63
  });
73
64
  _defineProperty(_this, "bookmarkDoubleClicked", function (ev, bookmark) {
74
- if (!_this.state.renameBookmark) {
65
+ if (!_this.state.rename) {
75
66
  _this.props.onOpen(bookmark.key, false);
76
67
  }
77
68
  });
78
- _defineProperty(_this, "updateBookmarkName", function (text) {
79
- _this.setState({
80
- busy: true
81
- });
82
- _this.props.onRename(_this.state.renameBookmark, text, function (success) {
83
- if (!success) {
84
- var _this$props$translati;
85
- /* eslint-disable-next-line */
86
- alert((_this$props$translati = _this.props.translations) === null || _this$props$translati === void 0 ? void 0 : _this$props$translati.savefailed);
87
- }
88
- _this.props.onRefresh();
89
- });
90
- });
91
69
  _defineProperty(_this, "addBookmark", function () {
92
- var _this$props$translati2;
93
70
  _this.setState({
94
71
  busy: true
95
72
  });
96
- _this.props.onAdd((_this$props$translati2 = _this.props.translations) === null || _this$props$translati2 === void 0 ? void 0 : _this$props$translati2.newbookmark, function (success, key) {
73
+ _this.props.bookmarkIface.create(_this.props.translations["new"], function (success, key) {
97
74
  if (!success) {
98
- var _this$props$translati3;
99
75
  /* eslint-disable-next-line */
100
- alert((_this$props$translati3 = _this.props.translations) === null || _this$props$translati3 === void 0 ? void 0 : _this$props$translati3.addfailed);
76
+ alert(_this.props.translations.addfailed);
77
+ _this.setState({
78
+ busy: false
79
+ });
80
+ } else {
81
+ _this.props.bookmarkIface.getList(function (bookmarks) {
82
+ _this.props.setList(bookmarks);
83
+ _this.setState({
84
+ rename: true,
85
+ currentBookmark: bookmarks.find(function (bk) {
86
+ return bk.key === key;
87
+ }),
88
+ busy: false
89
+ });
90
+ });
101
91
  }
102
- _this.props.onRefresh();
103
- });
104
- _this.setState({
105
- description: "",
106
- currentBookmark: null
107
92
  });
108
93
  });
109
- _defineProperty(_this, "updateBookmark", function (key) {
94
+ _defineProperty(_this, "updateBookmark", function (bookmark, params) {
95
+ var updateData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
96
+ // eslint-disable-next-line no-alert
97
+ if (updateData && !confirm(_this.props.translations.confirmOverwrite)) {
98
+ return;
99
+ }
110
100
  _this.setState({
111
101
  busy: true
112
102
  });
113
- var description = _this.props.bookmarks.find(function (bk) {
114
- return bk.key === key;
115
- }).description;
116
- _this.props.onUpdate(key, description, function (success) {
103
+ _this.props.bookmarkIface.update(bookmark.key, params, updateData, function (success) {
117
104
  if (!success) {
118
- var _this$props$translati4;
119
105
  /* eslint-disable-next-line */
120
- alert((_this$props$translati4 = _this.props.translations) === null || _this$props$translati4 === void 0 ? void 0 : _this$props$translati4.savefailed);
106
+ alert(_this.props.translations.savefailed);
107
+ _this.setState({
108
+ busy: false
109
+ });
110
+ } else {
111
+ _this.props.bookmarkIface.getList(function (bookmarks) {
112
+ _this.props.setList(bookmarks);
113
+ _this.setState({
114
+ rename: false,
115
+ currentBookmark: bookmarks.find(function (bk) {
116
+ return bk.key === bookmark.key;
117
+ }),
118
+ busy: false
119
+ });
120
+ });
121
121
  }
122
- _this.props.onRefresh();
123
122
  });
124
123
  });
125
- _defineProperty(_this, "removeBookmark", function (key) {
124
+ _defineProperty(_this, "removeBookmark", function (bookmark) {
125
+ // eslint-disable-next-line no-alert
126
+ if (!confirm(_this.props.translations.confirmDelete)) {
127
+ return;
128
+ }
126
129
  _this.setState({
127
130
  busy: true
128
131
  });
129
- _this.props.onRemove(key, function (success) {
132
+ _this.props.bookmarkIface["delete"](bookmark.key, function (success) {
130
133
  if (!success) {
131
- var _this$props$translati5;
132
134
  /* eslint-disable-next-line */
133
- alert((_this$props$translati5 = _this.props.translations) === null || _this$props$translati5 === void 0 ? void 0 : _this$props$translati5.removefailed);
135
+ alert(_this.props.translations.removefailed);
136
+ _this.setState({
137
+ busy: false
138
+ });
134
139
  }
135
- _this.props.onRefresh();
140
+ _this.props.bookmarkIface.getList(function (bookmarks) {
141
+ _this.props.setList(bookmarks);
142
+ _this.setState({
143
+ rename: false,
144
+ currentBookmark: null,
145
+ busy: false
146
+ });
147
+ });
136
148
  });
137
149
  });
138
150
  return _this;
139
151
  }
140
152
  _inherits(BookmarkPanel, _React$Component);
141
153
  return _createClass(BookmarkPanel, [{
142
- key: "componentDidUpdate",
143
- value: function componentDidUpdate(prevProps) {
144
- // Check exact identity of bookmarks array to reset busy state in all cases
145
- if (prevProps.bookmarks !== this.props.bookmarks) {
146
- this.setState({
147
- renameBookmark: null,
148
- busy: false
149
- });
150
- // Select a recently added bookmark
151
- var addedBookmark = this.props.bookmarks.find(function (bookmark) {
152
- return !prevProps.bookmarks.some(function (prevBookmark) {
153
- return prevBookmark.key === bookmark.key;
154
- });
155
- });
156
- if (addedBookmark) {
157
- this.setState({
158
- renameBookmark: addedBookmark.key,
159
- currentBookmark: null
160
- });
161
- }
162
- }
163
- }
164
- }, {
165
154
  key: "render",
166
155
  value: function render() {
167
- var _this$props$translati6,
168
- _this$props$translati7,
169
- _this$props$translati8,
170
- _this2 = this,
171
- _this$props$translati9,
172
- _this$props$translati0,
173
- _this$props$translati1,
174
- _this$props$translati10,
175
- _this$props$translati11;
156
+ var _this2 = this;
176
157
  var username = ConfigUtils.getConfigProp("username");
158
+ var hasPublicBookmarksCap = ConfigUtils.getConfigProp("capabilities", null, []).includes("public_bookmarks");
177
159
  var currentBookmark = this.state.currentBookmark;
178
160
  var buttonsDisabled = !currentBookmark || this.state.busy;
179
- return !username ? /*#__PURE__*/React.createElement("div", {
180
- className: "bookmark-body",
181
- role: "body"
182
- }, " ", (_this$props$translati6 = this.props.translations) === null || _this$props$translati6 === void 0 ? void 0 : _this$props$translati6.notloggedin) : /*#__PURE__*/React.createElement("div", {
161
+ var updatable = currentBookmark === null || currentBookmark === void 0 ? void 0 : currentBookmark.own;
162
+ return /*#__PURE__*/React.createElement("div", {
183
163
  className: "bookmark-body",
184
164
  role: "body"
185
165
  }, /*#__PURE__*/React.createElement("h4", {
186
166
  className: "bookmark-header"
187
- }, /*#__PURE__*/React.createElement("span", null, (_this$props$translati7 = this.props.translations) === null || _this$props$translati7 === void 0 ? void 0 : _this$props$translati7.manage), /*#__PURE__*/React.createElement("button", {
167
+ }, /*#__PURE__*/React.createElement("span", null, this.props.translations.title), username ? /*#__PURE__*/React.createElement("button", {
188
168
  className: "button",
189
169
  onClick: this.addBookmark,
190
- title: (_this$props$translati8 = this.props.translations) === null || _this$props$translati8 === void 0 ? void 0 : _this$props$translati8.add
170
+ title: this.props.translations["new"]
191
171
  }, /*#__PURE__*/React.createElement(Icon, {
192
172
  icon: "plus"
193
- }))), !this.props.openOnClick ? /*#__PURE__*/React.createElement("div", {
173
+ })) : null), !this.props.openOnClick ? /*#__PURE__*/React.createElement("div", {
194
174
  className: "bookmark-actions controlgroup"
195
175
  }, /*#__PURE__*/React.createElement("button", {
196
176
  className: "button",
197
177
  disabled: buttonsDisabled,
198
178
  onClick: function onClick() {
199
- return _this2.props.onOpen(currentBookmark, false);
179
+ return _this2.props.onOpen(currentBookmark.key, false);
200
180
  },
201
- title: (_this$props$translati9 = this.props.translations) === null || _this$props$translati9 === void 0 ? void 0 : _this$props$translati9.open
181
+ title: this.props.translations.open
202
182
  }, /*#__PURE__*/React.createElement(Icon, {
203
183
  icon: "folder-open"
204
- })), this.props.showOpenTab ? /*#__PURE__*/React.createElement("button", {
184
+ })), /*#__PURE__*/React.createElement("button", {
205
185
  className: "button",
206
186
  disabled: buttonsDisabled,
207
187
  onClick: function onClick() {
208
- return _this2.props.onOpen(currentBookmark, true);
188
+ return _this2.props.onOpen(currentBookmark.key, true);
209
189
  },
210
- title: (_this$props$translati0 = this.props.translations) === null || _this$props$translati0 === void 0 ? void 0 : _this$props$translati0.openTab
190
+ title: this.props.translations.openTab
211
191
  }, /*#__PURE__*/React.createElement(Icon, {
212
192
  icon: "open_link"
213
- })) : null, this.props.showZoomToExtent ? /*#__PURE__*/React.createElement("button", {
193
+ })), this.props.onZoomToExtent ? /*#__PURE__*/React.createElement("button", {
214
194
  className: "button",
215
195
  disabled: buttonsDisabled,
216
196
  onClick: function onClick() {
217
- return _this2.props.onZoomToExtent(currentBookmark);
197
+ return _this2.props.onZoomToExtent(currentBookmark.key);
218
198
  },
219
- title: (_this$props$translati1 = this.props.translations) === null || _this$props$translati1 === void 0 ? void 0 : _this$props$translati1.zoomToExtent
199
+ title: this.props.translations.zoomToExtent
220
200
  }, /*#__PURE__*/React.createElement(Icon, {
221
201
  icon: "zoom"
222
202
  })) : null, /*#__PURE__*/React.createElement("button", {
223
203
  className: "button",
224
- disabled: buttonsDisabled,
204
+ disabled: !updatable,
225
205
  onClick: function onClick() {
226
- return _this2.updateBookmark(currentBookmark);
206
+ return _this2.updateBookmark(currentBookmark, {}, true);
227
207
  },
228
- title: (_this$props$translati10 = this.props.translations) === null || _this$props$translati10 === void 0 ? void 0 : _this$props$translati10.update
208
+ title: this.props.translations.update
229
209
  }, /*#__PURE__*/React.createElement(Icon, {
230
210
  icon: "save"
231
211
  }))) : null, /*#__PURE__*/React.createElement("div", {
232
212
  className: "bookmark-list"
233
213
  }, this.props.bookmarks.map(function (bookmark) {
234
- var _this2$props$translat;
235
214
  var itemclasses = classnames({
236
215
  "bookmark-list-item": true,
237
- "bookmark-list-item-active": currentBookmark === bookmark.key
216
+ "bookmark-list-item-active": (currentBookmark === null || currentBookmark === void 0 ? void 0 : currentBookmark.key) === bookmark.key
238
217
  });
218
+ var renaming = (currentBookmark === null || currentBookmark === void 0 ? void 0 : currentBookmark.key) === bookmark.key && _this2.state.rename;
219
+ var publicIcon = null;
220
+ if (bookmark.own && hasPublicBookmarksCap) {
221
+ publicIcon = /*#__PURE__*/React.createElement(Icon, {
222
+ disabled: _this2.state.busy,
223
+ icon: "public",
224
+ inactive: !bookmark["public"],
225
+ onClick: function onClick(ev) {
226
+ _this2.updateBookmark(bookmark, {
227
+ "public": !bookmark["public"]
228
+ });
229
+ MiscUtils.killEvent(ev);
230
+ },
231
+ title: _this2.props.translations.togglePublic
232
+ });
233
+ } else if (bookmark["public"]) {
234
+ publicIcon = /*#__PURE__*/React.createElement(Icon, {
235
+ icon: "public",
236
+ title: _this2.props.translations["public"]
237
+ });
238
+ }
239
239
  return /*#__PURE__*/React.createElement("div", {
240
240
  className: itemclasses,
241
241
  key: bookmark.key,
@@ -248,13 +248,17 @@ var BookmarkPanel = /*#__PURE__*/function (_React$Component) {
248
248
  onDoubleClick: function onDoubleClick(ev) {
249
249
  return _this2.bookmarkDoubleClicked(ev, bookmark);
250
250
  },
251
- title: ((_this2$props$translat = _this2.props.translations) === null || _this2$props$translat === void 0 ? void 0 : _this2$props$translat.lastUpdate) + ": " + bookmark.date
252
- }, _this2.state.renameBookmark === bookmark.key ? /*#__PURE__*/React.createElement(InputContainer, null, /*#__PURE__*/React.createElement(TextInput, {
251
+ title: _this2.props.translations.lastUpdate + ": " + bookmark.date
252
+ }, renaming ? /*#__PURE__*/React.createElement(InputContainer, null, /*#__PURE__*/React.createElement(TextInput, {
253
253
  focusOnRef: true,
254
- onChange: _this2.updateBookmarkName,
254
+ onChange: function onChange(text) {
255
+ return _this2.updateBookmark(bookmark, {
256
+ description: text
257
+ });
258
+ },
255
259
  onNoChange: function onNoChange() {
256
260
  return _this2.setState({
257
- renameBookmark: null
261
+ rename: false
258
262
  });
259
263
  },
260
264
  role: "input",
@@ -264,49 +268,42 @@ var BookmarkPanel = /*#__PURE__*/function (_React$Component) {
264
268
  icon: "ok",
265
269
  onClick: MiscUtils.killEvent,
266
270
  role: "suffix"
267
- })) : /*#__PURE__*/React.createElement("span", null, bookmark.description), _this2.state.renameBookmark !== bookmark.key ? /*#__PURE__*/React.createElement(Icon, {
271
+ })) : /*#__PURE__*/React.createElement("span", null, bookmark.description), !renaming ? publicIcon : null, bookmark.own && !renaming ? [/*#__PURE__*/React.createElement(Icon, {
272
+ disabled: _this2.state.busy,
268
273
  icon: "draw",
274
+ key: "draw",
269
275
  onClick: function onClick(ev) {
270
276
  _this2.setState({
271
- renameBookmark: bookmark.key,
272
- currentBookmark: null
277
+ currentBookmark: bookmark,
278
+ rename: true
273
279
  });
274
280
  MiscUtils.killEvent(ev);
275
281
  },
276
282
  title: LocaleUtils.tr("common.rename")
277
- }) : null, _this2.state.renameBookmark !== bookmark.key ? /*#__PURE__*/React.createElement(Icon, {
283
+ }), /*#__PURE__*/React.createElement(Icon, {
278
284
  disabled: _this2.state.busy,
279
285
  icon: "trash",
286
+ key: "trash",
280
287
  onClick: function onClick(ev) {
281
- _this2.removeBookmark(bookmark.key);
288
+ _this2.removeBookmark(bookmark);
282
289
  MiscUtils.killEvent(ev);
283
290
  },
284
291
  title: LocaleUtils.tr("common.delete")
285
- }) : null);
292
+ })] : null);
286
293
  }), isEmpty(this.props.bookmarks) ? /*#__PURE__*/React.createElement("div", {
287
294
  className: "bookmark-list-item-empty"
288
- }, (_this$props$translati11 = this.props.translations) === null || _this$props$translati11 === void 0 ? void 0 : _this$props$translati11.nobookmarks) : null));
295
+ }, this.props.translations.noitems) : null));
289
296
  }
290
297
  }]);
291
298
  }(React.Component);
292
299
  _defineProperty(BookmarkPanel, "availableIn3D", true);
293
300
  _defineProperty(BookmarkPanel, "propTypes", {
301
+ bookmarkIface: PropTypes.object,
294
302
  bookmarks: PropTypes.array,
295
- onAdd: PropTypes.func,
296
303
  onOpen: PropTypes.func,
297
- onRefresh: PropTypes.func,
298
- onRemove: PropTypes.func,
299
- onRename: PropTypes.func,
300
- onUpdate: PropTypes.func,
301
304
  onZoomToExtent: PropTypes.func,
302
- /** Whether to directly open the bookmark on click / middle click, instead of showing dedicated open buttons. */
303
305
  openOnClick: PropTypes.bool,
304
- showOpenTab: PropTypes.bool,
305
- showZoomToExtent: PropTypes.bool,
306
+ setList: PropTypes.func,
306
307
  translations: PropTypes.objectOf(PropTypes.string)
307
308
  });
308
- _defineProperty(BookmarkPanel, "defaultProps", {
309
- showOpenTab: true,
310
- showZoomToExtent: false
311
- });
312
309
  export default BookmarkPanel;
@@ -38,6 +38,7 @@ var Icon = /*#__PURE__*/function (_React$Component) {
38
38
  var classes = classnames(_defineProperty(_defineProperty(_defineProperty({
39
39
  icon: true,
40
40
  icon_disabled: this.props.disabled,
41
+ icon_inactive: this.props.inactive,
41
42
  icon_clickable: !!this.props.onClick || !!this.props.onMouseDown || !!this.props.onPointerDown
42
43
  }, "icon-" + this.props.icon, true), "icon_" + this.props.size, !!this.props.size), this.props.className, !!this.props.className));
43
44
  var tabIndex = undefined;
@@ -85,6 +86,7 @@ _defineProperty(Icon, "propTypes", {
85
86
  className: PropTypes.string,
86
87
  disabled: PropTypes.bool,
87
88
  icon: PropTypes.string,
89
+ inactive: PropTypes.bool,
88
90
  onClick: PropTypes.func,
89
91
  onMouseDown: PropTypes.func,
90
92
  onMouseUp: PropTypes.func,
@@ -363,8 +363,10 @@ var IdentifyViewer = /*#__PURE__*/function (_React$Component) {
363
363
  _defineProperty(_this, "storeIdentifyResults", function () {
364
364
  return new Promise(function (resolve) {
365
365
  return resolve({
366
- identifyResults: _this.serializeResults(),
367
- currentResultDisplayMode: _this.props.resultDisplayMode
366
+ state: {
367
+ identifyResults: _this.serializeResults(),
368
+ currentResultDisplayMode: _this.props.resultDisplayMode
369
+ }
368
370
  });
369
371
  });
370
372
  });
@@ -40,7 +40,6 @@ import deepmerge from 'deepmerge';
40
40
  import { register as olProj4Register } from 'ol/proj/proj4';
41
41
  import Proj4js from 'proj4';
42
42
  import PropTypes from 'prop-types';
43
- import { refreshBookmarks, refreshVisibilityPresets } from '../actions/bookmark';
44
43
  import { localConfigLoaded, setStartupParameters, setColorScheme } from '../actions/localConfig';
45
44
  import { changeLocale } from '../actions/locale';
46
45
  import { setCurrentTask } from '../actions/task';
@@ -337,10 +336,6 @@ var StandardApp = /*#__PURE__*/function (_React$Component2) {
337
336
  var colorScheme = initialParams.style || storedColorScheme || ConfigUtils.getConfigProp("defaultColorScheme");
338
337
  StandardApp.store.dispatch(setColorScheme(colorScheme));
339
338
 
340
- // Load all bookmarks & visiblity presets
341
- StandardApp.store.dispatch(refreshBookmarks());
342
- StandardApp.store.dispatch(refreshVisibilityPresets());
343
-
344
339
  // Resolve permalink and restore settings
345
340
  resolvePermaLink(initialParams, function (params, state, success) {
346
341
  StandardApp.store.dispatch(setStartupParameters(params, state));
@@ -1261,14 +1261,16 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
1261
1261
  };
1262
1262
  });
1263
1263
  resolve({
1264
- objects: objects,
1265
- colorLayers: layers,
1266
- baseLayer: ((_this2$state$sceneCon6 = _this2.state.sceneContext.baseLayers.find(function (layer) {
1267
- return layer.visibility === true;
1268
- })) === null || _this2$state$sceneCon6 === void 0 ? void 0 : _this2$state$sceneCon6.name) || "",
1269
- personHeight: (_this2$state$sceneCon7 = _this2.state.sceneContext.scene.view.controls.personHeight) !== null && _this2$state$sceneCon7 !== void 0 ? _this2$state$sceneCon7 : 0,
1270
- camera: [camera.x, camera.y, camera.z],
1271
- target: [target.x, target.y, target.z]
1264
+ state: {
1265
+ objects: objects,
1266
+ colorLayers: layers,
1267
+ baseLayer: ((_this2$state$sceneCon6 = _this2.state.sceneContext.baseLayers.find(function (layer) {
1268
+ return layer.visibility === true;
1269
+ })) === null || _this2$state$sceneCon6 === void 0 ? void 0 : _this2$state$sceneCon6.name) || "",
1270
+ personHeight: (_this2$state$sceneCon7 = _this2.state.sceneContext.scene.view.controls.personHeight) !== null && _this2$state$sceneCon7 !== void 0 ? _this2$state$sceneCon7 : 0,
1271
+ camera: [camera.x, camera.y, camera.z],
1272
+ target: [target.x, target.y, target.z]
1273
+ }
1272
1274
  });
1273
1275
  });
1274
1276
  });
@@ -37,6 +37,8 @@ div.bookmark-list-item {
37
37
  div.bookmark-list-item > div.input-container {
38
38
  flex: 1 1 auto;
39
39
  border: none;
40
+ color: var(--text-color);
41
+ border: 1px solid var(--color-active);
40
42
  }
41
43
 
42
44
  div.bookmark-list-item-empty {
@@ -25,3 +25,7 @@ span.icon_xlarge:before {
25
25
  cursor: default;
26
26
  color: var(--text-color-disabled);
27
27
  }
28
+
29
+ .icon_inactive {
30
+ color: #ccc;
31
+ }
@@ -32,40 +32,19 @@ var InputContainer = /*#__PURE__*/function (_React$Component) {
32
32
  args[_key] = arguments[_key];
33
33
  }
34
34
  _this = _callSuper(this, InputContainer, [].concat(args));
35
- _defineProperty(_this, "state", {
36
- focused: false
37
- });
38
35
  _defineProperty(_this, "findChild", function (role) {
39
36
  return React.Children.toArray(_this.props.children).filter(function (child) {
40
37
  return child.props.role === role;
41
38
  });
42
39
  });
43
- _defineProperty(_this, "onInputBlur", function (ev, origHandler) {
44
- if (origHandler) {
45
- origHandler(ev);
46
- }
47
- _this.setState({
48
- focused: false
49
- });
50
- });
51
- _defineProperty(_this, "onInputFocus", function (ev, origHandler) {
52
- if (origHandler) {
53
- origHandler(ev);
54
- }
55
- _this.setState({
56
- focused: true
57
- });
58
- });
59
40
  return _this;
60
41
  }
61
42
  _inherits(InputContainer, _React$Component);
62
43
  return _createClass(InputContainer, [{
63
44
  key: "render",
64
45
  value: function render() {
65
- var _this2 = this;
66
46
  var containerClasses = classnames(_defineProperty({
67
- "input-container": true,
68
- "input-container-focus": this.state.focused
47
+ "input-container": true
69
48
  }, this.props.className, !!this.props.className));
70
49
  var prefix = this.findChild("prefix").map(function (el) {
71
50
  return /*#__PURE__*/React.cloneElement(el, {
@@ -74,13 +53,7 @@ var InputContainer = /*#__PURE__*/function (_React$Component) {
74
53
  });
75
54
  var input = this.findChild("input").map(function (el) {
76
55
  return /*#__PURE__*/React.cloneElement(el, {
77
- className: "input-container-input " + (el.props.className || ""),
78
- onBlur: function onBlur(ev) {
79
- return _this2.onInputBlur(ev, el.props.onBlur);
80
- },
81
- onFocus: function onFocus(ev) {
82
- return _this2.onInputFocus(ev, el.props.onFocus);
83
- }
56
+ className: "input-container-input " + (el.props.className || "")
84
57
  });
85
58
  });
86
59
  var suffix = this.findChild("suffix").map(function (el) {
@@ -12,7 +12,7 @@ div.input-container div.input-container {
12
12
  height: calc(2em - 2px);
13
13
  }
14
14
 
15
- div.input-container-focus {
15
+ div.input-container:focus-within {
16
16
  outline: var(--focus-outline);
17
17
  }
18
18
 
@@ -33,4 +33,5 @@ div.input-container .input-container-input {
33
33
 
34
34
  div.input-container .input-container-input {
35
35
  height: calc(2em - 2px)!important;
36
+ min-height: calc(2em - 2px)!important;
36
37
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2026.08.09",
3
+ "version": "2026.08.13",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",