proximiio-js-library 1.9.26 → 1.9.28

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/README.md CHANGED
@@ -147,6 +147,9 @@ const map = new Proximiio.Map({
147
147
  opacity: number; // optional, default: 1, default polygon opacity
148
148
  minZoom: number; // optional, default: 17, default polygon minimum zoom visibility
149
149
  maxZoom: number; // optional, default: 24, default polygon maximum zoom visibility
150
+ labelFontSize: (string | number | string[])[] | number; // optional, define polygon label font size, default is interpolate expression based on zoom level
151
+ symbolPlacement: 'point' | 'line' | 'line-center'; // optional, label placement relative to its geometry, default: 'line-center'
152
+ autoLabelLines: boolean; // optional, default: true, if no label-line is defined in the feature metadata, if enabled it's automatically generated based on the longest polygon border
150
153
  }
151
154
  considerVisibilityParam: false, // optional, default: true, if enabled all pois with visibility property defined as 'hidden' will not be visible as default, will be possible to toggle them with toggleHiddenPois() method
152
155
  fitBoundsPadding: 200, // optional, default 250, number | PaddingOptions, the amount of padding in pixels to add to the given bounds for found route, https://docs.mapbox.com/mapbox-gl-js/api/properties/#paddingoptions
@@ -1,4 +1,5 @@
1
1
  import FillExtrusionLayer from './layers/fill_extrusion_layer';
2
+ import LineLayer from './layers/line_layer';
2
3
  import SymbolLayer from './layers/symbol_layer';
3
4
  export declare class PolygonsLayer extends FillExtrusionLayer {
4
5
  constructor(data: any);
@@ -9,3 +10,6 @@ export declare class PolygonIconsLayer extends SymbolLayer {
9
10
  export declare class PolygonTitlesLayer extends SymbolLayer {
10
11
  constructor(data: any);
11
12
  }
13
+ export declare class PolygonTitlesLineLayer extends LineLayer {
14
+ constructor(data: any);
15
+ }
@@ -15,8 +15,9 @@ var __extends = (this && this.__extends) || (function () {
15
15
  };
16
16
  })();
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.PolygonTitlesLayer = exports.PolygonIconsLayer = exports.PolygonsLayer = void 0;
18
+ exports.PolygonTitlesLineLayer = exports.PolygonTitlesLayer = exports.PolygonIconsLayer = exports.PolygonsLayer = void 0;
19
19
  var fill_extrusion_layer_1 = require("./layers/fill_extrusion_layer");
20
+ var line_layer_1 = require("./layers/line_layer");
20
21
  var symbol_layer_1 = require("./layers/symbol_layer");
21
22
  var PolygonsLayer = /** @class */ (function (_super) {
22
23
  __extends(PolygonsLayer, _super);
@@ -121,7 +122,7 @@ var PolygonTitlesLayer = /** @class */ (function (_super) {
121
122
  ['==', ['to-number', ['get', 'level']], 0],
122
123
  ];
123
124
  _this.layout = new symbol_layer_1.LayoutProperties({
124
- 'symbol-placement': 'line-center',
125
+ 'symbol-placement': data.symbolPlacement,
125
126
  'text-anchor': 'top',
126
127
  'text-ignore-placement': true,
127
128
  'text-allow-overlap': true,
@@ -146,3 +147,30 @@ var PolygonTitlesLayer = /** @class */ (function (_super) {
146
147
  return PolygonTitlesLayer;
147
148
  }(symbol_layer_1.default));
148
149
  exports.PolygonTitlesLayer = PolygonTitlesLayer;
150
+ var PolygonTitlesLineLayer = /** @class */ (function (_super) {
151
+ __extends(PolygonTitlesLineLayer, _super);
152
+ function PolygonTitlesLineLayer(data) {
153
+ var _this = _super.call(this, data) || this;
154
+ _this.id = 'shop-labels-line';
155
+ _this.type = 'line';
156
+ _this.minzoom = data.minZoom;
157
+ _this.maxzoom = data.maxZoom;
158
+ _this.source = 'main';
159
+ _this.filter = [
160
+ 'all',
161
+ ['==', ['get', 'type', ['get', '_dynamic']], 'shop-label'],
162
+ ['==', ['to-number', ['get', 'level']], 0],
163
+ ];
164
+ _this.layout = new line_layer_1.LayoutProperties({
165
+ 'line-join': 'round',
166
+ 'line-cap': 'round',
167
+ });
168
+ _this.paint = new line_layer_1.PaintProperties({
169
+ 'line-color': '#000',
170
+ 'line-width': 3,
171
+ });
172
+ return _this;
173
+ }
174
+ return PolygonTitlesLineLayer;
175
+ }(line_layer_1.default));
176
+ exports.PolygonTitlesLineLayer = PolygonTitlesLineLayer;
@@ -23,4 +23,12 @@ export declare const translations: {
23
23
  DOWN: string;
24
24
  TO_FLOOR: string;
25
25
  };
26
+ it: {
27
+ ELEVATOR: string;
28
+ ESCALATOR: string;
29
+ SCALE: string;
30
+ UP: string;
31
+ DOWN: string;
32
+ TO_FLOOR: string;
33
+ };
26
34
  };
@@ -26,4 +26,12 @@ exports.translations = {
26
26
  DOWN: 'down',
27
27
  TO_FLOOR: 'to floor',
28
28
  },
29
+ it: {
30
+ ELEVATOR: 'Ascensore',
31
+ ESCALATOR: 'Scala mobile',
32
+ SCALE: 'Scale',
33
+ UP: 'su',
34
+ DOWN: 'giù',
35
+ TO_FLOOR: 'al piano',
36
+ },
29
37
  };
@@ -1,24 +1,24 @@
1
1
  import BaseLayer, { Serializable } from './base_layer';
2
2
  export declare class PaintProperties extends Serializable {
3
3
  lineColor: string;
4
- lineOpacity: number;
5
- lineTranslate: [number, number];
6
- lineTranslateAnchor: 'map' | 'viewport';
4
+ lineOpacity?: number;
5
+ lineTranslate?: [number, number];
6
+ lineTranslateAnchor?: 'map' | 'viewport';
7
7
  lineWidth: number;
8
- lineGapWidth: number;
9
- lineOffset: number;
10
- lineBlur: number;
8
+ lineGapWidth?: number;
9
+ lineOffset?: number;
10
+ lineBlur?: number;
11
11
  lineDasharray?: [number, number];
12
12
  linePattern?: string;
13
13
  lineGradient?: string;
14
14
  constructor(data: any);
15
15
  }
16
16
  export declare class LayoutProperties extends Serializable {
17
- visibility: 'visible' | 'none';
17
+ visibility?: 'visible' | 'none';
18
18
  lineCap: 'butt' | 'round' | 'square';
19
19
  lineJoin: 'bevel' | 'round' | 'miter';
20
- lineMiterLimit: number;
21
- lineRoundLimit: number;
20
+ lineMiterLimit?: number;
21
+ lineRoundLimit?: number;
22
22
  constructor(data: any);
23
23
  }
24
24
  export default class LineLayer extends BaseLayer {
@@ -57,7 +57,9 @@ interface Options {
57
57
  removeOriginalPolygonsLayer?: boolean;
58
58
  minZoom?: number;
59
59
  maxZoom?: number;
60
- labelFontSize?: (string | number | string[])[];
60
+ labelFontSize?: (string | number | string[])[] | number;
61
+ symbolPlacement?: 'point' | 'line' | 'line-center';
62
+ autoLabelLines?: boolean;
61
63
  };
62
64
  zoomLevel?: number;
63
65
  considerVisibilityParam?: boolean;
@@ -206,6 +208,7 @@ export declare class Map {
206
208
  private restartAnimation;
207
209
  private cancelAnimation;
208
210
  private getClosestFeature;
211
+ private getFloorName;
209
212
  /**
210
213
  * @memberof Map
211
214
  * @name getMapboxInstance
@@ -168,6 +168,8 @@ var Map = /** @class */ (function () {
168
168
  22,
169
169
  42,
170
170
  ],
171
+ symbolPlacement: 'line-center',
172
+ autoLabelLines: true,
171
173
  },
172
174
  considerVisibilityParam: true,
173
175
  fitBoundsPadding: 250,
@@ -275,7 +277,7 @@ var Map = /** @class */ (function () {
275
277
  urlParams = new URLSearchParams(window.location.search);
276
278
  placeParam = urlParams.get(this.defaultOptions.urlParams.defaultPlace);
277
279
  }
278
- return [4 /*yield*/, repository_1.default.getPackage(this.defaultOptions.initPolygons, this.defaultOptions.amenityIdProperty, this.defaultOptions.hiddenAmenities)];
280
+ return [4 /*yield*/, repository_1.default.getPackage(this.defaultOptions.initPolygons, this.defaultOptions.polygonsOptions.autoLabelLines, this.defaultOptions.amenityIdProperty, this.defaultOptions.hiddenAmenities)];
279
281
  case 1:
280
282
  _d = _e.sent(), places = _d.places, style = _d.style, styles = _d.styles, features = _d.features, amenities = _d.amenities;
281
283
  levelChangers = features.features.filter(function (f) { return f.properties.type === 'elevator' || f.properties.type === 'escalator' || f.properties.type === 'staircase'; });
@@ -486,7 +488,7 @@ var Map = /** @class */ (function () {
486
488
  case 0:
487
489
  if (!this.map) return [3 /*break*/, 2];
488
490
  console.log('data should be refetched');
489
- return [4 /*yield*/, repository_1.default.getPackage(this.defaultOptions.initPolygons, this.defaultOptions.amenityIdProperty, this.defaultOptions.hiddenAmenities)];
491
+ return [4 /*yield*/, repository_1.default.getPackage(this.defaultOptions.initPolygons, this.defaultOptions.polygonsOptions.autoLabelLines, this.defaultOptions.amenityIdProperty, this.defaultOptions.hiddenAmenities)];
490
492
  case 1:
491
493
  features = (_a.sent()).features;
492
494
  levelChangers = features.features.filter(function (f) {
@@ -695,7 +697,7 @@ var Map = /** @class */ (function () {
695
697
  icon: direction === 'UP' ? 'floorchange-up-image' : 'floorchange-down-image',
696
698
  iconOffset: direction === 'UP' ? [4, -90] : [4, 90],
697
699
  popupImage: 'popup',
698
- description: i18n_1.translations[_this.defaultOptions.language][levelChangerType] + " \n " + i18n_1.translations[_this.defaultOptions.language][direction] + " " + i18n_1.translations[_this.defaultOptions.language]['TO_FLOOR'] + " " + (destinationFloor.name ? destinationFloor.name : levelChanger.destinationLevel),
700
+ description: i18n_1.translations[_this.defaultOptions.language][levelChangerType] + " \n " + i18n_1.translations[_this.defaultOptions.language][direction] + " " + i18n_1.translations[_this.defaultOptions.language]['TO_FLOOR'] + " " + (destinationFloor.name ? _this.getFloorName(destinationFloor) : levelChanger.destinationLevel),
699
701
  level: levelChanger.level,
700
702
  destinationLevel: levelChanger.destinationLevel,
701
703
  levelChangerId: levelChangerFeature.properties.id,
@@ -2133,6 +2135,14 @@ var Map = /** @class */ (function () {
2133
2135
  return false;
2134
2136
  }
2135
2137
  };
2138
+ Map.prototype.getFloorName = function (floor) {
2139
+ if (floor.metadata && floor.metadata['title_' + this.defaultOptions.language]) {
2140
+ return floor.metadata['title_' + this.defaultOptions.language];
2141
+ }
2142
+ else {
2143
+ return floor.name;
2144
+ }
2145
+ };
2136
2146
  /**
2137
2147
  * @memberof Map
2138
2148
  * @name getMapboxInstance
@@ -1,13 +1,13 @@
1
1
  import Feature, { FeatureCollection } from '../models/feature';
2
2
  import { FeatureCollection as FCModel, Feature as FModel } from '@turf/helpers';
3
- export declare const getFeatures: (initPolygons?: boolean, hiddenAmenities?: string[]) => Promise<FeatureCollection>;
3
+ export declare const getFeatures: (initPolygons?: boolean, autoLabelLines?: boolean, hiddenAmenities?: string[]) => Promise<FeatureCollection>;
4
4
  export declare const getAmenities: (amenityIdProperty?: string) => Promise<any>;
5
5
  export declare const getPois: () => Promise<Feature[]>;
6
6
  export declare const addFeatures: (featureCollection: FCModel) => Promise<void>;
7
7
  export declare const updateFeature: (featureData: FModel, featureId: string) => Promise<void>;
8
8
  export declare const deleteFeatures: (featureCollection: FCModel) => Promise<void>;
9
9
  declare const _default: {
10
- getFeatures: (initPolygons?: boolean, hiddenAmenities?: string[]) => Promise<FeatureCollection>;
10
+ getFeatures: (initPolygons?: boolean, autoLabelLines?: boolean, hiddenAmenities?: string[]) => Promise<FeatureCollection>;
11
11
  addFeatures: (featureCollection: FCModel<import("@turf/helpers").Geometry | import("@turf/helpers").GeometryCollection, {
12
12
  [name: string]: any;
13
13
  }>) => Promise<void>;
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
2
13
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
14
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
15
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -47,7 +58,7 @@ var feature_1 = require("../models/feature");
47
58
  var amenity_1 = require("../models/amenity");
48
59
  var main_1 = require("../components/map/main");
49
60
  var turf_1 = require("@turf/turf");
50
- var getFeatures = function (initPolygons, hiddenAmenities) { return __awaiter(void 0, void 0, void 0, function () {
61
+ var getFeatures = function (initPolygons, autoLabelLines, hiddenAmenities) { return __awaiter(void 0, void 0, void 0, function () {
51
62
  var url, res, featuresToAdd_1, shopPolygons_1, labelLineFeatures_1;
52
63
  return __generator(this, function (_a) {
53
64
  switch (_a.label) {
@@ -99,7 +110,7 @@ var getFeatures = function (initPolygons, hiddenAmenities) { return __awaiter(vo
99
110
  connectedPolygon_1.properties._dynamic.type = 'shop-custom';
100
111
  connectedPolygon_1.properties._dynamic.poi_id = feature.properties.id;
101
112
  connectedPolygon_1.properties._dynamic.amenity = feature.properties.amenity;
102
- // id have to be changed to numetic type so feature state will work
113
+ // id have to be changed to numeric type so feature state will work
103
114
  connectedPolygon_1.id = JSON.stringify(key);
104
115
  // check if feature is inside a polygon
105
116
  labelLineFeatures_1.forEach(function (line) {
@@ -111,7 +122,7 @@ var getFeatures = function (initPolygons, hiddenAmenities) { return __awaiter(vo
111
122
  }
112
123
  });
113
124
  if (connectedLabelLine_1) {
114
- // id have to be changed to numetic type so feature state will work
125
+ // id have to be changed to numeric type so feature state will work
115
126
  connectedLabelLine_1.id = JSON.stringify(key + 9999);
116
127
  feature.properties._dynamic.label_id = connectedLabelLine_1.id;
117
128
  connectedPolygon_1.properties._dynamic.label_id = connectedLabelLine_1.id;
@@ -126,27 +137,75 @@ var getFeatures = function (initPolygons, hiddenAmenities) { return __awaiter(vo
126
137
  connectedLabelLine_1.properties.title = feature.properties.title;
127
138
  connectedLabelLine_1.properties.title_i18n = feature.properties.title_i18n;
128
139
  }
129
- var labelLine = connectedPolygon_1.properties['label-line']
130
- ? JSON.parse(JSON.stringify(connectedPolygon_1.properties['label-line']))
131
- : connectedPolygon_1.properties.metadata && connectedPolygon_1.properties.metadata['label-line']
132
- ? JSON.parse(JSON.stringify(connectedPolygon_1.properties.metadata['label-line']))
133
- : feature.properties.metadata && feature.properties.metadata['label-line']
134
- ? JSON.parse(JSON.stringify(feature.properties.metadata['label-line']))
135
- : undefined;
136
- if (labelLine && labelLine !== undefined && labelLine.length > 0) {
137
- var parsedLabelLine = typeof labelLine === 'string' ? JSON.parse(labelLine) : labelLine;
138
- if (parsedLabelLine[0] instanceof Array && parsedLabelLine[1] instanceof Array) {
139
- var labelLineFeature = JSON.parse(JSON.stringify(feature));
140
- labelLineFeature.geometry = {
141
- coordinates: parsedLabelLine,
142
- type: 'LineString',
143
- };
144
- labelLineFeature.properties.id = JSON.stringify(key + 9999);
145
- labelLineFeature.id = JSON.stringify(key + 9999);
146
- labelLineFeature.properties.type = 'shop-label';
147
- labelLineFeature.properties._dynamic.type = 'shop-label';
148
- connectedPolygon_1.properties._dynamic.label_id = labelLineFeature.properties.id;
149
- featuresToAdd_1.push(labelLineFeature);
140
+ if (!connectedLabelLine_1) {
141
+ var labelLine = connectedPolygon_1.properties['label-line']
142
+ ? JSON.parse(JSON.stringify(connectedPolygon_1.properties['label-line']))
143
+ : connectedPolygon_1.properties.metadata && connectedPolygon_1.properties.metadata['label-line']
144
+ ? JSON.parse(JSON.stringify(connectedPolygon_1.properties.metadata['label-line']))
145
+ : feature.properties.metadata && feature.properties.metadata['label-line']
146
+ ? JSON.parse(JSON.stringify(feature.properties.metadata['label-line']))
147
+ : undefined;
148
+ if (labelLine && labelLine !== undefined && labelLine.length > 0) {
149
+ var parsedLabelLine = typeof labelLine === 'string' ? JSON.parse(labelLine) : labelLine;
150
+ if (parsedLabelLine[0] instanceof Array && parsedLabelLine[1] instanceof Array) {
151
+ var labelLineFeature = JSON.parse(JSON.stringify(feature));
152
+ labelLineFeature.geometry = {
153
+ coordinates: parsedLabelLine,
154
+ type: 'LineString',
155
+ };
156
+ labelLineFeature.properties.id = JSON.stringify(key + 9999);
157
+ labelLineFeature.id = JSON.stringify(key + 9999);
158
+ labelLineFeature.properties.type = 'shop-label';
159
+ labelLineFeature.properties._dynamic.type = 'shop-label';
160
+ connectedPolygon_1.properties._dynamic.label_id = labelLineFeature.properties.id;
161
+ featuresToAdd_1.push(labelLineFeature);
162
+ }
163
+ }
164
+ else if (autoLabelLines) {
165
+ var longestBorder = void 0;
166
+ var labelBorder = void 0;
167
+ // loop through segments and find the longest border
168
+ for (var i = 0; i < connectedPolygon_1.geometry.coordinates[0][0].length; i++) {
169
+ var currentCoords = connectedPolygon_1.geometry.coordinates[0][0][i];
170
+ var nextCoords = connectedPolygon_1.geometry.coordinates[0][0][i + 1];
171
+ if (nextCoords) {
172
+ var border = turf_1.lineString([currentCoords, nextCoords], __assign({}, feature.properties));
173
+ // measure border length
174
+ var borderLength = turf_1.length(border);
175
+ border.properties._dynamic = __assign(__assign({}, border.properties._dynamic), { length: borderLength });
176
+ // if there is not longest border define it
177
+ if (!longestBorder) {
178
+ longestBorder = border;
179
+ }
180
+ else {
181
+ // if current segment border is longer, rewrite it
182
+ if (borderLength > longestBorder.properties._dynamic.length) {
183
+ longestBorder = border;
184
+ }
185
+ }
186
+ }
187
+ }
188
+ // measure length from longest border to polygon center
189
+ var distanceToCenter = turf_1.pointToLineDistance(turf_1.centroid(connectedPolygon_1), longestBorder);
190
+ // offset border to polygon center and make it longer to get intersections with the polygon
191
+ labelBorder = turf_1.lineOffset(longestBorder, distanceToCenter);
192
+ labelBorder = turf_1.transformScale(labelBorder, 10);
193
+ var intersection = turf_1.lineIntersect(connectedPolygon_1, labelBorder);
194
+ // if there are more than 1 intersections, get the line betweeen them
195
+ if (intersection.features.length > 1) {
196
+ var intersectedLine = turf_1.lineString([
197
+ intersection.features[0].geometry.coordinates,
198
+ intersection.features[intersection.features.length - 1].geometry.coordinates,
199
+ ]);
200
+ // use the interstections line as the label line
201
+ labelBorder.geometry = intersectedLine.geometry;
202
+ }
203
+ labelBorder.properties.id = JSON.stringify(key + 9999);
204
+ labelBorder.id = JSON.stringify(key + 9999);
205
+ labelBorder.properties.type = 'shop-label';
206
+ labelBorder.properties._dynamic.type = 'shop-label';
207
+ connectedPolygon_1.properties._dynamic.label_id = labelBorder.properties.id;
208
+ featuresToAdd_1.push(labelBorder);
150
209
  }
151
210
  }
152
211
  }
@@ -3,7 +3,7 @@ import { FloorModel } from '../models/floor';
3
3
  import StyleModel from '../models/style';
4
4
  import { FeatureCollection } from '../models/feature';
5
5
  import { AmenityModel } from '../models/amenity';
6
- export declare const getPackage: (initPolygons?: boolean, amenityIdProperty?: string, hiddenAmenities?: string[]) => Promise<{
6
+ export declare const getPackage: (initPolygons?: boolean, autoLabelLines?: boolean, amenityIdProperty?: string, hiddenAmenities?: string[]) => Promise<{
7
7
  places: PlaceModel[];
8
8
  floors: FloorModel[];
9
9
  style: StyleModel;
@@ -12,7 +12,7 @@ export declare const getPackage: (initPolygons?: boolean, amenityIdProperty?: st
12
12
  amenities: AmenityModel[];
13
13
  }>;
14
14
  declare const _default: {
15
- getPackage: (initPolygons?: boolean, amenityIdProperty?: string, hiddenAmenities?: string[]) => Promise<{
15
+ getPackage: (initPolygons?: boolean, autoLabelLines?: boolean, amenityIdProperty?: string, hiddenAmenities?: string[]) => Promise<{
16
16
  places: PlaceModel[];
17
17
  floors: FloorModel[];
18
18
  style: StyleModel;
@@ -41,7 +41,7 @@ var places_1 = require("./places");
41
41
  var floors_1 = require("./floors");
42
42
  var style_1 = require("./style");
43
43
  var geo_1 = require("./geo");
44
- var getPackage = function (initPolygons, amenityIdProperty, hiddenAmenities) { return __awaiter(void 0, void 0, void 0, function () {
44
+ var getPackage = function (initPolygons, autoLabelLines, amenityIdProperty, hiddenAmenities) { return __awaiter(void 0, void 0, void 0, function () {
45
45
  var result, promises;
46
46
  return __generator(this, function (_a) {
47
47
  switch (_a.label) {
@@ -52,7 +52,7 @@ var getPackage = function (initPolygons, amenityIdProperty, hiddenAmenities) { r
52
52
  floors_1.getFloors().then(function (floors) { return (result.floors = floors.data); }),
53
53
  style_1.getStyle().then(function (style) { return (result.style = style); }),
54
54
  style_1.getStyles().then(function (styles) { return (result.styles = styles); }),
55
- geo_1.getFeatures(initPolygons, hiddenAmenities).then(function (features) { return (result.features = features); }),
55
+ geo_1.getFeatures(initPolygons, autoLabelLines, hiddenAmenities).then(function (features) { return (result.features = features); }),
56
56
  geo_1.getAmenities(amenityIdProperty).then(function (amenities) { return (result.amenities = amenities); }),
57
57
  ];
58
58
  return [4 /*yield*/, Promise.all(promises)];
@@ -25,6 +25,7 @@ export declare class FloorModel extends BaseModel {
25
25
  editor?: FloorEditorModel;
26
26
  geopoint?: [number, number];
27
27
  remoteId?: string;
28
+ metadata?: object;
28
29
  constructor(data: any);
29
30
  get hasFloorplan(): boolean;
30
31
  }