From 4b932099f5063750e108ab7062872c33d250a958 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 14 Sep 2026 09:53:03 +0300 Subject: [PATCH] dev cont. --- lib/controllers/api_routes/urls.dart | 5 +- .../asset_tracking/asset_tracking_page.dart | 57 +++++++------- .../asset_tracking_provider.dart | 10 +-- .../asset_tracking/map_tracking_page.dart | 76 +++++++++++++------ 4 files changed, 92 insertions(+), 56 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 59fc9299..c9cb187d 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -632,5 +632,8 @@ class URLs { // Asset Tracking APIs static get getAssetsFromPenguin => "$_baseUrl/PenguinIN/GetAssetsFromPenguin"; - static get getFloorMap => "$_baseUrl/PenguinIN/floors/"; + static get getPenguinFloors => "$_baseUrl/PenguinIN/floors/"; + static get getPenguinSites => "$_baseUrl/PenguinIN/sites/"; + static get getPenguinBuildings => "$_baseUrl/PenguinIN/buildings/"; + static get getPenguinDepartments => "$_baseUrl/PenguinIN/departments/"; } diff --git a/lib/modules/asset_tracking/asset_tracking_page.dart b/lib/modules/asset_tracking/asset_tracking_page.dart index dbc87427..df7a0f89 100644 --- a/lib/modules/asset_tracking/asset_tracking_page.dart +++ b/lib/modules/asset_tracking/asset_tracking_page.dart @@ -62,7 +62,7 @@ class _AssetTrackingPageState extends State with SingleTicker child: SegmentedButton( multiSelectionEnabled: false, emptySelectionAllowed: false, - expandedInsets: const EdgeInsets.only(left: 16, top: 16, right: 16, bottom: 8), + expandedInsets: const EdgeInsets.only(left: 16, top: 8, right: 16, bottom: 8), style: SegmentedButton.styleFrom( side: BorderSide(color: AppColor.borderColor(context)), textStyle: AppTextStyles.bodyText, @@ -99,7 +99,7 @@ class _AssetTrackingPageState extends State with SingleTicker SafeArea( child: AnimatedSwitcher( duration: const Duration(milliseconds: 300), - child: selectedIndex == 3 ? MapTrackingPage(inAppView: true) : listView(), + child: selectedIndex == 3 ? MapTrackingPage() : listView(), ), ).expanded, ], @@ -149,32 +149,33 @@ class _AssetTrackingPageState extends State with SingleTicker return FadeTransition( opacity: animation, child: SlideTransition( - position: slideAnimation, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - StatusLabel( - label: (provider.assetsList[itemIndex].location?.isLive ?? false) ? "Live" : "Not Live", - radius: 4, - textColor: AppColor.getPriorityStatusTextColor(context, (provider.assetsList[itemIndex].location?.isLive ?? false) ? 0 : 1), - backgroundColor: AppColor.getPriorityStatusColor(context, (provider.assetsList[itemIndex].location?.isLive ?? false) ? 0 : 1), - ), - 4.height, - InfoHeader16Widget(provider.assetsList[itemIndex].label ?? ""), - InfoTextWidget(label: "Serial No", value: provider.assetsList[itemIndex].label, showEmptyValue: true), - InfoTextWidget(label: "Type", value: provider.assetsList[itemIndex].type?.name, showEmptyValue: true), - InfoTextWidget(label: "Status", value: provider.assetsList[itemIndex].status?.name, showEmptyValue: true), - InfoTextWidget(label: "Department", value: provider.assetsList[itemIndex].department?.name, showEmptyValue: true), - InfoTextWidget( - label: "Last seen", - value: provider.assetsList[itemIndex].location?.lastSeen?.toServiceRequestDetailsFormat, - showEmptyValue: true, - showArrow: true, - arrowMsg: "View on map", - ), - ], - ).toShadowContainer(context)).onPress((){ + position: slideAnimation, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + StatusLabel( + label: (provider.assetsList[itemIndex].location?.isLive ?? false) ? "Live" : "Not Live", + radius: 4, + textColor: AppColor.getPriorityStatusTextColor(context, (provider.assetsList[itemIndex].location?.isLive ?? false) ? 0 : 1), + backgroundColor: AppColor.getPriorityStatusColor(context, (provider.assetsList[itemIndex].location?.isLive ?? false) ? 0 : 1), + ), + 4.height, + InfoHeader16Widget(provider.assetsList[itemIndex].label ?? ""), + InfoTextWidget(label: "Serial No", value: provider.assetsList[itemIndex].label, showEmptyValue: true), + InfoTextWidget(label: "Type", value: provider.assetsList[itemIndex].type?.name, showEmptyValue: true), + InfoTextWidget(label: "Status", value: provider.assetsList[itemIndex].status?.name, showEmptyValue: true), + InfoTextWidget(label: "Department", value: provider.assetsList[itemIndex].department?.name, showEmptyValue: true), + InfoTextWidget( + label: "Last seen", + value: provider.assetsList[itemIndex].location?.lastSeen?.toServiceRequestDetailsFormat, + showEmptyValue: true, + showArrow: true, + arrowMsg: "View on map", + ), + ], + ).toShadowContainer(context)) + .onPress(() { Navigator.push(context, MaterialPageRoute(builder: (context) => MapTrackingPage(assetTrackingData: provider.assetsList[itemIndex]))); }), ); diff --git a/lib/modules/asset_tracking/asset_tracking_provider.dart b/lib/modules/asset_tracking/asset_tracking_provider.dart index 3cd684fb..b580b655 100644 --- a/lib/modules/asset_tracking/asset_tracking_provider.dart +++ b/lib/modules/asset_tracking/asset_tracking_provider.dart @@ -67,14 +67,14 @@ class AssetTrackingProvider extends ChangeNotifier { Future getFloorMap(int floorId) async { FloorMapModel? floorMapModel; - // try { - final response = await ApiManager.instance.get(URLs.getFloorMap + "$floorId/maps"); + try { + final response = await ApiManager.instance.get(URLs.getPenguinFloors + "$floorId/maps"); if (response.statusCode >= 200 && response.statusCode < 300) { floorMapModel = FloorMapModel.fromJson(json.decode(response.body)["data"]); } return floorMapModel; - // } catch (error) { - // return floorMapModel; - // } + } catch (error) { + return floorMapModel; + } } } diff --git a/lib/modules/asset_tracking/map_tracking_page.dart b/lib/modules/asset_tracking/map_tracking_page.dart index 86a1ca18..2607da2f 100644 --- a/lib/modules/asset_tracking/map_tracking_page.dart +++ b/lib/modules/asset_tracking/map_tracking_page.dart @@ -5,9 +5,11 @@ import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map_geojson2/flutter_map_geojson2.dart'; import 'package:latlong2/latlong.dart'; import 'package:provider/provider.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; import 'asset_tracking_provider.dart'; import 'models/asset_tracking_model.dart'; @@ -15,9 +17,8 @@ import 'models/floor_map_model.dart'; class MapTrackingPage extends StatefulWidget { final AssetTrackingModel? assetTrackingData; - final bool inAppView; - MapTrackingPage({Key? key, this.inAppView = false, this.assetTrackingData}) : super(key: key); + MapTrackingPage({Key? key, this.assetTrackingData}) : super(key: key); @override _MapTrackingPageState createState() { @@ -29,33 +30,38 @@ class _MapTrackingPageState extends State { final MapController mapController = MapController(); late AssetTrackingProvider assetTrackingProvider; + late bool inAppView; + FloorMapModel? floorMapModel; Map? _geojson; List markers = []; LatLngBounds? _computedBounds; + final ExpansibleController expansibleController = ExpansibleController(); - // Fallback shown only until the real floor plan bounds are computed. static const LatLng _fallbackCenter = LatLng(24.81200245073082, 46.624273601310186); @override void initState() { super.initState(); + inAppView = widget.assetTrackingData == null; assetTrackingProvider = Provider.of(context, listen: false); WidgetsBinding.instance.addPostFrameCallback((_) { - if (widget.assetTrackingData != null) { - print('widget.assetTrackingData!.location!.floor!.id!: ${widget.assetTrackingData!.toJson()}'); - Utils.showLoading(context); - assetTrackingProvider.getFloorMap(widget.assetTrackingData!.location!.floor!.id!).then((floorMap) { - Utils.hideLoading(context); - _onFloorMapLoaded(floorMap); - }).catchError((error) { - print('Failed to load floor map: $error'); - Utils.hideLoading(context); - }); + if (!inAppView) { + getFloorMap(widget.assetTrackingData!.location!.floor!.id!); } }); } + void getFloorMap(int id) { + Utils.showLoading(context); + assetTrackingProvider.getFloorMap(id).then((floorMap) { + Utils.hideLoading(context); + _onFloorMapLoaded(floorMap); + }).catchError((error) { + Utils.hideLoading(context); + }); + } + void _onFloorMapLoaded(FloorMapModel? loadedFloorMap) { floorMapModel = loadedFloorMap; @@ -142,18 +148,44 @@ class _MapTrackingPageState extends State { _geojson!, styleDefaults: GeoJsonStyleDefaults.leaflet, ), - MarkerLayer(markers: markers), + if (!inAppView) MarkerLayer(markers: markers), ] ], ); - return widget.inAppView - ? mapWidget - : Scaffold( - appBar: const DefaultAppBar(title: "Live Asset Tracking"), - body: Stack( - children: [mapWidget], - ), - ); + return inAppView + ? Stack( + alignment: AlignmentDirectional.topCenter, + children: [ + mapWidget, + Container( + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.only(right: 16, left: 16), + decoration: BoxDecoration( + color: AppColor.tabBarBackground(context), + border: Border.all(color: AppColor.tabBarBorder(context)), + borderRadius: BorderRadius.circular(20), + ), + child: Theme( + data: ThemeData(splashColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent), + child: ExpansionTile( + shape: Border.all(color: Colors.transparent, width: 0), + collapsedShape: Border.all(color: Colors.transparent, width: 0), + controller: expansibleController, + title: const InfoTextLabelWidget(label: "Search Floor Map"), + iconColor: AppColor.icon2Color(context), + collapsedIconColor: AppColor.icon2Color(context), + dense: true, + children: [ + + ], + childrenPadding: EdgeInsets.all(0), + tilePadding: EdgeInsets.all(0), + ), + ), + ), + ], + ) + : Scaffold(appBar: const DefaultAppBar(title: "Live Asset Tracking"), body: mapWidget); } }