chart screen changes

This commit is contained in:
venbaittech 2025-03-06 08:35:33 +05:30
parent f78d2f2df3
commit b5d0b38ac7
4 changed files with 548 additions and 534 deletions

View File

@ -20,12 +20,12 @@ if (project.hasProperty('google-services.json')) {
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
if (flutterVersionCode == null) {
flutterVersionCode = "31"
flutterVersionCode = "32"
}
def flutterVersionName = localProperties.getProperty("flutter.versionName")
if (flutterVersionName == null) {
flutterVersionName = "1.0.30"
flutterVersionName = "1.0.31"
}
def keystorePropertiesFile = rootProject.file("key.properties")

View File

@ -1,7 +1,7 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:app_links/app_links.dart';
// import 'package:app_links/app_links.dart';
import 'package:uae_stat/presentation/Screens/Bottom%20Navigation%20Pages/UAE_Numbers/Social/marriages.dart';
import 'package:uae_stat/presentation/routes/auth_routes/login_route.dart';
import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/home_route.dart';
@ -30,12 +30,12 @@ class _DeepLinkListenerState extends State<DeepLinkListener> {
});
// Also listen for app links (Firebase Hosting links)
final appLinks = AppLinks();
appLinks.uriLinkStream.listen((Uri? uri) {
if (uri != null) {
handleDeepLink(uri);
}
});
// final appLinks = AppLinks();
// appLinks.uriLinkStream.listen((Uri? uri) {
// if (uri != null) {
// handleDeepLink(uri);
// }
// });
}
void handleDeepLink(Uri uri) {
@ -45,11 +45,14 @@ class _DeepLinkListenerState extends State<DeepLinkListener> {
final String firstSegment = uri.pathSegments.first;
if (firstSegment == 'marriages') {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => Marriages()));
Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => Marriages()));
} else if (firstSegment == 'login') {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => LoginRoute()));
Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => LoginRoute()));
} else if (firstSegment == 'home') {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyHomePage()));
Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => MyHomePage()));
}
}
}

View File

@ -104,8 +104,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
locale = ref.read(localeProvider) ?? const Locale('en');
print('locale-$locale');
fetchChartData(widget.dataSets, locale?.languageCode ?? 'en', widget.kpi, widget.filter_data)
fetchChartData(widget.dataSets, locale?.languageCode ?? 'en', widget.kpi,
widget.filter_data)
.then((_) {
if (_tabsData.isNotEmpty) {
// Call onTabSelected for the first tab
@ -319,7 +319,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
backgroundColor: Color(0xFFAA8E83), // Set background color
foregroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0), // Set text color
borderRadius:
BorderRadius.circular(10.0), // Set text color
),
),
child: Text(
@ -330,7 +331,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
),
],
)
],
),
);
@ -377,7 +377,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ SizedBox(
children: [
SizedBox(
width: 100, // Set the desired width
child: TextButton(
onPressed: () => Navigator.pop(context),
@ -411,7 +412,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
backgroundColor: Color(0xFFAA8E83), // Set background color
foregroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0), // Set text color
borderRadius:
BorderRadius.circular(10.0), // Set text color
),
),
child: Text(
@ -419,7 +421,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
style: TextStyle(color: Colors.white, fontSize: 16),
),
),
),],
),
],
),
],
),
@ -1275,8 +1278,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
}
Future<void> fetchChartData(String dataSets, locale, kpi, filter_data) async {
var data = await apiService.fetchChartData(dataSets, locale ,kpi,filter_data);
var data =
await apiService.fetchChartData(dataSets, locale, kpi, filter_data);
tabFilteredKpi = kpi;
print('FETCH KPI- $kpi');
@ -1284,13 +1287,12 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
print('locale1 - $locale');
// print('locale11 - $loacleData');
// Store filter_data if it has a value
if (filter_data != null && filter_data is List && filter_data.isNotEmpty) {
selectedFiltersApi = filter_data.map<Map<String, dynamic>>((entry) {
if (entry is Map<dynamic, dynamic>) {
return entry.map<String, dynamic>((key, value) => MapEntry(key.toString(), value));
return entry.map<String, dynamic>(
(key, value) => MapEntry(key.toString(), value));
}
return {};
}).toList();
@ -1298,8 +1300,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
print('FETVCFILTEr: $selectedFiltersApi');
}
if (data.containsKey('filterData')) {
var filterData = data['filterData'];
filterDataSet = filterData.entries
@ -1340,7 +1340,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
void applyFilters(BuildContext context, List filters, List data,
List dataCard, List selectedFilters) {
print('applyFilters called');
print('Selected ApplyFilters: $selectedFilters');
@ -1361,17 +1360,16 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
.map((filter) {
return {
'filter_key': filter['filter_key'],
'filter_data':filter['filter_data'].map((item)=> item.toString()).toList()
'filter_data':
filter['filter_data'].map((item) => item.toString()).toList()
};
}).toList();
print('Formatted Filters1: $formattedFilters');
// Convert to JSON format
String selectedFormatFilters = jsonEncode({
'kpi': tabWiseKpi,
'filter_data': formattedFilters
});
String selectedFormatFilters =
jsonEncode({'kpi': tabWiseKpi, 'filter_data': formattedFilters});
print('Formatted Filters2: $selectedFormatFilters');
final locale = ref.watch(localeProvider)?.languageCode ?? 'en';
@ -1389,7 +1387,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
selectedFiltersStorage = List.from(selectedFilters);
print('selectedFiltersStoraged- $selectedFiltersStorage');
}
void applyFilters1(BuildContext context, List filters, List data,
@ -1530,7 +1527,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
}
void showRightSideModal(BuildContext context, List filters, List data) {
print('selectedFiltersStoraged1- $selectedFiltersStorage');
// Initialize selected filters structure from the stored value, if exists
@ -1568,7 +1564,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
SvgPicture.asset(
UaeNumbersAssetPath.filterCharts,
semanticsLabel: 'Filter',
colorFilter:ColorFilter.mode(Color(0xFF8E8E8E),BlendMode.srcIn),
colorFilter: ColorFilter.mode(
Color(0xFF8E8E8E), BlendMode.srcIn),
width: 25,
height: 25,
),
@ -1815,9 +1812,15 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
});
selectedFiltersStorage.clear();
formattedFilters = [];
final locale =
ref.watch(localeProvider)?.languageCode ?? 'en';
print('locale22- $locale');
fetchChartData(
widget.dataSets,
locale.languageCode ?? 'en',
locale,
tabWiseKpi, // Ensure you are passing the correct KPI here
formattedFilters // Pass the formatted filter data here
);
@ -1920,13 +1923,22 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
.expand((item) => item)
.toList();
print("FilteringDAtss START1d - $filterData");
print('TABId1 - $tabId');
Map<String, int> monthMap = {
'jan': 1, 'feb': 2, 'mar': 3, 'apr': 4, 'may': 5, 'jun': 6,
'jul': 7, 'aug': 8, 'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12
'jan': 1,
'feb': 2,
'mar': 3,
'apr': 4,
'may': 5,
'jun': 6,
'jul': 7,
'aug': 8,
'sep': 9,
'oct': 10,
'nov': 11,
'dec': 12
};
for (var item in filterData) {
@ -1941,24 +1953,26 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
int yearB = int.parse(bParts[0]);
// if (yearA != yearB) return yearA.compareTo(yearB);
if (yearA != yearB) return yearB.compareTo(yearA); // Sort years in descending order
if (yearA != yearB)
return yearB.compareTo(yearA); // Sort years in descending order
if (aParts.length == 1) return -1; // Year-only comes first
if (bParts.length == 1) return 1; // Year-only comes first
int monthA = int.tryParse(aParts[1]) ?? monthMap[aParts[1].toLowerCase()] ?? 0;
int monthB = int.tryParse(bParts[1]) ?? monthMap[bParts[1].toLowerCase()] ?? 0;
int monthA =
int.tryParse(aParts[1]) ?? monthMap[aParts[1].toLowerCase()] ?? 0;
int monthB =
int.tryParse(bParts[1]) ?? monthMap[bParts[1].toLowerCase()] ?? 0;
return monthB.compareTo(monthA); // Sort months in descending order within the same year
return monthB.compareTo(
monthA); // Sort months in descending order within the same year
// return monthA.compareTo(monthB);
});
item['filter_data'] = timePeriods;
}
else if (item['filter_key'] == 'REF_AREA') {
} else if (item['filter_key'] == 'REF_AREA') {
continue;
}
else {
} else {
// Sort alphabetically for all other cases
List<String> otherFilters = List<String>.from(item['filter_data']);
otherFilters.sort((a, b) => a.toLowerCase().compareTo(b.toLowerCase()));
@ -1966,8 +1980,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
}
}
// for (var item in filterData) {
// if (item['filter_key'] == 'TIME_PERIOD') {
// // Convert the values to integers, sort them, and convert back to strings
@ -1992,7 +2004,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
}
void performActionForTab(String tabId) {
print('Selected Tab perform: $tabId');
// Filter the chartsData array based on the tabId
@ -2086,8 +2097,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
final locale = ref.watch(localeProvider);
final localeNotifier = ref.read(localeProvider.notifier);
ref.listen<Locale?>(localeProvider, (previous, next) {
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
@ -2097,9 +2106,11 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
currentTab = tabWiseKpi;
print('Saving currentTab: $currentTab After locale change');
final List<Map<String, dynamic>> safeFilterData = widget.filter_data ?? [];
final List<Map<String, dynamic>> safeFilterData =
widget.filter_data ?? [];
final String safeKpi = widget.kpi ?? '';
fetchChartData(widget.dataSets,localeCode, safeKpi, safeFilterData).then((_) {
fetchChartData(widget.dataSets, localeCode, safeKpi, safeFilterData)
.then((_) {
print('DEBUG KPI: $safeKpi');
print('TAB11: $currentTab');
@ -2114,8 +2125,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
onTabSelected(_tabsData[0]['id']);
}
});
});
double myheight = MediaQuery.of(context).size.height;
double mywidth = MediaQuery.of(context).size.width;
@ -2321,7 +2330,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
children: [
GestureDetector(
onTap: () => shareCurrentPage(context),
child: Row(
children: [
Text(
@ -2341,7 +2349,9 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
width: 24,
height: 24,
)
],),),
],
),
),
],
),
SizedBox(
@ -2450,7 +2460,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
// ),
// nonChartData Cards
Padding(
padding: const EdgeInsets.only(top: 8.0,left:1.0,right: 1.0),
padding: const EdgeInsets.only(
top: 8.0, left: 1.0, right: 1.0),
child: LayoutBuilder(
builder: (context, constraints) {
List<Widget> rows = [];
@ -2535,11 +2546,15 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
: (chartsData[index][
'chart_type'] ==
'bar_chart_horizontal')
? 370 : (chartsData[index][
? 370
: (chartsData[index][
'chart_type'] ==
'horizontal_rotate')
? 385
: (chartsData[index]['chart_type'] == 'fl_stacked_bar')
: (chartsData[index]
[
'chart_type'] ==
'fl_stacked_bar')
? 390
: 350,
@ -2548,7 +2563,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
chartData:
chartsData[index],
bodyColor: bodyColor,
chartHeader:chartHeader),)
chartHeader: chartHeader),
)
],
),
),
@ -2696,16 +2712,14 @@ class CardWidget extends StatelessWidget {
final bodyColor = Color(
int.parse(
(chartScreenData['border_color'] ?? '#898C81').replaceFirst('#', '0xff'),
(chartScreenData['border_color'] ?? '#898C81')
.replaceFirst('#', '0xff'),
),
);
if(response.isEmpty)
{
if (response.isEmpty) {
return SizedBox.shrink();
}
else if (response.length == 1) {
} else if (response.length == 1) {
return Container(
margin: const EdgeInsets.all(10),
// width: card_full_length ? double.infinity : null,
@ -2868,7 +2882,8 @@ class CardWidget extends StatelessWidget {
BorderRadius.circular(12), // Ensure border radius is applied
),
child: Column(
mainAxisSize: MainAxisSize.min, // Adjust card height based on content
mainAxisSize:
MainAxisSize.min, // Adjust card height based on content
mainAxisAlignment: MainAxisAlignment.center,
children: [
// const Icon(Icons.public,
@ -2969,7 +2984,6 @@ class CardWidget extends StatelessWidget {
],
),
SizedBox(
height: 2, // Height of the divider
width: 100,
@ -2979,9 +2993,6 @@ class CardWidget extends StatelessWidget {
),
),
Row(
mainAxisAlignment: MainAxisAlignment
.center, // Center-aligns the row contents
@ -2996,7 +3007,8 @@ class CardWidget extends StatelessWidget {
: _getColorFromHex(response[1]['font_color']),
),
textAlign: TextAlign.center, // Ensure proper alignment
overflow: TextOverflow.ellipsis, // Truncate if text overflows
overflow:
TextOverflow.ellipsis, // Truncate if text overflows
),
const SizedBox(width: 1), // Space between text and icon
if (response[1]['font_color'] != '') ...[
@ -3010,7 +3022,6 @@ class CardWidget extends StatelessWidget {
],
),
Text(
// '(${response[1]['display_value'] ?? 'NA'})',
RegExp(r'\d').hasMatch(response[1]['display_value'] ?? '')

View File

@ -1,7 +1,7 @@
name: uae_stat
description: "View statistics about the UAE from the Federal Center for Statistics and Competitiveness."
publish_to: "none"
version: 1.0.30+31
version: 1.0.31+32
environment:
sdk: ">=3.2.3 <4.0.0"