qwc2 2026.6.4 → 2026.6.9

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.
@@ -1,14 +1,14 @@
1
1
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
5
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
2
6
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
3
7
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
8
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
9
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
5
10
  function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
6
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
7
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
8
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
9
11
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
10
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
11
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
12
12
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
13
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
14
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
@@ -226,30 +226,25 @@ var AttributeForm = /*#__PURE__*/function (_React$Component) {
226
226
  _defineProperty(_this, "loadRelationValues", function (feature, callback) {
227
227
  if (!isEmpty(_this.state.relationTables)) {
228
228
  if (feature.id) {
229
- var relTables = Object.entries(_this.state.relationTables).map(function (_ref) {
230
- var _ref2 = _slicedToArray(_ref, 2),
231
- name = _ref2[0],
232
- entry = _ref2[1];
233
- if (entry.sortcol) {
234
- return name + ":" + entry.fk + ":" + entry.sortcol;
235
- } else {
236
- return name + ":" + entry.fk;
237
- }
238
- }).join(",");
229
+ // Existing feature, load relations from data service
230
+ var relTables = Object.values(_this.state.relationTables).map(function (entry) {
231
+ return _objectSpread(_objectSpread({}, entry), {}, {
232
+ fkVal: entry.pkField ? feature.properties[entry.pkField] : feature.id
233
+ });
234
+ });
239
235
  var mapEditConfigs = _this.props.editConfigs[_this.props.editContext.mapPrefix];
240
- _this.props.iface.getRelations(_this.props.editContext.editConfig, feature.id, _this.props.map.projection, relTables, mapEditConfigs, function (relationValues) {
236
+ _this.props.iface.getRelations(relTables, _this.props.map.projection, mapEditConfigs, function (relationValues) {
241
237
  var newFeature = _objectSpread(_objectSpread({}, feature), {}, {
242
238
  relationValues: relationValues
243
239
  });
244
240
  callback(newFeature);
245
241
  });
246
242
  } else {
247
- var relationValues = _objectSpread(_objectSpread({}, Object.entries(_this.state.relationTables).reduce(function (res, _ref3) {
248
- var _ref4 = _slicedToArray(_ref3, 2),
249
- name = _ref4[0],
250
- entry = _ref4[1];
251
- return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, name, {
252
- fk: entry.fk,
243
+ // New feature, create relationValues skeleton
244
+ var relationValues = _objectSpread(_objectSpread({}, Object.values(_this.state.relationTables).reduce(function (res, entry) {
245
+ return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, entry.table, {
246
+ fk: entry.fkField,
247
+ pk: entry.pkField,
253
248
  features: []
254
249
  }));
255
250
  }, {})), feature.relationValues);
@@ -273,7 +268,9 @@ var AttributeForm = /*#__PURE__*/function (_React$Component) {
273
268
  }
274
269
  // If feature id is known, i.e. not when drawing new feature, set foreign key
275
270
  if (_this.props.editContext.action !== "Draw") {
276
- newRelFeature.properties[_this.state.relationTables[table].fk] = _this.props.editContext.feature.id;
271
+ var relTable = _this.state.relationTables[table];
272
+ var fkVal = relTable.pkField ? _this.props.editContext.feature.properties[relTable.pkField] : _this.props.editContext.feature.id;
273
+ newRelFeature.properties[relTable.fkField] = fkVal;
277
274
  }
278
275
  newRelationValues[table] = _objectSpread({}, newRelationValues[table]);
279
276
  newRelationValues[table].features = newRelationValues[table].features.concat([newRelFeature]);
@@ -378,9 +375,11 @@ var AttributeForm = /*#__PURE__*/function (_React$Component) {
378
375
  });
379
376
  // If feature id is known, i.e. not when drawing new feature, set foreign key
380
377
  var changed = _this.props.editContext.changed;
378
+ var relTable = _this.state.relationTables[table];
379
+ var fkVal = relTable.pkField ? _this.props.editContext.feature.properties[relTable.pkField] : _this.props.editContext.feature.id;
381
380
  var fk = _this.state.relationTables[table].fk;
382
- if (_this.props.editContext.action !== "Draw" && feature.properties[fk] !== _this.props.editContext.feature.id) {
383
- newRelationValues[table].features[idx].properties[fk] = _this.props.editContext.feature.id;
381
+ if (_this.props.editContext.action !== "Draw" && feature.properties[fk] !== fkVal) {
382
+ newRelationValues[table].features[idx].properties[fk] = fkVal;
384
383
  newRelationValues[table].features[idx].__status__ = "changed";
385
384
  changed = true;
386
385
  }
@@ -455,10 +454,10 @@ var AttributeForm = /*#__PURE__*/function (_React$Component) {
455
454
  parseExpressionsAsync(constraintExpressions, feature, _this.props.editContext.editConfig, _this.props.iface, _this.props.editContext.mapPrefix, _this.props.map.projection, false).then(function (result) {
456
455
  var valid = _this.form.checkValidity();
457
456
  var reasons = [];
458
- Object.entries(result).forEach(function (_ref5) {
459
- var _ref6 = _slicedToArray(_ref5, 2),
460
- key = _ref6[0],
461
- value = _ref6[1];
457
+ Object.entries(result).forEach(function (_ref) {
458
+ var _ref2 = _slicedToArray(_ref, 2),
459
+ key = _ref2[0],
460
+ value = _ref2[1];
462
461
  var element = _this.form.elements.namedItem(key);
463
462
  if (element) {
464
463
  if (value === false) {
@@ -648,10 +647,10 @@ var AttributeForm = /*#__PURE__*/function (_React$Component) {
648
647
  delete feature.properties[key];
649
648
  }
650
649
  });
651
- Object.entries(relationValues).forEach(function (_ref7) {
652
- var _ref8 = _slicedToArray(_ref7, 2),
653
- dataset = _ref8[0],
654
- entry = _ref8[1];
650
+ Object.entries(relationValues).forEach(function (_ref3) {
651
+ var _ref4 = _slicedToArray(_ref3, 2),
652
+ dataset = _ref4[0],
653
+ entry = _ref4[1];
655
654
  var _dataset$split = dataset.split(".", 2),
656
655
  _dataset$split2 = _slicedToArray(_dataset$split, 2),
657
656
  mapName = _dataset$split2[0],
@@ -682,11 +681,11 @@ var AttributeForm = /*#__PURE__*/function (_React$Component) {
682
681
  }
683
682
  }
684
683
  });
685
- var sortcol = _this.state.relationTables[relTable].sortcol;
684
+ var sortField = _this.state.relationTables[relTable].sortField;
686
685
  var noreorder = _this.state.relationTables[relTable].noreorder;
687
- if (sortcol && !noreorder) {
688
- newRelFeature.__status__ = feature.__status__ || (newRelFeature.properties[sortcol] !== idx ? "changed" : "");
689
- newRelFeature.properties[sortcol] = idx;
686
+ if (sortField && !noreorder) {
687
+ newRelFeature.__status__ = feature.__status__ || (newRelFeature.properties[sortField] !== idx ? "changed" : "");
688
+ newRelFeature.properties[sortField] = idx;
690
689
  }
691
690
  return newRelFeature;
692
691
  });
@@ -694,16 +693,16 @@ var AttributeForm = /*#__PURE__*/function (_React$Component) {
694
693
  feature.relationValues = relationValues;
695
694
  var featureData = new FormData();
696
695
  featureData.set('feature', JSON.stringify(feature));
697
- Object.entries(featureUploads).forEach(function (_ref9) {
698
- var _ref0 = _slicedToArray(_ref9, 2),
699
- key = _ref0[0],
700
- value = _ref0[1];
696
+ Object.entries(featureUploads).forEach(function (_ref5) {
697
+ var _ref6 = _slicedToArray(_ref5, 2),
698
+ key = _ref6[0],
699
+ value = _ref6[1];
701
700
  return featureData.set('file:' + key, value);
702
701
  });
703
- Object.entries(relationUploads).forEach(function (_ref1) {
704
- var _ref10 = _slicedToArray(_ref1, 2),
705
- key = _ref10[0],
706
- value = _ref10[1];
702
+ Object.entries(relationUploads).forEach(function (_ref7) {
703
+ var _ref8 = _slicedToArray(_ref7, 2),
704
+ key = _ref8[0],
705
+ value = _ref8[1];
707
706
  return featureData.set('relfile:' + _this.props.editContext.mapPrefix + "." + key, value);
708
707
  });
709
708
  if (_this.state.captchaResponse) {
@@ -401,7 +401,7 @@ var QtDesignerForm = /*#__PURE__*/function (_React$Component) {
401
401
  })));
402
402
  } else if (widget["class"] === "QTextEdit" || widget["class"] === "QTextBrowser" || widget["class"] === "QPlainTextEdit") {
403
403
  var _feature$properties$w3, _feature$properties3;
404
- if (((_feature$properties$w3 = (_feature$properties3 = feature.properties) === null || _feature$properties3 === void 0 ? void 0 : _feature$properties3[widget.name]) !== null && _feature$properties$w3 !== void 0 ? _feature$properties$w3 : null) === null) {
404
+ if (value === "" && ((_feature$properties$w3 = (_feature$properties3 = feature.properties) === null || _feature$properties3 === void 0 ? void 0 : _feature$properties3[widget.name]) !== null && _feature$properties$w3 !== void 0 ? _feature$properties$w3 : null) === null) {
405
405
  var _ConfigUtils$getConfi;
406
406
  value = (_ConfigUtils$getConfi = ConfigUtils.getConfigProp("editTextNullValue")) !== null && _ConfigUtils$getConfi !== void 0 ? _ConfigUtils$getConfi : "";
407
407
  }
@@ -448,7 +448,7 @@ var QtDesignerForm = /*#__PURE__*/function (_React$Component) {
448
448
  var _feature$properties$w4, _feature$properties5;
449
449
  if (fieldConstraints.prec !== undefined && typeof value === 'number') {
450
450
  value = value.toFixed(fieldConstraints.prec);
451
- } else if (((_feature$properties$w4 = (_feature$properties5 = feature.properties) === null || _feature$properties5 === void 0 ? void 0 : _feature$properties5[widget.name]) !== null && _feature$properties$w4 !== void 0 ? _feature$properties$w4 : null) === null) {
451
+ } else if (value === "" && ((_feature$properties$w4 = (_feature$properties5 = feature.properties) === null || _feature$properties5 === void 0 ? void 0 : _feature$properties5[widget.name]) !== null && _feature$properties$w4 !== void 0 ? _feature$properties$w4 : null) === null) {
452
452
  var _ConfigUtils$getConfi2;
453
453
  value = (_ConfigUtils$getConfi2 = ConfigUtils.getConfigProp("editTextNullValue")) !== null && _ConfigUtils$getConfi2 !== void 0 ? _ConfigUtils$getConfi2 : "";
454
454
  }
@@ -1034,10 +1034,15 @@ var QtDesignerForm = /*#__PURE__*/function (_React$Component) {
1034
1034
  }
1035
1035
  var parts = widget.name.split("__");
1036
1036
  if (parts.length >= 3 && parts[0] === "nrel") {
1037
+ var _this$props$editConfi2, _this$props$editConfi3;
1037
1038
  relationTables[_this.props.mapPrefix + "." + parts[1]] = {
1038
- fk: parts[2],
1039
- sortcol: parts[3] || null,
1040
- noreorder: parts[4] || false
1039
+ table: _this.props.mapPrefix + "." + parts[1],
1040
+ fkField: parts[2],
1041
+ sortField: parts[3] || null,
1042
+ noreorder: parts[4] || false,
1043
+ pkField: (_this$props$editConfi2 = (_this$props$editConfi3 = _this.props.editConfig.reltables.find(function (entry) {
1044
+ return entry.id === widget.name;
1045
+ })) === null || _this$props$editConfi3 === void 0 ? void 0 : _this$props$editConfi3.referencedField) !== null && _this$props$editConfi2 !== void 0 ? _this$props$editConfi2 : null
1041
1046
  };
1042
1047
  }
1043
1048
  return verticalFill;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2026.06.04",
3
+ "version": "2026.06.09",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -1713,7 +1713,8 @@ var SensorThingsTool = /*#__PURE__*/function (_React$Component) {
1713
1713
  showDatastreamsFilterWindow: false
1714
1714
  });
1715
1715
  },
1716
- title: LocaleUtils.tr("sensorthingstool.datastreamsFilter.title")
1716
+ title: LocaleUtils.tr("sensorthingstool.datastreamsFilter.title"),
1717
+ usePortal: false
1717
1718
  }, /*#__PURE__*/React.createElement("div", {
1718
1719
  className: "sensor-things-dialog-body",
1719
1720
  role: "body"
@@ -2070,6 +2071,7 @@ var SensorThingsTool = /*#__PURE__*/function (_React$Component) {
2070
2071
  showWindow: false,
2071
2072
  pickGeom: null
2072
2073
  });
2074
+ _this.props.removeLayer("sensorThingsSelection");
2073
2075
  });
2074
2076
  _defineProperty(_this, "initPeriod", function () {
2075
2077
  if (_this.state.graph.x.min === null) {
@@ -2225,6 +2227,11 @@ var SensorThingsTool = /*#__PURE__*/function (_React$Component) {
2225
2227
  }
2226
2228
  var sensor = datastream.Sensor;
2227
2229
  var observedProperty = datastream.ObservedProperty;
2230
+ var unitOfMeasurement = datastream.unitOfMeasurement || {};
2231
+ if (unitOfMeasurement.symbol === undefined || unitOfMeasurement.symbol === null) {
2232
+ // set empty string as dummy symbol if missing
2233
+ unitOfMeasurement.symbol = "";
2234
+ }
2228
2235
  datastreamsLookup[datastreamId] = {
2229
2236
  locationId: location['@iot.id'],
2230
2237
  thing: {
@@ -2245,7 +2252,7 @@ var SensorThingsTool = /*#__PURE__*/function (_React$Component) {
2245
2252
  id: datastreamId,
2246
2253
  name: datastream.name,
2247
2254
  description: datastream.description,
2248
- unitOfMeasurement: datastream.unitOfMeasurement,
2255
+ unitOfMeasurement: unitOfMeasurement,
2249
2256
  phenomenonTime: datastream.phenomenonTime,
2250
2257
  period: {
2251
2258
  begin: periodBegin,
@@ -3081,7 +3088,8 @@ var SensorThingsTool = /*#__PURE__*/function (_React$Component) {
3081
3088
  onClose: function onClose() {
3082
3089
  return _this3.props.setCurrentTask(null);
3083
3090
  },
3084
- title: LocaleUtils.tr("sensorthingstool.title")
3091
+ title: LocaleUtils.tr("sensorthingstool.title"),
3092
+ usePortal: false
3085
3093
  }, this.renderBody()), this.renderLocationSelectPopup(), this.renderLocationInfoWindow(), this.renderDatastreamsFilterWindow(), this.renderDatastreamInfoWindow(), this.renderDatastreamTableWindow(), /*#__PURE__*/React.createElement(MapSelection, {
3086
3094
  active: this.state.locationPickingActive,
3087
3095
  cursor: "crosshair",
@@ -29,8 +29,10 @@ import { connect } from 'react-redux';
29
29
  import ol from 'openlayers';
30
30
  import PropTypes from 'prop-types';
31
31
  import { changeLocateState, changeLocatePosition, onLocateError } from '../../actions/locate';
32
+ import { zoomToPoint } from '../../actions/map';
32
33
  import CoordinatesUtils from '../../utils/CoordinatesUtils';
33
34
  import LocaleUtils from '../../utils/LocaleUtils';
35
+ import MapUtils from '../../utils/MapUtils';
34
36
  import './style/LocateSupport.css';
35
37
 
36
38
  /**
@@ -218,6 +220,12 @@ var LocateSupport = /*#__PURE__*/function (_React$Component) {
218
220
  this.requestedMode = "DISABLED";
219
221
  this.stop();
220
222
  }
223
+ if (newState === "FOLLOWING" && oldState !== "FOLLOWING" && this.props.followScale && this.props.scales) {
224
+ var mapPos = this.geolocate.getPosition();
225
+ if (mapPos) {
226
+ this.props.zoomToPoint(mapPos, MapUtils.computeZoom(this.props.scales, this.props.followScale), this.props.projection);
227
+ }
228
+ }
221
229
  }
222
230
  if (this.props.projection !== prevProps.projection) {
223
231
  this.geolocate.setProjection(this.props.projection);
@@ -235,12 +243,15 @@ _defineProperty(LocateSupport, "propTypes", {
235
243
  changeLocateState: PropTypes.func,
236
244
  /** Whether to draw an accuracy circle around the location point. */
237
245
  drawCircle: PropTypes.bool,
246
+ /** Scale denominator to zoom to when entering follow mode. If not set, the map zoom level is not changed. */
247
+ followScale: PropTypes.number,
238
248
  locateState: PropTypes.object,
239
249
  map: PropTypes.object,
240
250
  /** Whether to display the accuracy in meters (`true`) or in feet (`false`). */
241
251
  metric: PropTypes.bool,
242
252
  onLocateError: PropTypes.func,
243
253
  projection: PropTypes.string,
254
+ scales: PropTypes.arrayOf(PropTypes.number),
244
255
  /** Whether to show a popup displaying accuracy information when clicking on the location point. */
245
256
  showPopup: PropTypes.bool,
246
257
  /** The geolocation startup mode. Either `DISABLED`, `ENABLED` or `FOLLOWING`. */
@@ -249,7 +260,8 @@ _defineProperty(LocateSupport, "propTypes", {
249
260
  /** Whether to stop following when the map is dragged. */
250
261
  stopFollowingOnDrag: PropTypes.bool,
251
262
  /** Tracking options, as documented in the [HTML5 Geolocation spec](https://www.w3.org/TR/geolocation-API/#position_options_interface) */
252
- trackingOptions: PropTypes.object
263
+ trackingOptions: PropTypes.object,
264
+ zoomToPoint: PropTypes.func
253
265
  });
254
266
  _defineProperty(LocateSupport, "defaultProps", {
255
267
  drawCircle: true,
@@ -266,10 +278,12 @@ _defineProperty(LocateSupport, "defaultProps", {
266
278
  export default connect(function (state) {
267
279
  return {
268
280
  locateState: state.locate,
281
+ scales: state.map.scales,
269
282
  startupParams: state.localConfig.startupParams
270
283
  };
271
284
  }, {
272
285
  changeLocateState: changeLocateState,
273
286
  changeLocatePosition: changeLocatePosition,
274
- onLocateError: onLocateError
287
+ onLocateError: onLocateError,
288
+ zoomToPoint: zoomToPoint
275
289
  })(LocateSupport);
@@ -93,10 +93,10 @@ var Identify3D = /*#__PURE__*/function (_React$Component) {
93
93
  var picks = [];
94
94
  Object.values(_this.props.sceneContext.objectTree).forEach(function (entry) {
95
95
  var _object$tiles;
96
- if (!entry.objectId || !_this.props.sceneContext.objectIsVisible(entry.objectId)) {
96
+ var object = _this.props.sceneContext.getSceneObject(entry.objectId);
97
+ if (!entry.objectId || !_this.props.sceneContext.objectIsVisible(entry.objectId) || !object) {
97
98
  return;
98
99
  }
99
- var object = _this.props.sceneContext.getSceneObject(entry.objectId);
100
100
  if ((_object$tiles = object.tiles) !== null && _object$tiles !== void 0 && _object$tiles.raycast) {
101
101
  var intersections = [];
102
102
  object.tiles.raycast(raycaster, intersections);
@@ -1,4 +1,5 @@
1
1
  div.sensor-things-dialog-body {
2
+ height: 100%;
2
3
  display: flex;
3
4
  flex-direction: column;
4
5
  }
@@ -371,18 +371,16 @@ var EditingInterface = {
371
371
  },
372
372
  /**
373
373
  * Queries relation values of a feature
374
- * @param editConfig The edit config of the feature dataset
375
- * @param featureId The feature ID
374
+ * @param tables List of the form `[{"table": "<table>", "fkField": "<fk_field_name>", "fkVal": "<fk_val>", "sortCol": "<sort_col>", "pkField": "<pk_field>"}]`
376
375
  * @param mapCrs The CRS of the map, as an EPSG code
377
- * @param tables Comma separated string of relation table references in the form `<table_name>:<fk_name>:<sort_col>`
378
376
  * @param editConfigs The theme editConfig block, containing all theme dataset edit configs
379
377
  * @param callback Callback invoked with the relation values, taking `{<tablename>: {<relation_values>}}` on success and `{}` on failure
380
378
  */
381
- getRelations: function getRelations(editConfig, featureId, mapCrs, tables, editConfigs, callback) {
379
+ getRelations: function getRelations(tables, mapCrs, editConfigs, callback) {
382
380
  var editServiceUrl = ConfigUtils.getConfigProp("editServiceUrl").replace(/\/$/, '');
383
- var req = editServiceUrl + '/' + editConfig.editDataset + '/' + featureId + "/relations";
381
+ var req = editServiceUrl + '/relations';
384
382
  var params = {
385
- tables: tables,
383
+ tables: JSON.stringify(tables),
386
384
  crs: mapCrs
387
385
  };
388
386
  var headers = {