chart api changes and dev pocketbase url
This commit is contained in:
parent
cfe5b5bf20
commit
d7a1b5aa38
@ -15,12 +15,12 @@ if (localPropertiesFile.exists()) {
|
|||||||
|
|
||||||
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
|
def flutterVersionCode = localProperties.getProperty("flutter.versionCode")
|
||||||
if (flutterVersionCode == null) {
|
if (flutterVersionCode == null) {
|
||||||
flutterVersionCode = "27"
|
flutterVersionCode = "28"
|
||||||
}
|
}
|
||||||
|
|
||||||
def flutterVersionName = localProperties.getProperty("flutter.versionName")
|
def flutterVersionName = localProperties.getProperty("flutter.versionName")
|
||||||
if (flutterVersionName == null) {
|
if (flutterVersionName == null) {
|
||||||
flutterVersionName = "1.0.26"
|
flutterVersionName = "1.0.27"
|
||||||
}
|
}
|
||||||
|
|
||||||
def keystorePropertiesFile = rootProject.file("key.properties")
|
def keystorePropertiesFile = rootProject.file("key.properties")
|
||||||
|
|||||||
3
lib/config/api_config.dart
Normal file
3
lib/config/api_config.dart
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// api_config.dart
|
||||||
|
// const String apiUrl = 'http://192.168.1.26:8090';
|
||||||
|
const String apiUrl = 'https://pbdev.venbait.in/';
|
||||||
@ -292,6 +292,8 @@
|
|||||||
// return router;
|
// return router;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
@ -414,11 +416,33 @@ final GoRouter router = GoRouter(
|
|||||||
final mainTopic = state.uri.queryParameters['mainTopic'] ?? '';
|
final mainTopic = state.uri.queryParameters['mainTopic'] ?? '';
|
||||||
final title = state.uri.queryParameters['title'] ?? '';
|
final title = state.uri.queryParameters['title'] ?? '';
|
||||||
final key = state.uri.queryParameters['key'] ?? '';
|
final key = state.uri.queryParameters['key'] ?? '';
|
||||||
|
final kpi = state.uri.queryParameters['kpi'] ?? ''; // Get kpi
|
||||||
|
|
||||||
|
// Parse filter_data as a JSON list
|
||||||
|
// Parse filter_data as a JSON list
|
||||||
|
List<Map<String, dynamic>> filterData = [];
|
||||||
|
|
||||||
|
if (state.uri.queryParameters.containsKey('filter_data') &&
|
||||||
|
state.uri.queryParameters['filter_data']!.isNotEmpty) {
|
||||||
|
try {
|
||||||
|
filterData = List<Map<String, dynamic>>.from(
|
||||||
|
jsonDecode(state.uri.queryParameters['filter_data']!)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
print('Error parsing filter_data: $e');
|
||||||
|
filterData = []; // Assign an empty list to prevent null issues
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
filterData = []; // Ensure it's a valid list
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print('Router dataSets: $dataSets');
|
print('Router dataSets: $dataSets');
|
||||||
print('Router bgColor: $bgColor');
|
print('Router bgColor: $bgColor');
|
||||||
print('Router mainTopic: $mainTopic');
|
print('Router mainTopic: $mainTopic');
|
||||||
print('Router title: $title');
|
print('Router title: $title');
|
||||||
|
print('Router filter: $filterData');
|
||||||
|
|
||||||
// Pass both values to the screen
|
// Pass both values to the screen
|
||||||
return ChartScreen1(
|
return ChartScreen1(
|
||||||
@ -427,6 +451,8 @@ final GoRouter router = GoRouter(
|
|||||||
mainTopic: mainTopic,
|
mainTopic: mainTopic,
|
||||||
title: title,
|
title: title,
|
||||||
keyParam: key,
|
keyParam: key,
|
||||||
|
kpi: kpi,
|
||||||
|
filter_data: filterData,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
|
||||||
abstract class PocketBaseService {
|
abstract class PocketBaseService {
|
||||||
static const _host = 'https://pb.venbait.in';
|
static const _host = apiUrl;
|
||||||
|
// static const _host = 'https://pb.venbait.in';
|
||||||
// static const _host = 'http://127.0.0.1:8090';
|
// static const _host = 'http://127.0.0.1:8090';
|
||||||
static final _pb = PocketBase(_host);
|
static final _pb = PocketBase(_host);
|
||||||
static final users = _pb.collection('users');
|
static final users = _pb.collection('users');
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
"social_title":"اجتماعي",
|
"social_title":"اجتماعي",
|
||||||
"environment_title":"البيئة",
|
"environment_title":"البيئة",
|
||||||
"bookmarks": "الإشارات المرجعية",
|
"bookmarks": "الإشارات المرجعية",
|
||||||
|
|
||||||
"feedback_title": "تعليق",
|
"feedback_title": "تعليق",
|
||||||
"feedback_failed_msg": "لم يتم إرسال تعليقاتك. يرجى المحاولة مرة أخرى.",
|
"feedback_failed_msg": "لم يتم إرسال تعليقاتك. يرجى المحاولة مرة أخرى.",
|
||||||
"thankYou": "شكراً",
|
"thankYou": "شكراً",
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
|
|
||||||
"all_bookmarks":"All Bookmarks",
|
"all_bookmarks":"All Bookmarks",
|
||||||
"economy_title":"Economy",
|
"economy_title":"Economy",
|
||||||
"social_title":"Social",
|
"social_title":"Social",
|
||||||
"environment_title":"Environment",
|
"environment_title":"Environment",
|
||||||
"bookmarks": "Bookmarks",
|
"bookmarks": "Bookmarks",
|
||||||
|
|
||||||
"feedback_title": "Feedback",
|
"feedback_title": "Feedback",
|
||||||
"feedback_failed_msg": "Your feedback could not be \n submitted. Please try again",
|
"feedback_failed_msg": "Your feedback could not be \n submitted. Please try again",
|
||||||
"thankYou": "Thank you",
|
"thankYou": "Thank you",
|
||||||
|
|||||||
@ -16,6 +16,8 @@ import 'package:uae_stat/presentation/Screens/auth_verification/registration.dar
|
|||||||
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
|
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// void main() async {
|
// void main() async {
|
||||||
// WidgetsFlutterBinding.ensureInitialized();
|
// WidgetsFlutterBinding.ensureInitialized();
|
||||||
// // await (await SharedPreferences.getInstance()).clear();
|
// // await (await SharedPreferences.getInstance()).clear();
|
||||||
@ -89,6 +91,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
configureDependencies();
|
configureDependencies();
|
||||||
@ -102,10 +106,18 @@ void main() async {
|
|||||||
class MainApp extends ConsumerWidget {
|
class MainApp extends ConsumerWidget {
|
||||||
const MainApp({super.key});
|
const MainApp({super.key});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final locale = ref.watch(localeProvider);
|
final locale = ref.watch(localeProvider);
|
||||||
|
|
||||||
|
final connectivityProvider = Provider<bool>((ref) {
|
||||||
|
return true; // Replace with actual logic
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
// ref.listen<bool>(connectivityProvider, (previous, hasInternet) {
|
// ref.listen<bool>(connectivityProvider, (previous, hasInternet) {
|
||||||
// print('Previous Internet Status: $previous');
|
// print('Previous Internet Status: $previous');
|
||||||
// print('Current Internet Status: $hasInternet');
|
// print('Current Internet Status: $hasInternet');
|
||||||
|
|||||||
@ -10,6 +10,8 @@ import 'package:uae_stat/presentation/routes/bottom_bar_routes/tab_routes/home_r
|
|||||||
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
|
import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.dart';
|
||||||
import 'package:uae_stat/presentation/components/constant/constant.dart';
|
import 'package:uae_stat/presentation/components/constant/constant.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
|
||||||
|
|
||||||
class UaeNumbers extends StatelessWidget {
|
class UaeNumbers extends StatelessWidget {
|
||||||
const UaeNumbers({super.key});
|
const UaeNumbers({super.key});
|
||||||
@ -83,7 +85,7 @@ class _UaenumberWidgetState extends ConsumerState<uaenumberWidget> {
|
|||||||
|
|
||||||
Future<void> fetchData(locale) async {
|
Future<void> fetchData(locale) async {
|
||||||
// const baseUrl = 'https://pb.venbait.in/api/getHomePageData';
|
// const baseUrl = 'https://pb.venbait.in/api/getHomePageData';
|
||||||
const baseUrl = 'https://pb.venbait.in/api/getUAENumbersData';
|
const baseUrl = '$apiUrl/api/getUAENumbersData';
|
||||||
try {
|
try {
|
||||||
final response = await http.get(Uri.parse(baseUrl + '?language=$locale'));
|
final response = await http.get(Uri.parse(baseUrl + '?language=$locale'));
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import 'package:go_router/go_router.dart';
|
|||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'otp_verification.dart';
|
import 'otp_verification.dart';
|
||||||
|
|
||||||
class Changepassword extends StatefulWidget {
|
class Changepassword extends StatefulWidget {
|
||||||
@ -17,7 +18,7 @@ class Changepassword extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ResetPasswordScreenState extends State<Changepassword> {
|
class _ResetPasswordScreenState extends State<Changepassword> {
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
final _pb = PocketBase(apiUrl);
|
||||||
// final pb = PocketBase('http://127.0.0.1:8090');
|
// final pb = PocketBase('http://127.0.0.1:8090');
|
||||||
final _formKey = GlobalKey<FormState>();
|
final _formKey = GlobalKey<FormState>();
|
||||||
final _emailController = TextEditingController();
|
final _emailController = TextEditingController();
|
||||||
@ -46,7 +47,7 @@ class _ResetPasswordScreenState extends State<Changepassword> {
|
|||||||
// Check if email exists in the user collection
|
// Check if email exists in the user collection
|
||||||
final userCheckResponse = await http.get(
|
final userCheckResponse = await http.get(
|
||||||
Uri.parse(
|
Uri.parse(
|
||||||
'https://pb.venbait.in/api/collections/users/records?filter=email="$email"'),
|
'$apiUrl/api/collections/users/records?filter=email="$email"'),
|
||||||
headers: {
|
headers: {
|
||||||
'Authorization': 'Bearer $authToken',
|
'Authorization': 'Bearer $authToken',
|
||||||
},
|
},
|
||||||
@ -63,7 +64,7 @@ class _ResetPasswordScreenState extends State<Changepassword> {
|
|||||||
// Proceed with OTP request
|
// Proceed with OTP request
|
||||||
final otpResponse = await http.post(
|
final otpResponse = await http.post(
|
||||||
Uri.parse(
|
Uri.parse(
|
||||||
'https://pb.venbait.in/api/collections/otp_requests/records'),
|
'$apiUrl/api/collections/otp_requests/records'),
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Authorization': 'Bearer $authToken',
|
'Authorization': 'Bearer $authToken',
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/presentation/Screens/profilepage.dart';
|
import 'package:uae_stat/presentation/Screens/profilepage.dart';
|
||||||
|
|
||||||
class ConfirmPassword extends StatefulWidget {
|
class ConfirmPassword extends StatefulWidget {
|
||||||
@ -12,7 +13,7 @@ class ConfirmPassword extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ConfirmPasswordState extends State<ConfirmPassword> {
|
class _ConfirmPasswordState extends State<ConfirmPassword> {
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
final _pb = PocketBase(apiUrl);
|
||||||
// final pb = PocketBase('http://127.0.0.1:8090');
|
// final pb = PocketBase('http://127.0.0.1:8090');
|
||||||
final _formKey = GlobalKey<FormState>();
|
final _formKey = GlobalKey<FormState>();
|
||||||
bool _obscurePassword = true;
|
bool _obscurePassword = true;
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/config/my_router.dart';
|
import 'package:uae_stat/config/my_router.dart';
|
||||||
import 'package:uae_stat/domain/use_cases/language.dart';
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart';
|
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart';
|
||||||
@ -26,7 +27,7 @@ class CreateNewPw extends ConsumerStatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _CreateNewPwState extends ConsumerState<CreateNewPw> {
|
class _CreateNewPwState extends ConsumerState<CreateNewPw> {
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
final _pb = PocketBase(apiUrl);
|
||||||
final _formKey = GlobalKey<FormState>();
|
final _formKey = GlobalKey<FormState>();
|
||||||
bool _obscureOldPassword = true;
|
bool _obscureOldPassword = true;
|
||||||
bool _obscureNewPassword = true;
|
bool _obscureNewPassword = true;
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import 'dart:async';
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
|
||||||
import 'confirm_password.dart';
|
import 'confirm_password.dart';
|
||||||
|
|
||||||
@ -24,7 +25,7 @@ class EmailVerificationScreen extends StatefulWidget {
|
|||||||
|
|
||||||
class _EmailVerificationScreenState extends State<EmailVerificationScreen> {
|
class _EmailVerificationScreenState extends State<EmailVerificationScreen> {
|
||||||
// final pb = PocketBase('http://127.0.0.1:8090');
|
// final pb = PocketBase('http://127.0.0.1:8090');
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
final _pb = PocketBase(apiUrl);
|
||||||
final List<TextEditingController> _otpControllers =
|
final List<TextEditingController> _otpControllers =
|
||||||
List.generate(4, (_) => TextEditingController());
|
List.generate(4, (_) => TextEditingController());
|
||||||
int _secondsRemaining = 120; // 2 minutes timer
|
int _secondsRemaining = 120; // 2 minutes timer
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/config/my_theme.dart';
|
import 'package:uae_stat/config/my_theme.dart';
|
||||||
import 'package:uae_stat/domain/use_cases/language.dart';
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart';
|
import 'package:uae_stat/infrastructure/services/img_asset_paths/banner_asset_path.dart';
|
||||||
@ -38,7 +39,7 @@ class _RegisterScreenState extends ConsumerState<RegisterScreen> {
|
|||||||
bool isRegistering = false;
|
bool isRegistering = false;
|
||||||
dynamic userID;
|
dynamic userID;
|
||||||
|
|
||||||
final pb = PocketBase('https://pb.venbait.in');
|
final pb = PocketBase(apiUrl);
|
||||||
// final pb = PocketBase('http://127.0.0.1:8090');
|
// final pb = PocketBase('http://127.0.0.1:8090');
|
||||||
|
|
||||||
// Add focus nodes and hint states
|
// Add focus nodes and hint states
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
@ -8,6 +10,7 @@ import 'package:pocketbase/pocketbase.dart';
|
|||||||
import 'package:screenshot/screenshot.dart';
|
import 'package:screenshot/screenshot.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:tutorial_coach_mark/tutorial_coach_mark.dart';
|
import 'package:tutorial_coach_mark/tutorial_coach_mark.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/config/toast_util.dart';
|
import 'package:uae_stat/config/toast_util.dart';
|
||||||
import 'package:uae_stat/domain/use_cases/language.dart';
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart';
|
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart';
|
||||||
@ -31,6 +34,8 @@ class ChartScreen1 extends ConsumerStatefulWidget {
|
|||||||
final String mainTopic;
|
final String mainTopic;
|
||||||
final String title;
|
final String title;
|
||||||
final String? keyParam; // Nullable String
|
final String? keyParam; // Nullable String
|
||||||
|
final String kpi;
|
||||||
|
final List<Map<String, dynamic>> filter_data;
|
||||||
|
|
||||||
const ChartScreen1({
|
const ChartScreen1({
|
||||||
Key? key,
|
Key? key,
|
||||||
@ -39,13 +44,16 @@ class ChartScreen1 extends ConsumerStatefulWidget {
|
|||||||
required this.mainTopic,
|
required this.mainTopic,
|
||||||
required this.title,
|
required this.title,
|
||||||
required this.keyParam,
|
required this.keyParam,
|
||||||
|
required this.kpi,
|
||||||
|
required this.filter_data,
|
||||||
});
|
});
|
||||||
@override
|
@override
|
||||||
ConsumerState<ChartScreen1> createState() => _ChartScreen1State();
|
ConsumerState<ChartScreen1> createState() => _ChartScreen1State();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
// final _pb = PocketBase('https://pb.venbait.in');
|
||||||
|
final _pb = PocketBase(apiUrl);
|
||||||
List<Map<String, dynamic>> selectedFiltersStorage = [];
|
List<Map<String, dynamic>> selectedFiltersStorage = [];
|
||||||
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
||||||
final ApiService apiService = ApiService();
|
final ApiService apiService = ApiService();
|
||||||
@ -67,6 +75,9 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
late Color backgroundColor;
|
late Color backgroundColor;
|
||||||
final ScrollController _scrollController = ScrollController();
|
final ScrollController _scrollController = ScrollController();
|
||||||
int _activeTabIndex = 0;
|
int _activeTabIndex = 0;
|
||||||
|
dynamic tabWiseKpi=[];
|
||||||
|
dynamic tabFilteredKpi=[];
|
||||||
|
List<Map<String, dynamic>> formattedFilters=[];
|
||||||
|
|
||||||
dynamic _tabsData = [];
|
dynamic _tabsData = [];
|
||||||
// List<Map<String, dynamic>> _tabsData = [];
|
// List<Map<String, dynamic>> _tabsData = [];
|
||||||
@ -85,11 +96,12 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
super.initState();
|
super.initState();
|
||||||
final String bgColor = widget.bgColor;
|
final String bgColor = widget.bgColor;
|
||||||
print(' bgColor $bgColor');
|
print(' bgColor $bgColor');
|
||||||
// fetchChartData(widget.dataSets);
|
|
||||||
checkIfBookmarked();
|
checkIfBookmarked();
|
||||||
locale = ref.read(localeProvider) ?? const Locale('en');
|
locale = ref.read(localeProvider) ?? const Locale('en');
|
||||||
fetchChartData(widget.dataSets, locale?.languageCode ?? 'en').then((_) {
|
|
||||||
if (_tabsData.isNotEmpty) {
|
fetchChartData(widget.dataSets, locale?.languageCode ?? 'en', widget.kpi, widget.filter_data)
|
||||||
|
.then((_) {
|
||||||
|
if(_tabsData.isNotEmpty) {
|
||||||
// Call onTabSelected for the first tab
|
// Call onTabSelected for the first tab
|
||||||
onTabSelected(_tabsData[0]['id']);
|
onTabSelected(_tabsData[0]['id']);
|
||||||
}
|
}
|
||||||
@ -1202,6 +1214,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
void processChartData(chartsData) {
|
void processChartData(chartsData) {
|
||||||
|
print("PROCESSING FILTER CHART DATa");
|
||||||
|
|
||||||
// Group data by 'kpi'
|
// Group data by 'kpi'
|
||||||
Map<String, List<Map<String, dynamic>>> groupedData = {};
|
Map<String, List<Map<String, dynamic>>> groupedData = {};
|
||||||
|
|
||||||
@ -1231,7 +1245,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
? word[0].toUpperCase() + word.substring(1)
|
? word[0].toUpperCase() + word.substring(1)
|
||||||
: '') // Capitalize
|
: '') // Capitalize
|
||||||
.join(' '); // Join words with space
|
.join(' '); // Join words with space
|
||||||
|
|
||||||
return {'id': kpi, 'name': tabHeading, 'order': tabOrder.toString()};
|
return {'id': kpi, 'name': tabHeading, 'order': tabOrder.toString()};
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
@ -1244,7 +1257,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
|
|
||||||
print('Sorted Tabs: $_tabs');
|
print('Sorted Tabs: $_tabs');
|
||||||
|
|
||||||
print('Grouped Data: $groupedData');
|
// print('Grouped Data: $groupedData');
|
||||||
print('Tabs: $_tabs');
|
print('Tabs: $_tabs');
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
@ -1252,8 +1265,13 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> fetchChartData(String dataSets, locale) async {
|
Future<void> fetchChartData(String dataSets, locale, kpi, filter_data ) async {
|
||||||
var data = await apiService.fetchChartData(dataSets, locale);
|
var data = await apiService.fetchChartData(dataSets, locale,kpi,filter_data);
|
||||||
|
|
||||||
|
tabFilteredKpi = kpi;
|
||||||
|
print('FETCH KPI- $kpi');
|
||||||
|
print('FETCH KFilter- $filter_data');
|
||||||
|
|
||||||
|
|
||||||
if (data.containsKey('filterData')) {
|
if (data.containsKey('filterData')) {
|
||||||
var filterData = data['filterData'];
|
var filterData = data['filterData'];
|
||||||
@ -1281,18 +1299,71 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
|
|
||||||
processChartData(chartsData);
|
processChartData(chartsData);
|
||||||
|
|
||||||
|
onTabSelected(tabFilteredKpi);
|
||||||
|
|
||||||
print('chartsData :- $chartsData');
|
print('chartsData :- $chartsData');
|
||||||
print('cardData :- $cardData');
|
print('cardData :- $cardData');
|
||||||
print('chartScreenData :- $chartScreenData');
|
print('chartScreenData :- $chartScreenData');
|
||||||
// print('filterData :- $filterData');
|
// print('filterData :- $filterData');
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
});
|
});
|
||||||
print('chartsData -$chartsData');
|
// print('chartsData -$chartsData');
|
||||||
print('cardData -$cardData');
|
// print('cardData -$cardData');
|
||||||
}
|
}
|
||||||
|
|
||||||
void applyFilters(BuildContext context, List filters, List data,
|
void applyFilters(BuildContext context, List filters, List data,
|
||||||
List dataCard, List selectedFilters) {
|
List dataCard, List selectedFilters) {
|
||||||
|
|
||||||
|
print('applyFilters called');
|
||||||
|
print('Selected ApplyFilters: $selectedFilters');
|
||||||
|
|
||||||
|
if (selectedFilters.every((filter) => filter['filter_data'].isEmpty)) {
|
||||||
|
setState(() {
|
||||||
|
chartsData =
|
||||||
|
List.from(originalTabChartsData); // Restore the original data
|
||||||
|
// cardData = List.from(originalTabCardData); // Restore the original data
|
||||||
|
});
|
||||||
|
print('Returning as no filters are selected');
|
||||||
|
Navigator.pop(context);
|
||||||
|
return; // Exit early since all filter_data are empty
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transform the selectedFilters list into the required format
|
||||||
|
formattedFilters = selectedFilters
|
||||||
|
.where((filter) => filter['filter_data'] != null && filter['filter_data'].isNotEmpty)
|
||||||
|
.map((filter){
|
||||||
|
return{
|
||||||
|
'filter_key': filter['filter_key'],
|
||||||
|
'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
|
||||||
|
});
|
||||||
|
|
||||||
|
print('Formatted Filters2: $selectedFormatFilters');
|
||||||
|
|
||||||
|
// Call fetchChartData with correct parameters
|
||||||
|
fetchChartData(
|
||||||
|
widget.dataSets,
|
||||||
|
locale.languageCode ?? 'en',
|
||||||
|
tabWiseKpi, // Ensure you are passing the correct KPI here
|
||||||
|
formattedFilters // Pass the formatted filter data here
|
||||||
|
);
|
||||||
|
Navigator.pop(context);
|
||||||
|
|
||||||
|
selectedFiltersStorage = List.from(selectedFilters);
|
||||||
|
print('selectedFiltersStoraged- $selectedFiltersStorage');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void applyFilters1(BuildContext context, List filters, List data,
|
||||||
|
List dataCard, List selectedFilters) {
|
||||||
print("applyFilters called");
|
print("applyFilters called");
|
||||||
print("Selected ApplyFilters: $selectedFilters");
|
print("Selected ApplyFilters: $selectedFilters");
|
||||||
print("Selected data: $data");
|
print("Selected data: $data");
|
||||||
@ -1429,6 +1500,9 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void showRightSideModal(BuildContext context, List filters, List data) {
|
void showRightSideModal(BuildContext context, List filters, List data) {
|
||||||
|
|
||||||
|
print('selectedFiltersStoraged1- $selectedFiltersStorage');
|
||||||
|
|
||||||
// Initialize selected filters structure from the stored value, if exists
|
// Initialize selected filters structure from the stored value, if exists
|
||||||
List<Map<String, dynamic>> selectedFilters =
|
List<Map<String, dynamic>> selectedFilters =
|
||||||
selectedFiltersStorage.isNotEmpty
|
selectedFiltersStorage.isNotEmpty
|
||||||
@ -1437,6 +1511,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
return {"filter_key": filter["filter_key"], "filter_data": []};
|
return {"filter_key": filter["filter_key"], "filter_data": []};
|
||||||
}).toList(); // Or initialize empty filters
|
}).toList(); // Or initialize empty filters
|
||||||
|
|
||||||
|
print('selectedFiltersStoragedrgt- $selectedFiltersStorage');
|
||||||
|
|
||||||
showModalBottomSheet(
|
showModalBottomSheet(
|
||||||
context: context,
|
context: context,
|
||||||
isScrollControlled: true,
|
isScrollControlled: true,
|
||||||
@ -1706,6 +1782,13 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
cardData = List.from(originalTabCardData);
|
cardData = List.from(originalTabCardData);
|
||||||
});
|
});
|
||||||
selectedFiltersStorage.clear();
|
selectedFiltersStorage.clear();
|
||||||
|
formattedFilters = [];
|
||||||
|
fetchChartData(
|
||||||
|
widget.dataSets,
|
||||||
|
locale.languageCode ?? 'en',
|
||||||
|
tabWiseKpi, // Ensure you are passing the correct KPI here
|
||||||
|
formattedFilters // Pass the formatted filter data here
|
||||||
|
);
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
@ -1738,6 +1821,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
onPressed: () {
|
onPressed: () {
|
||||||
print(
|
print(
|
||||||
"Selected Filters before applying: $selectedFilters");
|
"Selected Filters before applying: $selectedFilters");
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
chartsData = originalTabChartsData;
|
chartsData = originalTabChartsData;
|
||||||
cardData = originalTabCardData;
|
cardData = originalTabCardData;
|
||||||
@ -1745,7 +1829,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
|
|
||||||
applyFilters(context, filters, chartsData, cardData,
|
applyFilters(context, filters, chartsData, cardData,
|
||||||
selectedFilters);
|
selectedFilters);
|
||||||
selectedFiltersStorage = List.from(selectedFilters);
|
// selectedFiltersStorage = List.from(selectedFilters);
|
||||||
},
|
},
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
backgroundColor: Color(0xFF92722A),
|
backgroundColor: Color(0xFF92722A),
|
||||||
@ -1787,8 +1871,10 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void onTabSelected(String tabId) {
|
void onTabSelected(String tabId) {
|
||||||
print('Selected Tab: $tabId');
|
print('Selected Tab on: $tabId');
|
||||||
selectedFiltersStorage.clear();
|
tabWiseKpi = tabId;
|
||||||
|
|
||||||
|
// selectedFiltersStorage.clear();
|
||||||
// Filter the filterDataSet
|
// Filter the filterDataSet
|
||||||
filterData = filterDataSet
|
filterData = filterDataSet
|
||||||
.where((item) => item['key'] == tabId)
|
.where((item) => item['key'] == tabId)
|
||||||
@ -1824,7 +1910,8 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void performActionForTab(String tabId) {
|
void performActionForTab(String tabId) {
|
||||||
print('Selected Tab: $tabId');
|
|
||||||
|
print('Selected Tab perform: $tabId');
|
||||||
|
|
||||||
// Filter the chartsData array based on the tabId
|
// Filter the chartsData array based on the tabId
|
||||||
tabFilteredChartData = chartsData.where((chart) {
|
tabFilteredChartData = chartsData.where((chart) {
|
||||||
@ -1920,12 +2007,18 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
|
final localeCode = next?.languageCode ?? 'en'; // Default to 'en' if null
|
||||||
// fetchChartData(widget.dataSets, localeCode);
|
// fetchChartData(widget.dataSets, localeCode);
|
||||||
|
|
||||||
fetchChartData(widget.dataSets, localeCode).then((_) {
|
|
||||||
|
final List<Map<String, dynamic>> safeFilterData = widget.filter_data ?? [];
|
||||||
|
final String safeKpi = widget.kpi ?? '';
|
||||||
|
fetchChartData(widget.dataSets,localeCode, safeKpi, safeFilterData).then((_) {
|
||||||
|
print('DEBUG KPI: $safeKpi');
|
||||||
if (_tabsData.isNotEmpty) {
|
if (_tabsData.isNotEmpty) {
|
||||||
// Call onTabSelected for the first tab
|
// Call onTabSelected for the first tab
|
||||||
onTabSelected(_tabsData[0]['id']);
|
onTabSelected(_tabsData[0]['id']);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
double myheight = MediaQuery.of(context).size.height;
|
double myheight = MediaQuery.of(context).size.height;
|
||||||
double mywidth = MediaQuery.of(context).size.width;
|
double mywidth = MediaQuery.of(context).size.width;
|
||||||
@ -2303,483 +2396,6 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// Padding(
|
|
||||||
// padding: const EdgeInsets.all(3.34),
|
|
||||||
// child: GridView.builder(
|
|
||||||
// key: cardKey,
|
|
||||||
// itemCount: cardData.length,
|
|
||||||
// shrinkWrap: true,
|
|
||||||
// physics: const NeverScrollableScrollPhysics(),
|
|
||||||
// gridDelegate:
|
|
||||||
// SliverGridDelegateWithFixedCrossAxisCount(
|
|
||||||
// crossAxisCount: 2,
|
|
||||||
// // crossAxisCount: cardData.length % 2 == 0 ? 2 : 3,
|
|
||||||
//
|
|
||||||
// crossAxisSpacing: 2,
|
|
||||||
//
|
|
||||||
// mainAxisSpacing: 5,
|
|
||||||
//
|
|
||||||
// childAspectRatio: MediaQuery.of(context)
|
|
||||||
// .size
|
|
||||||
// .width /
|
|
||||||
// (MediaQuery.of(context).size.height /
|
|
||||||
// (cardData.length % 2 == 0 ? 2 : 2)),
|
|
||||||
// ),
|
|
||||||
//
|
|
||||||
// // Sort and filter the cardData
|
|
||||||
//
|
|
||||||
// itemBuilder: (context, index) {
|
|
||||||
// final item = cardData[index];
|
|
||||||
// print('item item item $item');
|
|
||||||
// final chart_type = item['chart_type'];
|
|
||||||
// final chart_heading = item['chart_heading'];
|
|
||||||
// final card_full_length =
|
|
||||||
// item['card_full_length'];
|
|
||||||
// print('cardfulllength $card_full_length');
|
|
||||||
// final response =
|
|
||||||
// item['response'] as List<dynamic>? ??
|
|
||||||
// [];
|
|
||||||
// final card_logo = item['card_logo'];
|
|
||||||
// final data =
|
|
||||||
// apiService.processNonChartData(item);
|
|
||||||
// print('processNonChartData');
|
|
||||||
//
|
|
||||||
// double cardHeight =
|
|
||||||
// (chart_type == 'totals' ||
|
|
||||||
// chart_type == 'averages')
|
|
||||||
// ? 180.0
|
|
||||||
// : 130.0;
|
|
||||||
// // double myheight = MediaQuery.of(context).size.height;
|
|
||||||
// // double mywidth = MediaQuery.of(context).size.width;
|
|
||||||
// // final cardWidth = rowItems.length == 1 ? myWidth : (myWidth - 16) / 2.6;
|
|
||||||
// print('find width $cardData');
|
|
||||||
// final itemdata = cardData[index];
|
|
||||||
// // bool isOddLength = cardData.length % 2 != 0;
|
|
||||||
// // bool isLastSingleCard = isOddLength &&
|
|
||||||
// // index == cardData.length - 1;
|
|
||||||
// // print('isLastSingleCard $isLastSingleCard');
|
|
||||||
//
|
|
||||||
// if (response.isEmpty) {
|
|
||||||
// return const SizedBox.shrink();
|
|
||||||
// // return Container(
|
|
||||||
// // color: Colors.redAccent,
|
|
||||||
// // );
|
|
||||||
// }
|
|
||||||
// if (response.length == 1) {
|
|
||||||
// return Container(
|
|
||||||
// margin: const EdgeInsets.all(10),
|
|
||||||
// width: card_full_length
|
|
||||||
// ? double.infinity
|
|
||||||
// : null,
|
|
||||||
// decoration: BoxDecoration(
|
|
||||||
// borderRadius:
|
|
||||||
// BorderRadius.circular(12),
|
|
||||||
// border: Border.all(
|
|
||||||
// color: Color(int.parse(
|
|
||||||
// (chartScreenData[
|
|
||||||
// 'border_color'] ??
|
|
||||||
// '#898C81')
|
|
||||||
// .replaceFirst(
|
|
||||||
// '#', '0xff'))),
|
|
||||||
// // Dynamic border color
|
|
||||||
// width:
|
|
||||||
// 1, // Adjust border thickness
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// child: Card(
|
|
||||||
// margin: const EdgeInsets.all(0),
|
|
||||||
// shape: RoundedRectangleBorder(
|
|
||||||
// borderRadius:
|
|
||||||
// BorderRadius.circular(12),
|
|
||||||
// ),
|
|
||||||
// elevation: 2,
|
|
||||||
// child: Container(
|
|
||||||
// height: cardHeight,
|
|
||||||
// padding: const EdgeInsets.only(
|
|
||||||
// left: 16.0,
|
|
||||||
// right: 16.0,
|
|
||||||
// bottom: 1.0,
|
|
||||||
// top: 1.0),
|
|
||||||
// decoration: BoxDecoration(
|
|
||||||
// color: Colors
|
|
||||||
// .white, // Move color inside BoxDecoration
|
|
||||||
// borderRadius: BorderRadius.circular(
|
|
||||||
// 12), // Ensure border radius is applied
|
|
||||||
// ),
|
|
||||||
// child: Column(
|
|
||||||
// mainAxisSize: MainAxisSize.min,
|
|
||||||
// mainAxisAlignment:
|
|
||||||
// MainAxisAlignment.center,
|
|
||||||
// children: [
|
|
||||||
// Image.network(
|
|
||||||
// card_logo ?? '',
|
|
||||||
// width: 30,
|
|
||||||
// height: 30,
|
|
||||||
// errorBuilder: (context,
|
|
||||||
// error, stackTrace) {
|
|
||||||
// return Icon(Icons.public,
|
|
||||||
// color:
|
|
||||||
// Color(0xFF90B0D5),
|
|
||||||
// size:
|
|
||||||
// 30); // Fallback icon
|
|
||||||
// },
|
|
||||||
// ),
|
|
||||||
// const SizedBox(height: 1),
|
|
||||||
// MouseRegion(
|
|
||||||
// onEnter: (event) {
|
|
||||||
// // Show tooltip on hover
|
|
||||||
// final overlay = Overlay
|
|
||||||
// .of(context)
|
|
||||||
// .context
|
|
||||||
// .findRenderObject()
|
|
||||||
// as RenderBox;
|
|
||||||
// final entry =
|
|
||||||
// OverlayEntry(
|
|
||||||
// builder: (context) =>
|
|
||||||
// Positioned(
|
|
||||||
// left: overlay
|
|
||||||
// .localToGlobal(
|
|
||||||
// Offset.zero)
|
|
||||||
// .dx,
|
|
||||||
// top: overlay
|
|
||||||
// .localToGlobal(
|
|
||||||
// Offset.zero)
|
|
||||||
// .dy,
|
|
||||||
// child: Material(
|
|
||||||
// color: Colors
|
|
||||||
// .transparent,
|
|
||||||
// child: Container(
|
|
||||||
// padding:
|
|
||||||
// EdgeInsets
|
|
||||||
// .all(8),
|
|
||||||
// decoration:
|
|
||||||
// BoxDecoration(
|
|
||||||
// color: Colors
|
|
||||||
// .black87,
|
|
||||||
// borderRadius:
|
|
||||||
// BorderRadius
|
|
||||||
// .circular(
|
|
||||||
// 4),
|
|
||||||
// ),
|
|
||||||
// child: Text(
|
|
||||||
// chart_heading ??
|
|
||||||
// 'NA',
|
|
||||||
// style: TextStyle(
|
|
||||||
// color: Colors
|
|
||||||
// .white),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
// Overlay.of(context)
|
|
||||||
// .insert(entry);
|
|
||||||
// Future.delayed(
|
|
||||||
// Duration(seconds: 2),
|
|
||||||
// () => entry.remove());
|
|
||||||
// },
|
|
||||||
// child: Text(
|
|
||||||
// chart_heading ?? 'NA',
|
|
||||||
// textAlign:
|
|
||||||
// TextAlign.center,
|
|
||||||
// maxLines: 2,
|
|
||||||
// overflow: TextOverflow
|
|
||||||
// .ellipsis, // Truncate text with '...'
|
|
||||||
// style: TextStyle(
|
|
||||||
// fontSize: 11,
|
|
||||||
// fontWeight:
|
|
||||||
// FontWeight.w400,
|
|
||||||
// color: Colors.black87,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// const SizedBox(height: 5),
|
|
||||||
// Text(
|
|
||||||
// RegExp(r'\d').hasMatch(
|
|
||||||
// response[0][
|
|
||||||
// 'display_value'] ??
|
|
||||||
// '')
|
|
||||||
// ? '(${response[0]['display_value'] ?? 'NA'})'
|
|
||||||
// : '${response[0]['display_value'] ?? 'NA'}',
|
|
||||||
// style: const TextStyle(
|
|
||||||
// fontSize: 11,
|
|
||||||
// color: Colors.grey,
|
|
||||||
// overflow: TextOverflow
|
|
||||||
// .ellipsis, // Truncate if text overflows
|
|
||||||
// ),
|
|
||||||
// maxLines:
|
|
||||||
// 1, // Limit to one line to prevent overflow
|
|
||||||
// textAlign: TextAlign
|
|
||||||
// .center, // Ensure proper alignment
|
|
||||||
// ),
|
|
||||||
// const SizedBox(height: 1),
|
|
||||||
// Row(
|
|
||||||
// mainAxisAlignment:
|
|
||||||
// MainAxisAlignment
|
|
||||||
// .center, // Center-aligns the row contents
|
|
||||||
// children: [
|
|
||||||
// Text(
|
|
||||||
// response[0]['value'] ??
|
|
||||||
// 'NA',
|
|
||||||
// textAlign: TextAlign
|
|
||||||
// .center, // Ensures text is centered
|
|
||||||
// style: TextStyle(
|
|
||||||
// fontSize: 23,
|
|
||||||
// fontWeight:
|
|
||||||
// FontWeight.w800,
|
|
||||||
// color: (response[0][
|
|
||||||
// 'font_color'] ??
|
|
||||||
// '')
|
|
||||||
// .isEmpty
|
|
||||||
// ? bodyColor
|
|
||||||
// : _getColorFromHex(
|
|
||||||
// response[0][
|
|
||||||
// 'font_color']),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// const SizedBox(
|
|
||||||
// width:
|
|
||||||
// 4), // Space between text and icon
|
|
||||||
// if (response[0]
|
|
||||||
// ['calculation'] ==
|
|
||||||
// 'different') ...[
|
|
||||||
// if (response[0][
|
|
||||||
// 'font_color'] ==
|
|
||||||
// '#D83731')
|
|
||||||
// const Icon(
|
|
||||||
// Icons
|
|
||||||
// .arrow_downward,
|
|
||||||
// color: Colors.red,
|
|
||||||
// size: 20)
|
|
||||||
// else if (response[0][
|
|
||||||
// 'font_color'] ==
|
|
||||||
// '#11AF22')
|
|
||||||
// const Icon(
|
|
||||||
// Icons
|
|
||||||
// .arrow_upward,
|
|
||||||
// color:
|
|
||||||
// Colors.green,
|
|
||||||
// size: 20),
|
|
||||||
// ],
|
|
||||||
// ],
|
|
||||||
// )
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ));
|
|
||||||
// } else {
|
|
||||||
// return Container(
|
|
||||||
// margin: const EdgeInsets.all(10),
|
|
||||||
// width: card_full_length
|
|
||||||
// ? double.infinity
|
|
||||||
// : null,
|
|
||||||
// decoration: BoxDecoration(
|
|
||||||
// borderRadius:
|
|
||||||
// BorderRadius.circular(12),
|
|
||||||
// border: Border.all(
|
|
||||||
// color: Color(int.parse((chartScreenData[
|
|
||||||
// 'border_color'] ??
|
|
||||||
// '#898C81')
|
|
||||||
// .replaceFirst('#',
|
|
||||||
// '0xff'))), // Dynamic border color
|
|
||||||
// width: 1, // Adjust border thickness
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// child: Card(
|
|
||||||
// margin: const EdgeInsets.all(0),
|
|
||||||
// shape: RoundedRectangleBorder(
|
|
||||||
// borderRadius:
|
|
||||||
// BorderRadius.circular(12),
|
|
||||||
// ),
|
|
||||||
// elevation:
|
|
||||||
// 0, // Remove shadow to keep only the outli
|
|
||||||
//
|
|
||||||
// child: Container(
|
|
||||||
// height: cardHeight,
|
|
||||||
// padding: const EdgeInsets.all(10.0),
|
|
||||||
// decoration: BoxDecoration(
|
|
||||||
// color: Colors
|
|
||||||
// .white, // Move color inside BoxDecoration
|
|
||||||
// borderRadius: BorderRadius.circular(
|
|
||||||
// 12), // Ensure border radius is applied
|
|
||||||
// ),
|
|
||||||
// child: Column(
|
|
||||||
// mainAxisSize: MainAxisSize
|
|
||||||
// .min, // Adjust card height based on content
|
|
||||||
// mainAxisAlignment:
|
|
||||||
// MainAxisAlignment.center,
|
|
||||||
// children: [
|
|
||||||
// // const Icon(Icons.public,
|
|
||||||
// // color: Color(0xFF90B0D5), size: 30),
|
|
||||||
// Image.network(
|
|
||||||
// card_logo ?? '',
|
|
||||||
// width: 30,
|
|
||||||
// height: 30,
|
|
||||||
// errorBuilder: (context, error,
|
|
||||||
// stackTrace) {
|
|
||||||
// return Icon(Icons.public,
|
|
||||||
// color:
|
|
||||||
// Color(0xFF90B0D5),
|
|
||||||
// size:
|
|
||||||
// 30); // Fallback icon
|
|
||||||
// },
|
|
||||||
// ),
|
|
||||||
// const SizedBox(height: 3),
|
|
||||||
// MouseRegion(
|
|
||||||
// onEnter: (event) {
|
|
||||||
// final overlay =
|
|
||||||
// Overlay.of(context);
|
|
||||||
// final entry = OverlayEntry(
|
|
||||||
// builder: (context) =>
|
|
||||||
// Positioned(
|
|
||||||
// left: event.position.dx,
|
|
||||||
// top: event.position.dy +
|
|
||||||
// 10, // Adjust tooltip position
|
|
||||||
// child: Material(
|
|
||||||
// color: Colors
|
|
||||||
// .transparent,
|
|
||||||
// child: Container(
|
|
||||||
// padding:
|
|
||||||
// EdgeInsets.all(
|
|
||||||
// 8),
|
|
||||||
// decoration:
|
|
||||||
// BoxDecoration(
|
|
||||||
// color: Colors
|
|
||||||
// .black87,
|
|
||||||
// borderRadius:
|
|
||||||
// BorderRadius
|
|
||||||
// .circular(
|
|
||||||
// 4),
|
|
||||||
// ),
|
|
||||||
// child: Text(
|
|
||||||
// chart_heading ??
|
|
||||||
// 'NA',
|
|
||||||
// style: TextStyle(
|
|
||||||
// color: Colors
|
|
||||||
// .white,
|
|
||||||
// fontSize: 10),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
// overlay.insert(entry);
|
|
||||||
// Future.delayed(
|
|
||||||
// Duration(seconds: 2),
|
|
||||||
// () => entry.remove());
|
|
||||||
// },
|
|
||||||
// child: SizedBox(
|
|
||||||
// width: double
|
|
||||||
// .infinity, // Ensures it uses available space
|
|
||||||
// child: Text(
|
|
||||||
// chart_heading ?? 'NA',
|
|
||||||
// textAlign:
|
|
||||||
// TextAlign.center,
|
|
||||||
// maxLines: 2,
|
|
||||||
// overflow: TextOverflow
|
|
||||||
// .ellipsis, // Truncate with '...'
|
|
||||||
// style: TextStyle(
|
|
||||||
// fontSize: 11,
|
|
||||||
// fontWeight:
|
|
||||||
// FontWeight.w400,
|
|
||||||
// color: Colors.black87,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// const SizedBox(height: 1),
|
|
||||||
// Text(
|
|
||||||
// // '(${response[0]['display_value'] ?? 'NA'})',
|
|
||||||
//
|
|
||||||
// RegExp(r'\d').hasMatch(response[
|
|
||||||
// 0][
|
|
||||||
// 'display_value'] ??
|
|
||||||
// '')
|
|
||||||
// ? '(${response[0]['display_value'] ?? 'NA'})'
|
|
||||||
// : '${response[0]['display_value'] ?? 'NA'}',
|
|
||||||
//
|
|
||||||
// style: const TextStyle(
|
|
||||||
// fontSize: 11,
|
|
||||||
// color: Colors.grey,
|
|
||||||
// overflow:
|
|
||||||
// TextOverflow.ellipsis,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// const SizedBox(height: 1),
|
|
||||||
// Text(
|
|
||||||
// response[0]['value'] ?? 'NA',
|
|
||||||
// overflow: TextOverflow
|
|
||||||
// .ellipsis, // Truncate text if it overflows
|
|
||||||
// maxLines:
|
|
||||||
// 1, // Ensures text stays in a single line
|
|
||||||
// style: TextStyle(
|
|
||||||
// fontSize: 23,
|
|
||||||
// fontWeight: FontWeight.w900,
|
|
||||||
// color: (response[0][
|
|
||||||
// 'font_color'] ??
|
|
||||||
// '')
|
|
||||||
// .isEmpty
|
|
||||||
// ? bodyColor
|
|
||||||
// : _getColorFromHex(
|
|
||||||
// response[0]
|
|
||||||
// ['font_color']),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// SizedBox(
|
|
||||||
// height:
|
|
||||||
// 2, // Height of the divider
|
|
||||||
// child: Divider(
|
|
||||||
// color: Color(0xFFBBBCBD),
|
|
||||||
// thickness:
|
|
||||||
// 1, // Divider line thickness
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// Text(
|
|
||||||
// response[1]['value'] ?? 'NA',
|
|
||||||
// style: TextStyle(
|
|
||||||
// fontSize: 16,
|
|
||||||
// fontWeight: FontWeight.w600,
|
|
||||||
// color: (response[1][
|
|
||||||
// 'font_color'] ??
|
|
||||||
// '')
|
|
||||||
// .isEmpty
|
|
||||||
// ? const Color(
|
|
||||||
// 0xFFD83731)
|
|
||||||
// : _getColorFromHex(
|
|
||||||
// response[1]
|
|
||||||
// ['font_color']),
|
|
||||||
// ),
|
|
||||||
// textAlign: TextAlign
|
|
||||||
// .center, // Ensure proper alignment
|
|
||||||
// overflow: TextOverflow
|
|
||||||
// .ellipsis, // Truncate if text overflows
|
|
||||||
// ),
|
|
||||||
// Text(
|
|
||||||
// // '(${response[1]['display_value'] ?? 'NA'})',
|
|
||||||
// RegExp(r'\d').hasMatch(response[
|
|
||||||
// 1][
|
|
||||||
// 'display_value'] ??
|
|
||||||
// '')
|
|
||||||
// ? '(${response[1]['display_value'] ?? 'NA'})'
|
|
||||||
// : '${response[1]['display_value'] ?? 'NA'}',
|
|
||||||
// style: const TextStyle(
|
|
||||||
// fontSize: 8,
|
|
||||||
// fontWeight: FontWeight.w500,
|
|
||||||
// color: Colors.grey,
|
|
||||||
// overflow:
|
|
||||||
// TextOverflow.ellipsis,
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// chartsData Cards
|
|
||||||
ListView.builder(
|
ListView.builder(
|
||||||
itemCount: chartsData.length,
|
itemCount: chartsData.length,
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
@ -2818,7 +2434,7 @@ class _ChartScreen1State extends ConsumerState<ChartScreen1> {
|
|||||||
? 500
|
? 500
|
||||||
: (chartsData[index][
|
: (chartsData[index][
|
||||||
'chart_type'] ==
|
'chart_type'] ==
|
||||||
'bar_chart_horizontal')
|
'bar_chart_horizontal')
|
||||||
? 370
|
? 370
|
||||||
: (chartsData[index]['chart_type'] == 'fl_stacked_bar')
|
: (chartsData[index]['chart_type'] == 'fl_stacked_bar')
|
||||||
? 390
|
? 390
|
||||||
@ -2980,7 +2596,12 @@ class CardWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (response.length == 1) {
|
|
||||||
|
if(response.isEmpty)
|
||||||
|
{
|
||||||
|
return SizedBox.shrink();
|
||||||
|
}
|
||||||
|
else if (response.length == 1) {
|
||||||
return Container(
|
return Container(
|
||||||
margin: const EdgeInsets.all(10),
|
margin: const EdgeInsets.all(10),
|
||||||
// width: card_full_length ? double.infinity : null,
|
// width: card_full_length ? double.infinity : null,
|
||||||
@ -3117,7 +2738,7 @@ class CardWidget extends StatelessWidget {
|
|||||||
margin: const EdgeInsets.all(10),
|
margin: const EdgeInsets.all(10),
|
||||||
// width: card_full_length ? double.infinity : null,
|
// width: card_full_length ? double.infinity : null,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: Color(int.parse(
|
color: Color(int.parse(
|
||||||
(chartScreenData['border_color'] ?? '#898C81')
|
(chartScreenData['border_color'] ?? '#898C81')
|
||||||
@ -3341,4 +2962,4 @@ class CardWidget extends StatelessWidget {
|
|||||||
// ),
|
// ),
|
||||||
// );
|
// );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,8 @@ import 'dart:convert';
|
|||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
|
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
|
||||||
class ChartData {
|
class ChartData {
|
||||||
final DateTime? xDateTime;
|
final DateTime? xDateTime;
|
||||||
final String? x; // Optional for non-DateTime-based charts
|
final String? x; // Optional for non-DateTime-based charts
|
||||||
@ -11,19 +13,49 @@ class ChartData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class ApiService {
|
class ApiService {
|
||||||
static const String baseUrl = 'https://pb.venbait.in/api/getDataSet';
|
// static const String baseUrl = 'https://pb.venbait.in/api/getDataSet';
|
||||||
|
static const String baseUrl = '$apiUrl/api/getDataSet';
|
||||||
|
|
||||||
Future<Map<String, dynamic>> fetchChartData(String dataSets, locale) async {
|
Future<Map<String, dynamic>> fetchChartData(String dataSets, locale,kpi,
|
||||||
|
List<Map<String, dynamic>> filterData) async {
|
||||||
List<dynamic> isChartData = [];
|
List<dynamic> isChartData = [];
|
||||||
List<dynamic> nonChartData = [];
|
List<dynamic> nonChartData = [];
|
||||||
List<dynamic> originalChartsData = [];
|
List<dynamic> originalChartsData = [];
|
||||||
List<dynamic> originalCardData = [];
|
List<dynamic> originalCardData = [];
|
||||||
|
|
||||||
final url = Uri.parse('$baseUrl?dataset=$dataSets&language=$locale');
|
// final url = Uri.parse('$baseUrl?dataset=$dataSets&language=$locale');
|
||||||
|
// final url = Uri.parse(
|
||||||
|
// '$baseUrl?dataset=$dataSets&language=$locale&kpi=$kpi&filter_data=${Uri.encodeComponent(jsonEncode(filterData))}'
|
||||||
|
// );
|
||||||
|
|
||||||
|
|
||||||
|
final url = Uri.parse(baseUrl); // No query parameters in URL for POST
|
||||||
|
|
||||||
|
final Map<String, dynamic> requestBody = {
|
||||||
|
'dataset': dataSets,
|
||||||
|
'language': locale,
|
||||||
|
'kpi': kpi.isNotEmpty ? kpi : null, // Avoid sending empty kpi
|
||||||
|
'filter_data': filterData.isNotEmpty ? filterData : null, // Avoid empty list
|
||||||
|
};
|
||||||
|
|
||||||
|
// final url = Uri.https('$baseUrl?dataset=$dataSets&language=$locale');
|
||||||
|
|
||||||
|
print('APISErvice - $url');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final response = await http.get(url);
|
final response = await http.post(
|
||||||
print('data');
|
url,
|
||||||
|
headers: {'Content-Type': 'application/json'},
|
||||||
|
body: jsonEncode(requestBody),
|
||||||
|
);
|
||||||
|
|
||||||
|
print('Response Status: ${response.statusCode}');
|
||||||
|
print('Response Body: ${response.body}');
|
||||||
|
|
||||||
|
print('data -$response');
|
||||||
|
print('API Request URL: $url');
|
||||||
|
print('Filter Data: ${jsonEncode(filterData)}');
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
final Map<String, dynamic> jsonData = jsonDecode(response.body);
|
final Map<String, dynamic> jsonData = jsonDecode(response.body);
|
||||||
// Variables to store filtered data
|
// Variables to store filtered data
|
||||||
|
|||||||
@ -91,6 +91,18 @@ class ChartWidget extends StatelessWidget {
|
|||||||
}).toList();
|
}).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Color adjustColor(Color baseColor, int index) {
|
||||||
|
final HSLColor hsl = HSLColor.fromColor(baseColor);
|
||||||
|
|
||||||
|
// Lightness variation (keeping it light, between 0.6 and 0.9)
|
||||||
|
double lightnessFactor = 0.6 + (index % 4) * 0.1; // Varies between 0.6 to 0.8
|
||||||
|
final HSLColor adjustedHSL = hsl.withLightness(
|
||||||
|
lightnessFactor.clamp(0.6, 0.9), // Ensures light shades only
|
||||||
|
);
|
||||||
|
|
||||||
|
return adjustedHSL.toColor();
|
||||||
|
}
|
||||||
|
|
||||||
List<PieChartSectionData> parsePieChartData(
|
List<PieChartSectionData> parsePieChartData(
|
||||||
dynamic chartData,
|
dynamic chartData,
|
||||||
double totalValue,
|
double totalValue,
|
||||||
@ -111,7 +123,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
|
|
||||||
if (rawValue is String) {
|
if (rawValue is String) {
|
||||||
value = double.tryParse(rawValue) ?? 0.0;
|
value = double.tryParse(rawValue) ?? 0.0;
|
||||||
} else if (rawValue is int) {
|
} else if (rawValue is num) {
|
||||||
value = rawValue.toDouble();
|
value = rawValue.toDouble();
|
||||||
} else if (rawValue is double) {
|
} else if (rawValue is double) {
|
||||||
value = rawValue;
|
value = rawValue;
|
||||||
@ -125,7 +137,8 @@ class ChartWidget extends StatelessWidget {
|
|||||||
|
|
||||||
return PieChartSectionData(
|
return PieChartSectionData(
|
||||||
value: value,
|
value: value,
|
||||||
color: Colors.primaries[index % Colors.primaries.length],
|
// color: Colors.primaries[index % Colors.primaries.length],
|
||||||
|
color: adjustColor(bodyColor, index), // Adjust alpha dynamically
|
||||||
title: '${percentage.toStringAsFixed(1)}%',
|
title: '${percentage.toStringAsFixed(1)}%',
|
||||||
radius: isTouched ? 60 : 50,
|
radius: isTouched ? 60 : 50,
|
||||||
|
|
||||||
@ -157,7 +170,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
width: 10,
|
width: 10,
|
||||||
height: 10,
|
height: 10,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: color,
|
color: adjustColor(bodyColor, index),
|
||||||
shape: BoxShape.circle,
|
shape: BoxShape.circle,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -404,6 +417,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
List<String> groupByValuesList = groupByValues.toList();
|
List<String> groupByValuesList = groupByValues.toList();
|
||||||
int chunkSize = 5;
|
int chunkSize = 5;
|
||||||
List<List<String>> chunkedGroupByValues = [];
|
List<List<String>> chunkedGroupByValues = [];
|
||||||
|
print('flStackedBar1');
|
||||||
for (int i = 0; i < groupByValuesList.length; i += chunkSize) {
|
for (int i = 0; i < groupByValuesList.length; i += chunkSize) {
|
||||||
chunkedGroupByValues.add(
|
chunkedGroupByValues.add(
|
||||||
groupByValuesList.sublist(
|
groupByValuesList.sublist(
|
||||||
@ -452,6 +466,8 @@ class ChartWidget extends StatelessWidget {
|
|||||||
getTooltipItem:
|
getTooltipItem:
|
||||||
(groupData, groupIndex, rodData, rodIndex) {
|
(groupData, groupIndex, rodData, rodIndex) {
|
||||||
// Get the list of group names dynamically
|
// Get the list of group names dynamically
|
||||||
|
|
||||||
|
|
||||||
List<String> groupNames = [];
|
List<String> groupNames = [];
|
||||||
for (var entry in chartData['response']) {
|
for (var entry in chartData['response']) {
|
||||||
String groupValue = entry['ObsKey'][groupByKey];
|
String groupValue = entry['ObsKey'][groupByKey];
|
||||||
@ -459,7 +475,6 @@ class ChartWidget extends StatelessWidget {
|
|||||||
groupNames.add(groupValue);
|
groupNames.add(groupValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Accessing the stacked rod items and calculating the tooltip text
|
// Accessing the stacked rod items and calculating the tooltip text
|
||||||
List<BarChartRodStackItem> rodStackItems =
|
List<BarChartRodStackItem> rodStackItems =
|
||||||
rodData.rodStackItems;
|
rodData.rodStackItems;
|
||||||
@ -486,6 +501,8 @@ class ChartWidget extends StatelessWidget {
|
|||||||
Color groupColor = _getColorForGroup(
|
Color groupColor = _getColorForGroup(
|
||||||
i); // Replace with your color logic
|
i); // Replace with your color logic
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Add a TextSpan for the colored circle and the group name with value
|
// Add a TextSpan for the colored circle and the group name with value
|
||||||
tooltipTextSpans.addAll([
|
tooltipTextSpans.addAll([
|
||||||
TextSpan(
|
TextSpan(
|
||||||
@ -682,18 +699,8 @@ class ChartWidget extends StatelessWidget {
|
|||||||
} else if (RegExp(r'^\d{4}-[A-Za-z]{3}$').hasMatch(timePeriod)) {
|
} else if (RegExp(r'^\d{4}-[A-Za-z]{3}$').hasMatch(timePeriod)) {
|
||||||
// Year-MonthAbbr (2019-Nov)
|
// Year-MonthAbbr (2019-Nov)
|
||||||
Map<String, int> monthMap = {
|
Map<String, int> monthMap = {
|
||||||
'Jan': 1,
|
'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8,
|
||||||
'Feb': 2,
|
'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12
|
||||||
'Mar': 3,
|
|
||||||
'Apr': 4,
|
|
||||||
'May': 5,
|
|
||||||
'Jun': 6,
|
|
||||||
'Jul': 7,
|
|
||||||
'Aug': 8,
|
|
||||||
'Sep': 9,
|
|
||||||
'Oct': 10,
|
|
||||||
'Nov': 11,
|
|
||||||
'Dec': 12
|
|
||||||
};
|
};
|
||||||
|
|
||||||
List<String> parts = timePeriod.split('-');
|
List<String> parts = timePeriod.split('-');
|
||||||
@ -951,9 +958,13 @@ class ChartWidget extends StatelessWidget {
|
|||||||
(entry) => double.parse(entry['ObsKey']['TIME_PERIOD']))
|
(entry) => double.parse(entry['ObsKey']['TIME_PERIOD']))
|
||||||
.toSet();
|
.toSet();
|
||||||
|
|
||||||
|
print('uniqueXValuesLineTrend2- $uniqueXValues');
|
||||||
|
|
||||||
// Generate line bars for the chart
|
// Generate line bars for the chart
|
||||||
List<LineChartBarData> lineBars = lineBarsData2(filteredData);
|
List<LineChartBarData> lineBars = lineBarsData2(filteredData);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return Column(children: [
|
return Column(children: [
|
||||||
Text(
|
Text(
|
||||||
chartData['chart_heading'] ?? '',
|
chartData['chart_heading'] ?? '',
|
||||||
@ -979,8 +990,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
scrollDirection: Axis.horizontal, // Enable horizontal scrolling
|
scrollDirection: Axis.horizontal, // Enable horizontal scrolling
|
||||||
padding: const EdgeInsets.only(right: 40, top: 20),
|
padding: const EdgeInsets.only(right: 40, top: 20),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: (uniqueXValues.length * 50) +
|
width: (uniqueXValues.length * 50) + 50, // Adjust width dynamically
|
||||||
50, // Adjust width dynamically
|
|
||||||
child: LineChart(
|
child: LineChart(
|
||||||
LineChartData(
|
LineChartData(
|
||||||
lineTouchData: lineTouchData1(),
|
lineTouchData: lineTouchData1(),
|
||||||
@ -1227,7 +1237,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
return Container();
|
return Container();
|
||||||
},
|
},
|
||||||
reservedSize: 80,
|
reservedSize: 110,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
topTitles: AxisTitles(
|
topTitles: AxisTitles(
|
||||||
@ -1253,13 +1263,13 @@ class ChartWidget extends StatelessWidget {
|
|||||||
barRods: [
|
barRods: [
|
||||||
BarChartRodData(
|
BarChartRodData(
|
||||||
toY: yAxisData[index],
|
toY: yAxisData[index],
|
||||||
color: Colors.blueAccent,
|
color: bodyColor,
|
||||||
borderRadius: BorderRadius.circular(4),
|
borderRadius: BorderRadius.circular(4),
|
||||||
width: 20,
|
width: 20,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
showingTooltipIndicators: [0],
|
showingTooltipIndicators: [0],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
))
|
))
|
||||||
@ -1268,8 +1278,36 @@ class ChartWidget extends StatelessWidget {
|
|||||||
// Extract groupBy values and their corresponding y-axis values
|
// Extract groupBy values and their corresponding y-axis values
|
||||||
List<String> xAxisData = [];
|
List<String> xAxisData = [];
|
||||||
List<double> yAxisData = [];
|
List<double> yAxisData = [];
|
||||||
|
List<Map<String, dynamic>> sortedData = [];
|
||||||
|
|
||||||
for (var entry in chartData['response']) {
|
for (var entry in chartData['response']) {
|
||||||
|
String? timePeriod = entry['ObsKey']['TIME_PERIOD'];
|
||||||
|
if (timePeriod != null) {
|
||||||
|
// Check if it contains a month (i.e., has "-" and follows "YYYY-MM" format)
|
||||||
|
bool hasMonth = RegExp(r'^\d{4}-\d{2}$').hasMatch(timePeriod);
|
||||||
|
|
||||||
|
if (hasMonth) {
|
||||||
|
print('Yes-TIME_PERIOD: $timePeriod');
|
||||||
|
sortedData.add(entry);
|
||||||
|
} else {
|
||||||
|
print('No-TIME_PERIOD: $timePeriod');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Sort the data based on year and month
|
||||||
|
sortedData.sort((a, b) {
|
||||||
|
String timeA = a['ObsKey']['TIME_PERIOD'];
|
||||||
|
String timeB = b['ObsKey']['TIME_PERIOD'];
|
||||||
|
|
||||||
|
return timeA.compareTo(timeB); // Lexicographical sorting works for YYYY-MM
|
||||||
|
});
|
||||||
|
|
||||||
|
// If no valid TIME_PERIOD with a month is found, return original response
|
||||||
|
List<Map<String, dynamic>> finalData = sortedData.isNotEmpty ? sortedData : List.from(chartData['response']);
|
||||||
|
|
||||||
|
|
||||||
|
for (var entry in finalData) {
|
||||||
|
|
||||||
var xValue = entry['ObsKey'][groupByKey];
|
var xValue = entry['ObsKey'][groupByKey];
|
||||||
var yValue = entry['ObsValue']['Value'];
|
var yValue = entry['ObsValue']['Value'];
|
||||||
if (xValue != null && yValue != null) {
|
if (xValue != null && yValue != null) {
|
||||||
@ -1277,8 +1315,11 @@ class ChartWidget extends StatelessWidget {
|
|||||||
yAxisData.add(double.tryParse(yValue.toString()) ?? 0.0);
|
yAxisData.add(double.tryParse(yValue.toString()) ?? 0.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
print("chartData['chart_heading']");
|
print("chartData['chart_heading']");
|
||||||
print(chartData['chart_heading']);
|
print('RESpns- ${chartData['chart_heading']}');
|
||||||
|
print(chartData['response']);
|
||||||
|
|
||||||
int rotationTurns = 1;
|
int rotationTurns = 1;
|
||||||
return Column(children: [
|
return Column(children: [
|
||||||
Text(
|
Text(
|
||||||
@ -1424,6 +1465,9 @@ class ChartWidget extends StatelessWidget {
|
|||||||
const double barWidth = 30; // Width for each bar, including spacing
|
const double barWidth = 30; // Width for each bar, including spacing
|
||||||
return totalBars * barWidth; // Calculate total chart width
|
return totalBars * barWidth; // Calculate total chart width
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print('multi_bar');
|
||||||
|
|
||||||
String cropKey = chartData['chart_type_json']['x_sub_group'];
|
String cropKey = chartData['chart_type_json']['x_sub_group'];
|
||||||
// Group crops by CROP_TYPE
|
// Group crops by CROP_TYPE
|
||||||
Map<String, List<String>> groupedCrops = {};
|
Map<String, List<String>> groupedCrops = {};
|
||||||
@ -1462,6 +1506,8 @@ class ChartWidget extends StatelessWidget {
|
|||||||
//
|
//
|
||||||
// print('groupedCropsflmutli- $groupedCrops');
|
// print('groupedCropsflmutli- $groupedCrops');
|
||||||
|
|
||||||
|
print('hormulti_bar');
|
||||||
|
|
||||||
return Center(
|
return Center(
|
||||||
child: Column(children: [
|
child: Column(children: [
|
||||||
Text(
|
Text(
|
||||||
@ -1503,7 +1549,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
bottomTitles: AxisTitles(
|
bottomTitles: AxisTitles(
|
||||||
sideTitles: SideTitles(
|
sideTitles: SideTitles(
|
||||||
showTitles: true,
|
showTitles: true,
|
||||||
reservedSize: 40, // Added space for rotated titles
|
reservedSize: 80, // Added space for rotated titles
|
||||||
getTitlesWidget: (value, meta) {
|
getTitlesWidget: (value, meta) {
|
||||||
if (value < groupByValues.length) {
|
if (value < groupByValues.length) {
|
||||||
String title =
|
String title =
|
||||||
@ -1514,12 +1560,11 @@ class ChartWidget extends StatelessWidget {
|
|||||||
: title;
|
: title;
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(top: 8.0),
|
padding: const EdgeInsets.only(top: 8.0,left: 30.0),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width:
|
width: 60, // Limit width to force wrapping
|
||||||
60, // Limit width to force wrapping
|
|
||||||
child: Transform.rotate(
|
child: Transform.rotate(
|
||||||
angle: -0.5,
|
angle: -1.5,
|
||||||
child: TooltipTheme(
|
child: TooltipTheme(
|
||||||
data: TooltipThemeData(
|
data: TooltipThemeData(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@ -1529,15 +1574,15 @@ class ChartWidget extends StatelessWidget {
|
|||||||
8), // Optional: rounded corners
|
8), // Optional: rounded corners
|
||||||
),
|
),
|
||||||
textStyle: TextStyle(
|
textStyle: TextStyle(
|
||||||
color: Colors
|
color: Colors.white), // Change text color
|
||||||
.white), // Change text color
|
|
||||||
),
|
),
|
||||||
child: Tooltip(
|
child: Tooltip(
|
||||||
message: title,
|
message: title,
|
||||||
child: Text(
|
child: Text(
|
||||||
displayTitle,
|
displayTitle,
|
||||||
softWrap: true,
|
softWrap: true,
|
||||||
// style: TextStyle(backgroundColor: Colors.blueGrey[800]),
|
maxLines:2 ,
|
||||||
|
style: TextStyle(fontSize: 10),
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
)),
|
)),
|
||||||
),
|
),
|
||||||
@ -1973,6 +2018,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
for (var entry in filteredData) {
|
for (var entry in filteredData) {
|
||||||
int year = int.tryParse(entry['ObsKey']['TIME_PERIOD'].toString()) ?? 0;
|
int year = int.tryParse(entry['ObsKey']['TIME_PERIOD'].toString()) ?? 0;
|
||||||
String gender = entry['ObsKey']['GENDER'];
|
String gender = entry['ObsKey']['GENDER'];
|
||||||
|
|
||||||
double value =
|
double value =
|
||||||
double.tryParse(entry['ObsValue']['Value'].toString()) ?? 0.0;
|
double.tryParse(entry['ObsValue']['Value'].toString()) ?? 0.0;
|
||||||
|
|
||||||
@ -1980,9 +2026,9 @@ class ChartWidget extends StatelessWidget {
|
|||||||
yearGenderMap[year] = {'M': 0.0, 'F': 0.0};
|
yearGenderMap[year] = {'M': 0.0, 'F': 0.0};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gender == 'Male') {
|
if (gender == 'Male'|| gender == 'ذكر') {
|
||||||
yearGenderMap[year]!['M'] = value;
|
yearGenderMap[year]!['M'] = value;
|
||||||
} else if (gender == 'Female') {
|
} else if (gender == 'Female' || gender == 'أنثى') {
|
||||||
yearGenderMap[year]!['F'] = value;
|
yearGenderMap[year]!['F'] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1996,6 +2042,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// Add a line for the ratio data
|
// Add a line for the ratio data
|
||||||
lineBars.add(
|
lineBars.add(
|
||||||
LineChartBarData(
|
LineChartBarData(
|
||||||
@ -2105,7 +2152,22 @@ class ChartWidget extends StatelessWidget {
|
|||||||
|
|
||||||
// Use the timePeriod directly as a string for x-axis
|
// Use the timePeriod directly as a string for x-axis
|
||||||
double xValue = parseTimePeriod(timePeriod);
|
double xValue = parseTimePeriod(timePeriod);
|
||||||
double yValue = double.parse(entry['ObsValue']['Value']);
|
print('spotss');
|
||||||
|
|
||||||
|
// double yValue = double.parse(entry['ObsValue']['Value']);
|
||||||
|
double yValue;
|
||||||
|
var value = entry['ObsValue']['Value'];
|
||||||
|
|
||||||
|
if (value is int) {
|
||||||
|
yValue = value.toDouble();
|
||||||
|
} else if (value is double) {
|
||||||
|
yValue = value;
|
||||||
|
} else if (value is String) {
|
||||||
|
yValue = double.tryParse(value) ?? 0.0; // Handle invalid strings safely
|
||||||
|
} else {
|
||||||
|
throw Exception("Unexpected value type: ${value.runtimeType}");
|
||||||
|
}
|
||||||
|
|
||||||
return FlSpot(xValue, yValue);
|
return FlSpot(xValue, yValue);
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
@ -2194,7 +2256,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FlTitlesData titlesData1(Set<double> xValues) {
|
FlTitlesData titlesData1(Set<double> xValues) {
|
||||||
print('tileDATa1xvalue - $xValues');
|
print('tileDATa1xvalueline2 - $xValues');
|
||||||
|
|
||||||
double findClosest(double value, Set<double> values) {
|
double findClosest(double value, Set<double> values) {
|
||||||
return values
|
return values
|
||||||
@ -2209,10 +2271,13 @@ class ChartWidget extends StatelessWidget {
|
|||||||
getTitlesWidget: (value, meta) {
|
getTitlesWidget: (value, meta) {
|
||||||
// Format values as millions (M)
|
// Format values as millions (M)
|
||||||
String formattedValue;
|
String formattedValue;
|
||||||
|
print('LineTrend2val1 - $value ');
|
||||||
|
|
||||||
if (value % 10 == 0) {
|
if (value % 10 == 0) {
|
||||||
// Check if the value is in the millions or thousands range
|
// Check if the value is in the millions or thousands range
|
||||||
|
if (kDebugMode) {
|
||||||
|
print('LineTrend2valKmode - $value ');
|
||||||
|
}
|
||||||
if (value >= 1000000000000) {
|
if (value >= 1000000000000) {
|
||||||
formattedValue =
|
formattedValue =
|
||||||
'${(value / 1000000000000).toStringAsFixed(0)}T';
|
'${(value / 1000000000000).toStringAsFixed(0)}T';
|
||||||
@ -2244,7 +2309,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
|
|
||||||
// return Text(
|
// return Text(
|
||||||
// formattedValue,
|
// 'LINETRENTD2',
|
||||||
// style: TextStyle(color: Colors.black, fontSize: 12),
|
// style: TextStyle(color: Colors.black, fontSize: 12),
|
||||||
// );
|
// );
|
||||||
},
|
},
|
||||||
@ -2256,13 +2321,13 @@ class ChartWidget extends StatelessWidget {
|
|||||||
interval: null,
|
interval: null,
|
||||||
// interval: 10, // Ensure each year is shown only once
|
// interval: 10, // Ensure each year is shown only once
|
||||||
getTitlesWidget: (value, meta) {
|
getTitlesWidget: (value, meta) {
|
||||||
print('BtmTiles :-$value');
|
// print('BtmTiles :-$value');
|
||||||
print('BtmTilesmeta :-$meta');
|
// print('BtmTilesmeta :-$meta');
|
||||||
// if (xValues.contains(value))
|
// if (xValues.contains(value))
|
||||||
double closestValue = findClosest(value, xValues);
|
double closestValue = findClosest(value, xValues);
|
||||||
if ((closestValue - value).abs() < 0.15) {
|
if ((closestValue - value).abs() < 0.15) {
|
||||||
print("Bottomtiles");
|
// print("Bottomtiles");
|
||||||
print(value);
|
// print(value);
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(top: 1.1),
|
padding: const EdgeInsets.only(top: 1.1),
|
||||||
child: Transform.rotate(
|
child: Transform.rotate(
|
||||||
@ -2321,12 +2386,26 @@ class ChartWidget extends StatelessWidget {
|
|||||||
List<BarChartGroupData> _generateBarGroups(
|
List<BarChartGroupData> _generateBarGroups(
|
||||||
BuildContext context, dynamic chartData, String groupByKey) {
|
BuildContext context, dynamic chartData, String groupByKey) {
|
||||||
Map<String, Map<String, double>> groupedData = {};
|
Map<String, Map<String, double>> groupedData = {};
|
||||||
|
print('flStackedBar3');
|
||||||
// Group data by `group_by` and `TIME_PERIOD`, accumulating the values for each group and year
|
// Group data by `group_by` and `TIME_PERIOD`, accumulating the values for each group and year
|
||||||
for (var entry in chartData['response']) {
|
for (var entry in chartData['response']) {
|
||||||
String groupValue = entry['ObsKey'][groupByKey];
|
String groupValue = entry['ObsKey'][groupByKey];
|
||||||
String timePeriod = entry['ObsKey']['TIME_PERIOD'];
|
String timePeriod = entry['ObsKey']['TIME_PERIOD'];
|
||||||
double value = double.tryParse(entry['ObsValue']['Value']) ?? 0.0;
|
// double value = double.tryParse(entry['ObsValue']['Value']) ?? 0.0;
|
||||||
|
|
||||||
|
double value;
|
||||||
|
var rawValue = entry['ObsValue']['Value'];
|
||||||
|
|
||||||
|
if (rawValue is num) {
|
||||||
|
value = rawValue.toDouble();
|
||||||
|
} else if (rawValue is double) {
|
||||||
|
value = rawValue;
|
||||||
|
} else {
|
||||||
|
value = double.tryParse(rawValue.toString()) ?? 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
print('flStackedBar3.1');
|
||||||
|
|
||||||
// print('fl_groupValue $groupValue');
|
// print('fl_groupValue $groupValue');
|
||||||
// print('fl_timePeriod $timePeriod');
|
// print('fl_timePeriod $timePeriod');
|
||||||
@ -2335,6 +2414,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
if (!groupedData.containsKey(groupValue)) {
|
if (!groupedData.containsKey(groupValue)) {
|
||||||
groupedData[groupValue] = {};
|
groupedData[groupValue] = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!groupedData[groupValue]!.containsKey(timePeriod)) {
|
if (!groupedData[groupValue]!.containsKey(timePeriod)) {
|
||||||
groupedData[groupValue]![timePeriod] = 0.0;
|
groupedData[groupValue]![timePeriod] = 0.0;
|
||||||
}
|
}
|
||||||
@ -2347,6 +2427,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
List<String> timePeriods = groupedData.values.first.keys.toList();
|
List<String> timePeriods = groupedData.values.first.keys.toList();
|
||||||
print('timePeriods $timePeriods');
|
print('timePeriods $timePeriods');
|
||||||
|
|
||||||
|
|
||||||
// double barWidth = calculateBarWidth(context, timePeriods.length);
|
// double barWidth = calculateBarWidth(context, timePeriods.length);
|
||||||
|
|
||||||
// For each time period, generate a BarChartGroupData
|
// For each time period, generate a BarChartGroupData
|
||||||
@ -2360,7 +2441,6 @@ class ChartWidget extends StatelessWidget {
|
|||||||
int groupIndex = 0; // Track group index for color assignment
|
int groupIndex = 0; // Track group index for color assignment
|
||||||
for (var group in groupedData.keys) {
|
for (var group in groupedData.keys) {
|
||||||
double value = groupedData[group]![timePeriods[i]] ?? 0.0;
|
double value = groupedData[group]![timePeriods[i]] ?? 0.0;
|
||||||
|
|
||||||
// Add stacked item with current `toY` value and the incremented one
|
// Add stacked item with current `toY` value and the incremented one
|
||||||
rodStackItems.add(
|
rodStackItems.add(
|
||||||
BarChartRodStackItem(
|
BarChartRodStackItem(
|
||||||
@ -2496,11 +2576,17 @@ class ChartWidget extends StatelessWidget {
|
|||||||
|
|
||||||
double _calculateMaxY(dynamic chartData) {
|
double _calculateMaxY(dynamic chartData) {
|
||||||
// Dynamically calculate the maximum Y value
|
// Dynamically calculate the maximum Y value
|
||||||
|
|
||||||
|
print('hormulti_bar2');
|
||||||
|
|
||||||
List<dynamic> response = chartData['response'] ?? [];
|
List<dynamic> response = chartData['response'] ?? [];
|
||||||
double maxY = 0;
|
double maxY = 0;
|
||||||
|
|
||||||
for (var entry in response) {
|
for (var entry in response) {
|
||||||
double value = double.tryParse(entry['ObsValue']['Value'] ?? '0') ?? 0;
|
// double value = double.tryParse(entry['ObsValue']['Value'] ?? '0') ?? 0;
|
||||||
|
double value = (entry['ObsValue']['Value'] as num?)?.toDouble() ?? 0;
|
||||||
|
|
||||||
|
|
||||||
if (value > maxY) {
|
if (value > maxY) {
|
||||||
maxY = value;
|
maxY = value;
|
||||||
}
|
}
|
||||||
@ -2514,6 +2600,9 @@ class ChartWidget extends StatelessWidget {
|
|||||||
List<dynamic> responseData = chartData['response'];
|
List<dynamic> responseData = chartData['response'];
|
||||||
List<BarChartGroupData> barGroups = [];
|
List<BarChartGroupData> barGroups = [];
|
||||||
int colorIndex = 0;
|
int colorIndex = 0;
|
||||||
|
|
||||||
|
print('hormulti_bar1.1');
|
||||||
|
|
||||||
// Iterate through groupByValues and populate BarChartGroupData
|
// Iterate through groupByValues and populate BarChartGroupData
|
||||||
for (int i = 0; i < groupByValues.length; i++) {
|
for (int i = 0; i < groupByValues.length; i++) {
|
||||||
String groupValue = groupByValues.elementAt(i);
|
String groupValue = groupByValues.elementAt(i);
|
||||||
@ -2528,7 +2617,7 @@ class ChartWidget extends StatelessWidget {
|
|||||||
// Ensure to retrieve and parse 'ObsValue' value (which should be a double)
|
// Ensure to retrieve and parse 'ObsValue' value (which should be a double)
|
||||||
double value =
|
double value =
|
||||||
double.tryParse(data['ObsValue']['Value'].toString()) ?? 0.0;
|
double.tryParse(data['ObsValue']['Value'].toString()) ?? 0.0;
|
||||||
|
print('multi_bar1.1');
|
||||||
final List<Color> uniqueColorsForTwo = [
|
final List<Color> uniqueColorsForTwo = [
|
||||||
Color(0xFF648CBA),
|
Color(0xFF648CBA),
|
||||||
Color(0xFF90B0D5),
|
Color(0xFF90B0D5),
|
||||||
@ -2647,4 +2736,4 @@ class ChartData {
|
|||||||
final String? x;
|
final String? x;
|
||||||
final double y;
|
final double y;
|
||||||
final DateTime? xDateTime;
|
final DateTime? xDateTime;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import 'package:image_picker/image_picker.dart';
|
|||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/config/my_theme.dart';
|
import 'package:uae_stat/config/my_theme.dart';
|
||||||
import 'package:uae_stat/domain/use_cases/language.dart';
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
import 'package:uae_stat/infrastructure/data/p_auth_repo.dart';
|
import 'package:uae_stat/infrastructure/data/p_auth_repo.dart';
|
||||||
@ -34,7 +35,7 @@ class ProfileScreen extends ConsumerStatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
class _ProfileScreenState extends ConsumerState<ProfileScreen> {
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
final _pb = PocketBase(apiUrl);
|
||||||
// final _pb = PocketBase('http://127.0.0.1:8090');
|
// final _pb = PocketBase('http://127.0.0.1:8090');
|
||||||
|
|
||||||
// Add focus nodes and hint states
|
// Add focus nodes and hint states
|
||||||
|
|||||||
@ -25,13 +25,15 @@ import 'package:http/http.dart' as http;
|
|||||||
import '../../Screens/auth_verification/registration.dart';
|
import '../../Screens/auth_verification/registration.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
|
||||||
|
|
||||||
import '../../components/indicators/locale_provider.dart';
|
import '../../components/indicators/locale_provider.dart';
|
||||||
import '../../components/my_toggle.dart';
|
import '../../components/my_toggle.dart';
|
||||||
|
|
||||||
class LoginRoute extends HookConsumerWidget {
|
class LoginRoute extends HookConsumerWidget {
|
||||||
final pb = PocketBase('https://pb.venbait.in');
|
// final pb = PocketBase('https://pb.venbait.in');
|
||||||
|
final pb = PocketBase(apiUrl);
|
||||||
final FlutterSecureStorage _secureStorage = const FlutterSecureStorage();
|
final FlutterSecureStorage _secureStorage = const FlutterSecureStorage();
|
||||||
// final _pb = PocketBase('http://127.0.0.1:8090');
|
// final _pb = PocketBase('http://127.0.0.1:8090');
|
||||||
// final bool isLoginScreen; // Pass `true` if this is the login screen
|
// final bool isLoginScreen; // Pass `true` if this is the login screen
|
||||||
@ -342,7 +344,8 @@ class LoginRoute extends HookConsumerWidget {
|
|||||||
final userId = session.id;
|
final userId = session.id;
|
||||||
if (userId.isNotEmpty) {
|
if (userId.isNotEmpty) {
|
||||||
final url =
|
final url =
|
||||||
Uri.parse("https://pb.venbait.in/api/login_success?id=$userId");
|
// Uri.parse("https://pb.venbait.in/api/login_success?id=$userId");
|
||||||
|
Uri.parse('$apiUrl/api/login_success?id=$userId');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final response = await http.get(url);
|
final response = await http.get(url);
|
||||||
|
|||||||
@ -167,6 +167,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/domain/use_cases/language.dart';
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
import 'package:uae_stat/infrastructure/data/p_auth_repo.dart';
|
import 'package:uae_stat/infrastructure/data/p_auth_repo.dart';
|
||||||
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
|
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
|
||||||
@ -176,6 +177,7 @@ import 'package:uae_stat/presentation/routes/drawer_routes/custom_drawer_routes.
|
|||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
|
||||||
class MyHomePage extends ConsumerStatefulWidget {
|
class MyHomePage extends ConsumerStatefulWidget {
|
||||||
const MyHomePage({super.key});
|
const MyHomePage({super.key});
|
||||||
@ -344,7 +346,8 @@ class EconomyStatsWidget extends ConsumerStatefulWidget {
|
|||||||
|
|
||||||
class EconomyStatsState extends ConsumerState<EconomyStatsWidget> {
|
class EconomyStatsState extends ConsumerState<EconomyStatsWidget> {
|
||||||
List<dynamic> data = [];
|
List<dynamic> data = [];
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
// final _pb = PocketBase('https://pb.venbait.in');
|
||||||
|
final _pb = PocketBase(apiUrl);
|
||||||
bool isLoading = true;
|
bool isLoading = true;
|
||||||
|
|
||||||
final GlobalKey cardTopicKey = GlobalKey();
|
final GlobalKey cardTopicKey = GlobalKey();
|
||||||
@ -1077,7 +1080,8 @@ class EconomyStatsState extends ConsumerState<EconomyStatsWidget> {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
Future<void> fetchData(locale) async {
|
Future<void> fetchData(locale) async {
|
||||||
const baseUrl = 'https://pb.venbait.in/api/getHomePageData';
|
// const baseUrl = 'https://pb.venbait.in/api/getHomePageData';
|
||||||
|
const baseUrl = '$apiUrl/api/getHomePageData';
|
||||||
try {
|
try {
|
||||||
final response = await http.get(Uri.parse(baseUrl + '?language=$locale'));
|
final response = await http.get(Uri.parse(baseUrl + '?language=$locale'));
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import 'package:dio/dio.dart';
|
|||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/domain/use_cases/language.dart';
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/bookmark_asset_path.dart';
|
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/bookmark_asset_path.dart';
|
||||||
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart';
|
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/uae_numbers_asset_path.dart';
|
||||||
@ -21,7 +22,7 @@ class BookMark extends ConsumerStatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _BookMarkState extends ConsumerState<BookMark> {
|
class _BookMarkState extends ConsumerState<BookMark> {
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
final _pb = PocketBase(apiUrl);
|
||||||
List<Map<String, dynamic>> dataList = [];
|
List<Map<String, dynamic>> dataList = [];
|
||||||
bool isLoading = true;
|
bool isLoading = true;
|
||||||
|
|
||||||
@ -77,7 +78,7 @@ class _BookMarkState extends ConsumerState<BookMark> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final response = await Dio().get(
|
final response = await Dio().get(
|
||||||
'https://pb.venbait.in/api/getUserBookmark',
|
'$apiUrl/api/getUserBookmark',
|
||||||
queryParameters: {'user_id': userID, 'language': locale},
|
queryParameters: {'user_id': userID, 'language': locale},
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -514,4 +515,4 @@ class TabBarHeader extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import 'package:intl/intl.dart';
|
|||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/config/my_theme.dart';
|
import 'package:uae_stat/config/my_theme.dart';
|
||||||
import 'package:uae_stat/domain/use_cases/language.dart';
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart';
|
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart';
|
||||||
@ -25,7 +26,7 @@ class EditProfile extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _EditProfileState extends State<EditProfile> {
|
class _EditProfileState extends State<EditProfile> {
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
final _pb = PocketBase(apiUrl);
|
||||||
// final _pb = PocketBase('http://127.0.0.1:8090');
|
// final _pb = PocketBase('http://127.0.0.1:8090');
|
||||||
bool _isProfileCompleted = false;
|
bool _isProfileCompleted = false;
|
||||||
bool _isLoading = false;
|
bool _isLoading = false;
|
||||||
@ -203,7 +204,7 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
|
|
||||||
if (avatarFilename.isNotEmpty && recordId.isNotEmpty) {
|
if (avatarFilename.isNotEmpty && recordId.isNotEmpty) {
|
||||||
_avatarUrl =
|
_avatarUrl =
|
||||||
'https://pb.venbait.in/api/files/$collectionId/$recordId/$avatarFilename';
|
'$apiUrl/$collectionId/$recordId/$avatarFilename';
|
||||||
} else {
|
} else {
|
||||||
_avatarUrl = ''; // Reset to default or empty
|
_avatarUrl = ''; // Reset to default or empty
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import 'package:intl/intl.dart';
|
|||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/domain/use_cases/language.dart';
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
import 'package:uae_stat/infrastructure/services/img_asset_paths/feedback_asset_path.dart';
|
import 'package:uae_stat/infrastructure/services/img_asset_paths/feedback_asset_path.dart';
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ class FeedbackForm extends StatefulWidget {
|
|||||||
class _FeedbackFormState extends State<FeedbackForm>
|
class _FeedbackFormState extends State<FeedbackForm>
|
||||||
with WidgetsBindingObserver {
|
with WidgetsBindingObserver {
|
||||||
final _pb =
|
final _pb =
|
||||||
PocketBase('https://pb.venbait.in'); // Initialize PocketBase client
|
PocketBase(apiUrl); // Initialize PocketBase client
|
||||||
// final _pb =
|
// final _pb =
|
||||||
// PocketBase('http://127.0.0.1:8090'); // Initialize PocketBase client
|
// PocketBase('http://127.0.0.1:8090'); // Initialize PocketBase client
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart';
|
import 'package:uae_stat/infrastructure/services/img_asset_paths/icons/misc_icon_asset_path.dart';
|
||||||
|
|
||||||
import 'package:uae_stat/presentation/components/my_bottom_nav_bar.dart';
|
import 'package:uae_stat/presentation/components/my_bottom_nav_bar.dart';
|
||||||
@ -16,7 +17,7 @@ class ManageUserRouter extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ManageUserRouterState extends State<ManageUserRouter> {
|
class _ManageUserRouterState extends State<ManageUserRouter> {
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
final _pb = PocketBase(apiUrl);
|
||||||
List<User> userData = [];
|
List<User> userData = [];
|
||||||
int _sortColumnIndex = 0;
|
int _sortColumnIndex = 0;
|
||||||
bool _isAscending = true;
|
bool _isAscending = true;
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import '../../custom_drawer_routes.dart';
|
import '../../custom_drawer_routes.dart';
|
||||||
|
|
||||||
class NotificationPage extends StatefulWidget {
|
class NotificationPage extends StatefulWidget {
|
||||||
@ -11,7 +12,7 @@ class NotificationPage extends StatefulWidget {
|
|||||||
|
|
||||||
class _NotificationPageState extends State<NotificationPage> {
|
class _NotificationPageState extends State<NotificationPage> {
|
||||||
// Example notification data
|
// Example notification data
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
final _pb = PocketBase(apiUrl);
|
||||||
List<Map<String, dynamic>> notifications = [];
|
List<Map<String, dynamic>> notifications = [];
|
||||||
|
|
||||||
// Current selected tab index
|
// Current selected tab index
|
||||||
|
|||||||
@ -24,6 +24,7 @@ import 'package:uae_stat/presentation/components/my_toggle.dart';
|
|||||||
import 'package:uae_stat/presentation/Screens/app_tour/Target_content.dart';
|
import 'package:uae_stat/presentation/Screens/app_tour/Target_content.dart';
|
||||||
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
|
import 'package:uae_stat/presentation/components/indicators/locale_provider.dart';
|
||||||
import 'package:uae_stat/presentation/components/my_toggle.dart';
|
import 'package:uae_stat/presentation/components/my_toggle.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
|
|
||||||
class BaseScaffold extends ConsumerStatefulWidget {
|
class BaseScaffold extends ConsumerStatefulWidget {
|
||||||
const BaseScaffold({
|
const BaseScaffold({
|
||||||
@ -58,7 +59,8 @@ class BaseScaffold extends ConsumerStatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _BaseScaffoldState extends ConsumerState<BaseScaffold> {
|
class _BaseScaffoldState extends ConsumerState<BaseScaffold> {
|
||||||
final _pb = PocketBase('https://pb.venbait.in');
|
// final _pb = PocketBase('https://pb.venbait.in');
|
||||||
|
final _pb = PocketBase(apiUrl);
|
||||||
String _avatarUrl = '';
|
String _avatarUrl = '';
|
||||||
dynamic userId;
|
dynamic userId;
|
||||||
String? userName;
|
String? userName;
|
||||||
@ -658,7 +660,7 @@ class _BaseScaffoldState extends ConsumerState<BaseScaffold> {
|
|||||||
|
|
||||||
if (userAvatar!.isNotEmpty && recordId.isNotEmpty) {
|
if (userAvatar!.isNotEmpty && recordId.isNotEmpty) {
|
||||||
_avatarUrl =
|
_avatarUrl =
|
||||||
'https://pb.venbait.in/api/files/$collectionId/$recordId/$userAvatar';
|
'$apiUrl/api/files/$collectionId/$recordId/$userAvatar';
|
||||||
} else {
|
} else {
|
||||||
_avatarUrl = ''; // Reset to default or empty
|
_avatarUrl = ''; // Reset to default or empty
|
||||||
}
|
}
|
||||||
@ -704,7 +706,7 @@ class _BaseScaffoldState extends ConsumerState<BaseScaffold> {
|
|||||||
title: Padding(
|
title: Padding(
|
||||||
padding: EdgeInsets.only(top: 10),
|
padding: EdgeInsets.only(top: 10),
|
||||||
child: Align(
|
child: Align(
|
||||||
alignment: Alignment.centerLeft,
|
alignment: (locale?.languageCode == 'ar') ? Alignment.centerRight : Alignment.centerLeft,
|
||||||
child: DefaultTextStyle(
|
child: DefaultTextStyle(
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: widget.colorChange ? Colors.white : Color(0xFF414042),
|
color: widget.colorChange ? Colors.white : Color(0xFF414042),
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import 'package:go_router/go_router.dart';
|
|||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:pocketbase/pocketbase.dart';
|
import 'package:pocketbase/pocketbase.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'package:uae_stat/config/api_config.dart';
|
||||||
import 'package:uae_stat/domain/use_cases/language.dart';
|
import 'package:uae_stat/domain/use_cases/language.dart';
|
||||||
import 'package:uae_stat/infrastructure/services/packages/go_router.dart';
|
import 'package:uae_stat/infrastructure/services/packages/go_router.dart';
|
||||||
import 'package:uae_stat/presentation/components/my_drawer.dart';
|
import 'package:uae_stat/presentation/components/my_drawer.dart';
|
||||||
@ -28,7 +29,7 @@ class FeedbackForm extends StatefulWidget {
|
|||||||
class _FeedbackFormState extends State<FeedbackForm>
|
class _FeedbackFormState extends State<FeedbackForm>
|
||||||
with WidgetsBindingObserver {
|
with WidgetsBindingObserver {
|
||||||
final _pb =
|
final _pb =
|
||||||
PocketBase('https://pb.venbait.in'); // Initialize PocketBase client
|
PocketBase(apiUrl); // Initialize PocketBase client
|
||||||
// final _pb =
|
// final _pb =
|
||||||
// PocketBase('http://127.0.0.1:8090'); // Initialize PocketBase client
|
// PocketBase('http://127.0.0.1:8090'); // Initialize PocketBase client
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
name: uae_stat
|
name: uae_stat
|
||||||
description: "View statistics about the UAE from the Federal Center for Statistics and Competitiveness."
|
description: "View statistics about the UAE from the Federal Center for Statistics and Competitiveness."
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
version: 1.0.26+27
|
version: 1.0.27+28
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.2.3 <4.0.0"
|
sdk: ">=3.2.3 <4.0.0"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user