From 849ef0f50b2b24e43b36be7763617e3de4d5b3ca Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 14 Oct 2026 10:49:52 +0300 Subject: [PATCH] improvements --- .../asset_tracking/map_tracking_page.dart | 85 ++++++++++++++----- 1 file changed, 65 insertions(+), 20 deletions(-) diff --git a/lib/modules/asset_tracking/map_tracking_page.dart b/lib/modules/asset_tracking/map_tracking_page.dart index 8b9d58aa..47ad3ec3 100644 --- a/lib/modules/asset_tracking/map_tracking_page.dart +++ b/lib/modules/asset_tracking/map_tracking_page.dart @@ -125,9 +125,9 @@ class _MapTrackingPageState extends State { provider.coordinates = []; provider.assetsOnTheFloorList = []; provider.notify(); - - provider.getAssetsFromPenguinByFloor(); - + Utils.showLoading(context); + await provider.getAssetsFromPenguinByFloor(); + Utils.hideLoading(context); if (provider.selectedFloor != null) { getFloorMap(provider.selectedFloor!.id!); provider.getZoneFromPenguin(); @@ -481,9 +481,6 @@ class _MapTrackingPageState extends State { ); }, ), - - // if (!inAppView || ) - if (markers.isNotEmpty) MarkerLayer(markers: markers), ], if (inAppView && _geojson == null) Selector>( @@ -503,19 +500,64 @@ class _MapTrackingPageState extends State { _lastFittedCoordinatesKey = key; _fitCameraToPoints(list); } - List zonesPolygons = [ - Polygon( - label: assetTrackingProvider.selectedBuilding?.label ?? "", - labelStyle: AppTextStyles.bodyText2.copyWith(color: AppColor.textColor(context)), - points: list, - color: AppColor.red30.withOpacity(0.3), - borderColor: AppColor.red30, - borderStrokeWidth: 2.0, - ), - ]; - return PolygonLayer(polygons: zonesPolygons, hitNotifier: _polygonHitNotifier); + final buildingLabel = assetTrackingProvider.selectedBuilding?.label ?? ""; + + // Assets fetched without floorIds => all assets of the selected building. + return Selector>( + selector: (_, provider) => List.of(provider.assetsOnTheFloorList), + builder: (_, buildingAssets, __) { + final zone = GeoZone( + properties: {'name': buildingLabel.isEmpty ? "Building" : buildingLabel}, + points: list, + assets: buildingAssets, + ); + + final buildingPolygon = Polygon( + label: buildingLabel, + labelStyle: AppTextStyles.bodyText2.copyWith(color: AppColor.textColor(context)), + labelPlacementCalculator: const PolygonLabelPlacementCalculator.simpleCentroid(), + points: list, + color: AppColor.red30.withOpacity(0.3), + borderColor: AppColor.red30, + borderStrokeWidth: 2.0, + hitValue: zone, + ); + + return Stack( + children: [ + GestureDetector( + onTap: _onFeatureTapped, + child: PolygonLayer(polygons: [buildingPolygon], hitNotifier: _polygonHitNotifier), + ), + // Hide the count badge while asset pins are shown (same as floor view). + if (buildingAssets.isNotEmpty && markers.isEmpty) + MarkerLayer( + markers: [ + Marker( + point: buildingPolygon.labelPosition, + width: 21, + height: 33, + // Sit the badge just above the building label so they don't overlap. + alignment: Alignment.topCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 12), + child: GestureDetector( + onTap: () => _showZoneDetails(zone), + child: _ZoneCountBadge(count: buildingAssets.length), + ), + ), + ), + ], + ), + ], + ); + }, + ); }), - if (_geojson != null && inAppView) + // Selected asset pins (floor map or building outline). + if (markers.isNotEmpty) MarkerLayer(markers: markers), + // Assets panel: shown for both floor view and building-only view. + if (inAppView) Positioned( bottom: 0, left: 0, @@ -523,6 +565,7 @@ class _MapTrackingPageState extends State { child: Selector>( selector: (_, myModel) => myModel.assetsOnTheFloorList, builder: (_, assetsOnTheFloorList, __) { + final scope = _geojson != null ? "Floor" : "Building"; return assetsOnTheFloorList.isEmpty ? const SizedBox() : Container( @@ -533,12 +576,12 @@ class _MapTrackingPageState extends State { border: Border.all(color: AppColor.tabBarBorder(context)), borderRadius: BorderRadius.circular(20), ), - child: UpwardExpansionTile(title: InfoTextLabelWidget(label: "${assetsOnTheFloorList.length} Assets found on this floor"), children: [ + child: UpwardExpansionTile(title: InfoTextLabelWidget(label: "${assetsOnTheFloorList.length} Assets found on this ${scope.toLowerCase()}"), children: [ LimitedBox( maxHeight: 120, child: MultipleItemDropDownMenu( context: context, - title: 'Assets on The Floor', + title: 'Assets on The $scope', hintMsg: 'Search By Label or Serial Number', initialValue: [], showShadow: false, @@ -694,6 +737,8 @@ class _MapTrackingPageState extends State { label: "View", disableButton: assetProvider.selectedSite == null || assetProvider.selectedBuilding == null, onPressed: () { + _onViewPressed(assetTrackingProvider); + return; expansibleController.collapse(); assetTrackingProvider.coordinates.clear(); assetTrackingProvider.assetsOnTheFloorList.clear();