Completed the updated design

qlline_design_update
Faiz Hashmi 1 month ago
parent 7f877fae73
commit d17c35e54e

@ -0,0 +1,3 @@
<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0H34C48.3594 0 60 11.6406 60 26V60H26C11.6406 60 0 48.3594 0 34V0Z" fill="#EC404C" fill-opacity="0.17"/>
</svg>

After

Width:  |  Height:  |  Size: 220 B

@ -31,9 +31,13 @@ class AppStrings {
static String openAppNativeFunctionName = "reopenApp"; static String openAppNativeFunctionName = "reopenApp";
static String dummyRssFeedText =
"Breaking: New Flutter 3.16 released with enhanced performance and stability features • Weather Update: Sunny skies expected throughout the week with temperatures reaching 25°C • Traffic Alert: Highway A1 experiencing delays due to construction work between exits 15-18 • Market Update: Stock indices show positive growth with technology sector leading gains • Company Announcement: Q4 results exceed expectations • New product launch scheduled for next month • Employee appreciation event on Friday • Special Offer: 20% discount on all services this week • Limited time promotion • Terms and conditions apply • Contact customer service for details • Welcome to our digital queue management system • Please follow the instructions on screen • For assistance, contact our support team • Thank you for your patience";
static List<String> prayersArray = ["الفجر", "الظهر", "العصر", "المغرب", "العشاء"]; static List<String> prayersArray = ["الفجر", "الظهر", "العصر", "المغرب", "العشاء"];
static String dummyRssFeedText =
"Latest News: Hospital announces new specialized cardiac unit opening next month • Health Update: Annual flu vaccination campaign starts Monday at all locations • Service Notice: Pharmacy hours extended until 10 PM on weekdays • Patient Advisory: New mobile app available for appointment booking and lab results • Emergency Drill: Fire safety exercise scheduled for 2 PM today • Visitor Information: Updated visiting hours now 8 AM to 8 PM daily • Maintenance Alert: Elevator B will be out of service from 6-8 AM tomorrow • Staff Recognition: Dr. Sarah Ahmed receives excellence award for patient care • Technology Update: New digital check-in kiosks now available in main lobby • Weather Advisory: Heavy rain expected - please allow extra travel time";
static String thankYouMessageAr = "نشكر لكم صبركم، ونتمنى لكم دوام الصحة والعافية";
static String thankYouMessageEn = "Thank you for your patience, we wish you good health and wellness";
} }
class AppColors { class AppColors {
@ -144,6 +148,7 @@ class AppAssets {
static String newVitalSignIcon = "assets/images/vitalsign_icon.svg"; static String newVitalSignIcon = "assets/images/vitalsign_icon.svg";
static String newDoctorIcon = "assets/images/doctor_icon.svg"; static String newDoctorIcon = "assets/images/doctor_icon.svg";
static String textBgLeaf = "assets/new_design_icons/text_bg_leaf.svg";
} }
class AppConstants { class AppConstants {

@ -201,11 +201,11 @@ class GlobalConfigurationsModel {
voiceTypeText = json['voiceTypeText']; voiceTypeText = json['voiceTypeText'];
screenLanguageEnum = (json['screenLanguage'] as int).toLanguageEnum(); screenLanguageEnum = (json['screenLanguage'] as int).toLanguageEnum();
screenLanguageText = json['screenLanguageText']; screenLanguageText = json['screenLanguageText'];
textDirection = json['textDirection'] == 2 ? TextDirection.rtl : TextDirection.ltr; // textDirection = json['textDirection'] == 2 ? TextDirection.rtl : TextDirection.ltr;
// textDirection = TextDirection.rtl; textDirection = TextDirection.rtl;
// screenMaxDisplayPatients = json['screenMaxDisplayPatients'] ?? 16; // screenMaxDisplayPatients = json['screenMaxDisplayPatients'] ?? 16;
// TODO: Uncomment this screenMaxDisplayPatients // TODO: Uncomment this screenMaxDisplayPatients
screenMaxDisplayPatients = 16; screenMaxDisplayPatients = 15;
voiceLanguageEnum = (json['voiceLanguage'] as int).toLanguageEnum(); voiceLanguageEnum = (json['voiceLanguage'] as int).toLanguageEnum();
voiceLanguageText = json['voiceLanguageText']; voiceLanguageText = json['voiceLanguageText'];
isNotiReq = json['isNotiReq']; isNotiReq = json['isNotiReq'];
@ -288,7 +288,7 @@ class GlobalConfigurationsModel {
vaccinationTextArb = json['vaccinationTextAr'] ?? "غرفة التطعيم"; vaccinationTextArb = json['vaccinationTextAr'] ?? "غرفة التطعيم";
nebulizationTextArb = json['nebulizationTextAr'] ?? "غرفة البخاخة"; nebulizationTextArb = json['nebulizationTextAr'] ?? "غرفة البخاخة";
callForVitalSignTextArb = json['callForVitalSignTextAr'] ?? " غرفة استدعاء للعلامات الحيوية"; callForVitalSignTextArb = json['callForVitalSignTextAr'] ?? " غرفة استدعاء للعلامات الحيوية";
callForDoctorTextArb = json['callForDoctorTextAr'] ?? "الرجاء التوّه إلى غرفة الطبيب"; callForDoctorTextArb = json['callForDoctorTextAr'] ?? "الرجاء التوجّه إلى غرفة الطبيب";
callForProcedureTextArb = json['callForProcedureTextAr'] ?? "الرجاء التوجّه إلى غرفة الإجراء"; callForProcedureTextArb = json['callForProcedureTextAr'] ?? "الرجاء التوجّه إلى غرفة الإجراء";
callForVaccinationTextArb = json['callForVaccinationTextAr'] ?? "الرجاء لتوجّه إلى غرفة التطعيم"; callForVaccinationTextArb = json['callForVaccinationTextAr'] ?? "الرجاء لتوجّه إلى غرفة التطعيم";
callForNebulizationTextArb = json['callForNebulizationTextAr'] ?? "الرجاء التوجّه إلى غرفة البخاخة"; callForNebulizationTextArb = json['callForNebulizationTextAr'] ?? "الرجاء التوجّه إلى غرفة البخاخة";

@ -34,9 +34,9 @@ class WeathersWidgetModel {
WeathersWidgetModel.fromJson(Map<String, dynamic> json) { WeathersWidgetModel.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
headline = json['headline']; headline = json['headline'];
maxTemp = json['maxTemp']; maxTemp = json['maxTemp'] ?? "42.2";
minTemp = json['minTemp']; minTemp = json['minTemp'] ?? "31.7";
iconPhrase = json['iconPhrase']; iconPhrase = json['iconPhrase'] ?? "Mostly sunny";
forecastDate = json['forecastDate']; forecastDate = json['forecastDate'];
cityID = json['cityID']; cityID = json['cityID'];
forecastDay = json['forecastDay']; forecastDay = json['forecastDay'];

@ -118,6 +118,21 @@ class ScreenDetailsRepoImp implements ScreenDetailsRepo {
@override @override
Future<WeathersWidgetModel?> getWeatherDetailsByCity({required String cityId}) async { Future<WeathersWidgetModel?> getWeatherDetailsByCity({required String cityId}) async {
WeathersWidgetModel constantWeathersWidgetModel = WeathersWidgetModel(
id: 12345,
headline: "Hot and sunny conditions expected",
maxTemp: 42.5,
minTemp: 28.3,
iconPhrase: "Mostly sunny",
forecastDate: "2024-12-19",
cityID: 287,
forecastDay: "Thursday",
createDateTime: "2024-12-19T08:30:00Z",
windSpeed: 12.5,
windDirection: "NW",
windDegrees: 315.0,
weatherIconPath: AppAssets.sunnyIcon,
);
try { try {
final body = {"cityID": cityId}; final body = {"cityID": cityId};
GenericRespModel genericRespModel = await apiClientInstance.postJsonForObject( GenericRespModel genericRespModel = await apiClientInstance.postJsonForObject(
@ -129,15 +144,14 @@ class ScreenDetailsRepoImp implements ScreenDetailsRepo {
List<WeathersWidgetModel> weathersWidgetModel = List.generate(genericRespModel.data.length, (index) => WeathersWidgetModel.fromJson(genericRespModel.data[index])); List<WeathersWidgetModel> weathersWidgetModel = List.generate(genericRespModel.data.length, (index) => WeathersWidgetModel.fromJson(genericRespModel.data[index]));
if (weathersWidgetModel.isNotEmpty) { if (weathersWidgetModel.isNotEmpty) {
loggerService.logToFile(message: weathersWidgetModel.toString(), source: "getWeatherDetailsByCity-> screen_details_repo.dart", type: LogTypeEnum.data); loggerService.logToFile(message: weathersWidgetModel.toString(), source: "getWeatherDetailsByCity-> screen_details_repo.dart", type: LogTypeEnum.data);
return weathersWidgetModel.first; return weathersWidgetModel.first;
} }
return null; return constantWeathersWidgetModel;
} catch (e) { } catch (e) {
loggerService.logError(e.toString()); loggerService.logError(e.toString());
loggerService.logToFile(message: e.toString(), source: "getWeatherDetailsByCity-> screen_details_repo.dart", type: LogTypeEnum.error); loggerService.logToFile(message: e.toString(), source: "getWeatherDetailsByCity-> screen_details_repo.dart", type: LogTypeEnum.error);
InfoComponents.showToast(e.toString()); InfoComponents.showToast(e.toString());
return null; return constantWeathersWidgetModel;
} }
} }

@ -3,6 +3,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:hmg_qline/view_models/screen_config_view_model.dart'; import 'package:hmg_qline/view_models/screen_config_view_model.dart';
import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart'; import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart';
import 'package:hmg_qline/views/common_widgets/date_display_widget.dart';
import 'package:hmg_qline/views/common_widgets/headline_tag_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/constants/app_constants.dart';
import 'package:hmg_qline/utilities/enums.dart'; import 'package:hmg_qline/utilities/enums.dart';
@ -111,12 +113,12 @@ class _AppFooterState extends State<AppFooter> {
children: [ children: [
AppText( AppText(
label, label,
fontSize: SizeConfig.getWidthMultiplier()! * 1.8, fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins, fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins,
), ),
AppText( AppText(
prayerName, prayerName,
fontSize: SizeConfig.getWidthMultiplier()! * 2, fontSize: SizeConfig.getWidthMultiplier()! * 1.8,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: AppColors.darkGreyTextColor, color: AppColors.darkGreyTextColor,
fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins, fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins,
@ -159,6 +161,115 @@ class _AppFooterState extends State<AppFooter> {
return "0"; return "0";
} }
bool _hasBothPrayerAndWeather(ScreenConfigViewModel screenConfigVM) {
return screenConfigVM.globalConfigurationsModel.isPrayerTimeReq && screenConfigVM.globalConfigurationsModel.isWeatherReq;
}
bool _isPortraitWithBothFeatures(ScreenConfigViewModel screenConfigVM) {
bool isPortrait = screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp ||
screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown;
return isPortrait && _hasBothPrayerAndWeather(screenConfigVM);
}
Widget _buildConnectionStatus(ScreenConfigViewModel screenConfigVM) {
bool isPortrait = screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp ||
screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown;
EdgeInsets padding;
if (_isPortraitWithBothFeatures(screenConfigVM)) {
padding = EdgeInsets.only(top: SizeConfig.getHeightMultiplier()! * 0.15);
} else if (isPortrait) {
padding = EdgeInsets.only(top: SizeConfig.getHeightMultiplier()! * 0.3);
} else {
padding = EdgeInsets.only(top: SizeConfig.getHeightMultiplier()! * 0.15);
}
Widget content;
if (_isPortraitWithBothFeatures(screenConfigVM)) {
content = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildStatusRow("Hub Status ", screenConfigVM.isHubConnected),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.05),
_buildStatusRow("Network Status ", screenConfigVM.isInternetConnected),
],
);
} else if (isPortrait) {
content = Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_buildStatusRow("Hub Status ", screenConfigVM.isHubConnected),
SizedBox(width: SizeConfig.getWidthMultiplier()! * 2),
_buildStatusRow("Network Status ", screenConfigVM.isInternetConnected),
],
);
} else {
content = Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildStatusRow("Hub Status ", screenConfigVM.isHubConnected),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.05),
_buildStatusRow("Network Status ", screenConfigVM.isInternetConnected),
],
);
}
return Padding(padding: padding, child: content);
}
Widget buildWeatherIcon(String? weatherIconPath) {
if (weatherIconPath != null) {
return SvgPicture.asset(
weatherIconPath,
height: SizeConfig.getHeightMultiplier() * 0.4,
);
}
return const SizedBox.shrink();
}
Widget buildCurrentCityTemp(String? currentCity, String? temp, bool isForArabic) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
if (temp != null)
AppText(
temp.toString(),
fontSize: SizeConfig.getWidthMultiplier()! * 2,
fontFamily: AppStrings.fontNamePoppins,
fontWeight: FontWeight.bold,
),
AppText(
currentCity.toString(),
fontSize: SizeConfig.getWidthMultiplier()! * 1.8,
fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins,
),
],
);
}
Widget buildTempDetails(String? iconPhrase, double? maxTempText, double? minTempText, bool isForArabic) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
SimpleDateDisplay(isForArabic: isForArabic),
if (iconPhrase != null)
AppText(
iconPhrase,
fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
fontFamily: AppStrings.fontNamePoppins,
),
if (minTempText != null && maxTempText != null)
AppText(
"$minTempText°C / $maxTempText°C",
fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
fontFamily: AppStrings.fontNamePoppins,
fontWeight: FontWeight.bold,
),
],
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<ScreenConfigViewModel>( return Consumer<ScreenConfigViewModel>(
@ -167,14 +278,21 @@ class _AppFooterState extends State<AppFooter> {
screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown; screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown;
return Padding( return Padding(
padding: EdgeInsets.symmetric( padding: EdgeInsets.fromLTRB(
horizontal: SizeConfig.getWidthMultiplier() * 4, SizeConfig.getWidthMultiplier() * 4,
vertical: SizeConfig.getHeightMultiplier() * 0.14, SizeConfig.getHeightMultiplier() * 0.14,
0,
SizeConfig.getHeightMultiplier() * 0.05,
), ),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Padding(
padding: EdgeInsets.only(right: SizeConfig.getWidthMultiplier() * 4),
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(
flex: 3, flex: screenConfigVM.globalConfigurationsModel.isWeatherReq && screenConfigVM.globalConfigurationsModel.isPrayerTimeReq ? 2 : 3,
child: customShadowSmoothContainer( child: customShadowSmoothContainer(
height: SizeConfig.getHeightMultiplier() * 0.8, height: SizeConfig.getHeightMultiplier() * 0.8,
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
@ -218,26 +336,7 @@ class _AppFooterState extends State<AppFooter> {
), ),
], ],
), ),
Padding( _buildConnectionStatus(screenConfigVM),
padding: isPortrait ? EdgeInsets.only(top: SizeConfig.getHeightMultiplier()! * 0.3) : EdgeInsets.only(top: SizeConfig.getHeightMultiplier()! * 0.15),
child: isPortrait
? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_buildStatusRow("Hub Status ", screenConfigVM.isHubConnected),
SizedBox(width: SizeConfig.getWidthMultiplier()! * 2),
_buildStatusRow("Network Status ", screenConfigVM.isInternetConnected),
],
)
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildStatusRow("Hub Status ", screenConfigVM.isHubConnected),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.05),
_buildStatusRow("Network Status ", screenConfigVM.isInternetConnected),
],
),
),
], ],
), ),
), ),
@ -247,18 +346,46 @@ class _AppFooterState extends State<AppFooter> {
Directionality( Directionality(
textDirection: screenConfigVM.globalConfigurationsModel.textDirection, textDirection: screenConfigVM.globalConfigurationsModel.textDirection,
child: Expanded( child: Expanded(
flex: isPortrait ? 2 : 3, flex: 2,
child: customShadowSmoothContainer( child: customShadowSmoothContainer(
height: SizeConfig.getHeightMultiplier() * 0.8, height: SizeConfig.getHeightMultiplier() * 0.8,
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: isPortrait ? SizeConfig.getWidthMultiplier() * 3 : SizeConfig.getWidthMultiplier() * 1.5, horizontal: isPortrait ? SizeConfig.getWidthMultiplier() * 2.5 : SizeConfig.getWidthMultiplier() * 1.3,
vertical: SizeConfig.getHeightMultiplier() * 0.1, vertical: SizeConfig.getHeightMultiplier() * 0.1,
), ),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
if (isPortrait) ...[
SvgPicture.asset(
AppAssets.salahTimeIcon,
height: SizeConfig.getHeightMultiplier() * 0.4,
),
],
Row(
children: [
if (screenConfigVM.nextPrayerToShowEng.isNotEmpty) ...[
_buildPrayerColumn(screenConfigVM.globalConfigurationsModel.nextPrayerTextEng, "${screenConfigVM.nextPrayerToShowEng} "),
],
if (screenConfigVM.nextPrayerToShowEng.isNotEmpty && screenConfigVM.nextPrayerToShowArb.isNotEmpty) ...[
Padding(
padding: EdgeInsets.fromLTRB(
SizeConfig.getWidthMultiplier()! * 0.1,
SizeConfig.getHeightMultiplier()! * 0.18,
SizeConfig.getWidthMultiplier()! * 0.1,
0,
),
child: AppText("|", fontSize: SizeConfig.getWidthMultiplier()! * 1.8, color: AppColors.darkGreyTextColor),
),
],
if (screenConfigVM.nextPrayerToShowArb.isNotEmpty) ...[
_buildPrayerColumn(screenConfigVM.globalConfigurationsModel.nextPrayerTextArb, screenConfigVM.nextPrayerToShowArb, isForArabic: true),
],
],
),
SizedBox( SizedBox(
width: SizeConfig.getWidthMultiplier() * 15, width: SizeConfig.getWidthMultiplier() * 14,
child: Center(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@ -275,14 +402,14 @@ class _AppFooterState extends State<AppFooter> {
_isMoreThanOneHour(_remainingTime) _isMoreThanOneHour(_remainingTime)
? AppText( ? AppText(
screenConfigVM.nextPrayerTime, screenConfigVM.nextPrayerTime,
fontSize: SizeConfig.getWidthMultiplier()! * 3, fontSize: SizeConfig.getWidthMultiplier()! * 2.5,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: AppColors.newRedColor, color: AppColors.newRedColor,
letterSpacing: 1.5, letterSpacing: 1.5,
) )
: AppText( : AppText(
_remainingTime, _remainingTime,
fontSize: SizeConfig.getWidthMultiplier()! * 3, fontSize: SizeConfig.getWidthMultiplier()! * 2.5,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: AppColors.newRedColor, color: AppColors.newRedColor,
letterSpacing: 1.5, letterSpacing: 1.5,
@ -290,36 +417,67 @@ class _AppFooterState extends State<AppFooter> {
], ],
), ),
), ),
Row( ),
children: [
if (screenConfigVM.nextPrayerToShowEng.isNotEmpty) ...[
_buildPrayerColumn(screenConfigVM.globalConfigurationsModel.nextPrayerTextEng, "${screenConfigVM.nextPrayerToShowEng} "),
], ],
if (screenConfigVM.nextPrayerToShowEng.isNotEmpty && screenConfigVM.nextPrayerToShowArb.isNotEmpty) ...[
Padding(
padding: EdgeInsets.fromLTRB(
SizeConfig.getWidthMultiplier()! * 0.1,
SizeConfig.getHeightMultiplier()! * 0.18,
SizeConfig.getWidthMultiplier()! * 0.1,
0,
), ),
child: AppText("|", fontSize: SizeConfig.getWidthMultiplier()! * 1.8, color: AppColors.darkGreyTextColor), ),
),
), ),
], ],
if (screenConfigVM.nextPrayerToShowArb.isNotEmpty) ...[ if (screenConfigVM.globalConfigurationsModel.isWeatherReq &&
_buildPrayerColumn(screenConfigVM.globalConfigurationsModel.nextPrayerTextArb, screenConfigVM.nextPrayerToShowArb, isForArabic: true), (screenConfigVM.globalConfigurationsModel.orientationTypeEnum != ScreenOrientationEnum.landscapeLeft &&
screenConfigVM.globalConfigurationsModel.orientationTypeEnum != ScreenOrientationEnum.landscapeRight)) ...[
SizedBox(width: SizeConfig.getWidthMultiplier()! * 1.7),
Expanded(
flex: isPortrait ? 3 : 4,
child: customShadowSmoothContainer(
height: SizeConfig.getHeightMultiplier() * 0.8,
padding: EdgeInsets.symmetric(
horizontal: isPortrait ? SizeConfig.getWidthMultiplier() * 3 : SizeConfig.getWidthMultiplier() * 1.5,
vertical: SizeConfig.getHeightMultiplier() * 0.1,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
buildWeatherIcon(screenConfigVM.weathersWidgetModel.weatherIconPath ?? AppAssets.weatherIcon),
SizedBox(width: SizeConfig.getWidthMultiplier() * 1.2),
buildCurrentCityTemp("الرياض", "21 °C", true),
SizedBox(width: SizeConfig.getWidthMultiplier() * 1.2),
buildTempDetails(screenConfigVM.weathersWidgetModel.iconPhrase, screenConfigVM.weathersWidgetModel.maxTemp, screenConfigVM.weathersWidgetModel.minTemp, true),
], ],
),
Row(
children: [
buildCurrentCityTemp("Riyadh", "21 °C", false),
SizedBox(width: SizeConfig.getWidthMultiplier() * 1.2),
buildTempDetails(screenConfigVM.weathersWidgetModel.iconPhrase, screenConfigVM.weathersWidgetModel.maxTemp, screenConfigVM.weathersWidgetModel.minTemp, false),
SizedBox(width: SizeConfig.getWidthMultiplier() * 1.2),
buildWeatherIcon(screenConfigVM.weathersWidgetModel.weatherIconPath ?? AppAssets.weatherIcon),
], ],
), ),
if (isPortrait) ...[ ],
SvgPicture.asset( ),
AppAssets.salahTimeIcon, ),
height: SizeConfig.getHeightMultiplier() * 0.5,
), ),
], ],
], ],
), ),
), ),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.1),
if (screenConfigVM.globalConfigurationsModel.isRssFeedReq && (screenConfigVM.rssFeedModel.rssFeed != null && screenConfigVM.rssFeedModel.rssFeed!.isNotEmpty)) ...[
// if (true)...[
customShadowSmoothContainer(
removeRightBorder: true,
height: SizeConfig.getHeightMultiplier()! * 0.3,
width: double.infinity,
child: Row(
children: [
const HmgNewsWidget(tagTitle: "HMG News"),
rssFeedWidget(),
// customShadowSmoothContainer(child: rssFeedWidget()),
],
), ),
), ),
], ],

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/constants/app_constants.dart';
import 'package:hmg_qline/utilities/enums.dart'; import 'package:hmg_qline/utilities/enums.dart';
import 'package:hmg_qline/utilities/extensions.dart';
import 'package:hmg_qline/view_models/screen_config_view_model.dart'; import 'package:hmg_qline/view_models/screen_config_view_model.dart';
import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart'; import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart';
import 'package:hmg_qline/views/view_helpers/size_config.dart'; import 'package:hmg_qline/views/view_helpers/size_config.dart';
@ -281,9 +280,11 @@ Widget engArabicTextWithSeparatorWidget({
mainAxisAlignment: mainAxisAlignment ?? MainAxisAlignment.start, mainAxisAlignment: mainAxisAlignment ?? MainAxisAlignment.start,
children: [ children: [
AppText( AppText(
englishText, arabicText,
fontSize: fontSize ?? SizeConfig.getWidthMultiplier() * 2.6,
color: color ?? AppColors.darkGreyTextColor, color: color ?? AppColors.darkGreyTextColor,
fontSize: fontSize ?? SizeConfig.getWidthMultiplier() * 2.6,
fontFamily: AppStrings.fontNameGesTwo,
fontWeight: FontWeight.bold,
), ),
AppText( AppText(
" | ", " | ",
@ -291,13 +292,99 @@ Widget engArabicTextWithSeparatorWidget({
color: color ?? AppColors.darkGreyTextColor, color: color ?? AppColors.darkGreyTextColor,
), ),
AppText( AppText(
arabicText, englishText,
color: color ?? AppColors.darkGreyTextColor,
fontSize: fontSize ?? SizeConfig.getWidthMultiplier() * 2.6, fontSize: fontSize ?? SizeConfig.getWidthMultiplier() * 2.6,
color: color ?? AppColors.darkGreyTextColor,
),
],
);
}
Widget buildTextContainer(bool isForArabic) {
return Container(
padding: EdgeInsets.all(SizeConfig.getHeightMultiplier() * 0.2),
child: Stack(
children: [
Positioned(
top: 0,
right: SizeConfig.getWidthMultiplier() * 2,
child: SvgPicture.asset(
AppAssets.textBgLeaf,
height: SizeConfig.getHeightMultiplier() * 0.4,
),
),
Padding(
padding: const EdgeInsets.only(top: 15),
child: AppText(
textAlign: TextAlign.center,
AppStrings.thankYouMessageAr,
fontSize: SizeConfig.getWidthMultiplier() * 3.6,
color: AppColors.darkGreyTextColor,
fontFamily: AppStrings.fontNameGesTwo, fontFamily: AppStrings.fontNameGesTwo,
fontWeight: FontWeight.bold, ),
), ),
], ],
),
);
}
Widget showThankyouWidget() {
return Expanded(
flex: 4,
child: Padding(
padding: EdgeInsets.all(SizeConfig.getHeightMultiplier() * 0.2),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Stack(
children: [
Positioned(
top: 0,
right: SizeConfig.getWidthMultiplier() * 2,
child: SvgPicture.asset(
AppAssets.textBgLeaf,
height: SizeConfig.getHeightMultiplier() * 0.4,
),
),
Padding(
padding: EdgeInsets.only(top: SizeConfig.getHeightMultiplier() * 0.1, right: SizeConfig.getWidthMultiplier() * 1),
child: AppText(
textAlign: TextAlign.center,
AppStrings.thankYouMessageAr,
fontSize: SizeConfig.getWidthMultiplier() * 3.6,
color: AppColors.darkGreyTextColor,
fontFamily: AppStrings.fontNameGesTwo,
),
),
],
),
SizedBox(height: SizeConfig.getHeightMultiplier() * 0.3),
Stack(
children: [
Positioned(
top: 0,
left: SizeConfig.getWidthMultiplier() * 3,
child: SvgPicture.asset(
AppAssets.textBgLeaf,
height: SizeConfig.getHeightMultiplier() * 0.4,
),
),
Padding(
padding: EdgeInsets.only(top: SizeConfig.getHeightMultiplier() * 0.1, left: SizeConfig.getWidthMultiplier() * 1.5),
child: AppText(
textAlign: TextAlign.center,
AppStrings.thankYouMessageEn,
fontSize: SizeConfig.getWidthMultiplier() * 3.6,
color: AppColors.darkGreyTextColor,
fontFamily: AppStrings.fontNamePoppins,
),
),
],
),
],
),
),
); );
} }
@ -307,6 +394,7 @@ Widget customShadowSmoothContainer({
required Widget child, required Widget child,
double? height, double? height,
double? width, double? width,
bool removeRightBorder = false,
}) { }) {
return Container( return Container(
padding: padding, padding: padding,
@ -316,7 +404,14 @@ Widget customShadowSmoothContainer({
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColors.whiteColor, color: AppColors.whiteColor,
borderRadius: BorderRadius.circular(SizeConfig.widthMultiplier! * 1.2), borderRadius: removeRightBorder
? BorderRadius.only(
topLeft: Radius.circular(SizeConfig.widthMultiplier! * 1.2), // Apply radius to top-left
bottomLeft: Radius.circular(SizeConfig.widthMultiplier! * 1.2), // Apply radius to bottom-left
topRight: Radius.zero, // Keep top-right corner sharp
bottomRight: Radius.zero, // Keep bottom-right corner sharp
)
: BorderRadius.circular(SizeConfig.widthMultiplier! * 1.2),
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: AppColors.smoothContainerShadow, color: AppColors.smoothContainerShadow,
@ -402,12 +497,11 @@ Widget customShadowSmoothContainerWithBackground({
); );
} }
Widget rssFeedWidget({required String feed}) { Widget rssFeedWidget({String? feed}) {
String feedToShow = feed ?? AppStrings.dummyRssFeedText;
return Expanded( return Expanded(
child: Container(
padding: const EdgeInsets.fromLTRB(10, 30, 10, 0),
child: Marquee( child: Marquee(
text: feed, text: feedToShow,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
fontSize: SizeConfig.getWidthMultiplier() * 2, fontSize: SizeConfig.getWidthMultiplier() * 2,
@ -424,7 +518,6 @@ Widget rssFeedWidget({required String feed}) {
decelerationDuration: const Duration(milliseconds: 500), decelerationDuration: const Duration(milliseconds: 500),
decelerationCurve: Curves.easeOut, decelerationCurve: Curves.easeOut,
), ),
),
); );
} }
@ -438,7 +531,7 @@ Widget callTypeContainer({
required TextDirection textDirection, required TextDirection textDirection,
bool isDisableRightBorderRadius = true, bool isDisableRightBorderRadius = true,
}) { }) {
final border = SizeConfig.getWidthMultiplier()! * 1; final border = SizeConfig.getWidthMultiplier()! * 0.7;
return Container( return Container(
padding: padding, padding: padding,
margin: margin, margin: margin,
@ -448,7 +541,7 @@ Widget callTypeContainer({
decoration: BoxDecoration( decoration: BoxDecoration(
color: color, color: color,
borderRadius: isDisableRightBorderRadius borderRadius: isDisableRightBorderRadius
? textDirection == TextDirection.ltr ? textDirection == TextDirection.rtl
? BorderRadius.only( ? BorderRadius.only(
topLeft: Radius.circular(border), topLeft: Radius.circular(border),
bottomLeft: Radius.circular(border), bottomLeft: Radius.circular(border),

@ -24,9 +24,16 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget {
textDirection: globalConfigurationsModel.textDirection, textDirection: globalConfigurationsModel.textDirection,
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(horizontal: SizeConfig.getWidthMultiplier() * 4), padding: EdgeInsets.symmetric(horizontal: SizeConfig.getWidthMultiplier() * 4),
child: Row( child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
engArabicTextWithSeparatorWidget(
englishText: globalConfigurationsModel.currentServeTextEng ?? "",
arabicText: globalConfigurationsModel.currentServeTextArb ?? "",
),
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
@ -36,14 +43,11 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget {
), ),
], ],
), ),
engArabicTextWithSeparatorWidget(
englishText: globalConfigurationsModel.currentServeTextEng ?? "",
arabicText: globalConfigurationsModel.currentServeTextArb ?? "",
),
// networkStatusBar(), // networkStatusBar(),
], ],
), ),
],
),
), ),
); );
}, },

@ -0,0 +1,59 @@
import 'package:flutter/material.dart';
class SimpleDateDisplay extends StatelessWidget {
final bool isForArabic;
SimpleDateDisplay({super.key, required this.isForArabic});
final List<String> _englishWeekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
final List<String> _englishMonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
// Note: For Arabic, the full month names are commonly used in this context.
final List<String> _arabicWeekdays = ['الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت', 'الأحد'];
final List<String> _arabicMonths = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'];
String _toArabicDigits(int number) {
const Map<String, String> arabicDigits = {
'0': '٠',
'1': '١',
'2': '٢',
'3': '٣',
'4': '٤',
'5': '٥',
'6': '٦',
'7': '٧',
'8': '٨',
'9': '٩',
};
return number.toString().split('').map((char) => arabicDigits[char] ?? char).join();
}
@override
Widget build(BuildContext context) {
final DateTime now = DateTime.now();
// English formatting
final String englishDayOfWeek = _englishWeekdays[now.weekday - 1];
final String englishMonthAbbr = _englishMonths[now.month - 1];
final String englishDateString = '$englishDayOfWeek | ${now.day} $englishMonthAbbr';
// Arabic formatting
final String arabicDayOfWeek = _arabicWeekdays[now.weekday - 1];
final String arabicDayDigits = _toArabicDigits(now.day);
final String arabicMonthName = _arabicMonths[now.month - 1];
final String arabicDateString = '$arabicDayOfWeek | $arabicDayDigits $arabicMonthName';
return isForArabic // Use widget.isForArabic to access the property
? Text(
arabicDateString,
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
textDirection: TextDirection.rtl, // Crucial for Arabic text
)
: Text(
englishDateString,
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
);
}
}

@ -0,0 +1,99 @@
import 'package:flutter/material.dart';
import 'package:hmg_qline/constants/app_constants.dart';
import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart';
import 'package:hmg_qline/views/view_helpers/size_config.dart';
class HmgNewsWidget extends StatelessWidget {
final String tagTitle;
const HmgNewsWidget({super.key, required this.tagTitle});
@override
Widget build(BuildContext context) {
return CustomPaint(
painter: ArrowShapePainter(
fillColor: AppColors.redColor,
arrowWidth: 20.0,
arrowHeight: 20.0,
topLeftRadius: const Radius.circular(10),
bottomLeftRadius: const Radius.circular(10),
topRightRadius: const Radius.circular(8),
bottomRightRadius: const Radius.circular(8),
),
child: Container(
color: Colors.transparent,
alignment: Alignment.center,
padding: const EdgeInsets.fromLTRB(20, 8, 35, 8),
child: AppText(
tagTitle,
color: AppColors.whiteColor,
fontWeight: FontWeight.bold,
fontSize: SizeConfig.getWidthMultiplier() * 1.5,
),
),
);
}
}
class ArrowShapePainter extends CustomPainter {
final Color fillColor;
final Radius topLeftRadius;
final Radius topRightRadius;
final Radius bottomLeftRadius;
final Radius bottomRightRadius;
final double arrowWidth;
final double arrowHeight;
ArrowShapePainter({
required this.fillColor,
this.topLeftRadius = Radius.zero, // Default to no rounding
this.topRightRadius = Radius.zero,
this.bottomLeftRadius = Radius.zero,
this.bottomRightRadius = Radius.zero,
this.arrowWidth = 20.0,
this.arrowHeight = 20.0,
});
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()
..color = fillColor
..style = PaintingStyle.fill;
final path = Path();
// Main rounded rectangle body with customizable corners
path.addRRect(RRect.fromLTRBAndCorners(
0,
0,
size.width - arrowWidth, // Adjust width for the arrow
size.height,
topLeft: topLeftRadius,
topRight: topRightRadius,
bottomLeft: bottomLeftRadius,
bottomRight: bottomRightRadius,
));
// Arrow part remains the same
path.moveTo(size.width - arrowWidth, (size.height / 2) - (arrowHeight / 2));
path.lineTo(size.width, size.height / 2);
path.lineTo(size.width - arrowWidth, (size.height / 2) + (arrowHeight / 2));
path.close();
canvas.drawPath(path, paint);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
if (oldDelegate is ArrowShapePainter) {
return oldDelegate.fillColor != fillColor ||
oldDelegate.topLeftRadius != topLeftRadius ||
oldDelegate.topRightRadius != topRightRadius ||
oldDelegate.bottomLeftRadius != bottomLeftRadius ||
oldDelegate.bottomRightRadius != bottomRightRadius ||
oldDelegate.arrowWidth != arrowWidth ||
oldDelegate.arrowHeight != arrowHeight;
}
return true;
}
}

@ -12,11 +12,7 @@ class PriorityTickets extends StatelessWidget {
final List<TicketDetailsModel> tickets; final List<TicketDetailsModel> tickets;
final GlobalConfigurationsModel globalConfigurationsModel; final GlobalConfigurationsModel globalConfigurationsModel;
const PriorityTickets({ const PriorityTickets({required this.tickets, required this.globalConfigurationsModel, super.key});
required this.tickets,
required this.globalConfigurationsModel,
super.key,
});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -26,12 +22,13 @@ class PriorityTickets extends StatelessWidget {
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: _buildTicketLayout(context), children: _buildTicketLayout(context),
), ),
); );
} }
Widget _buildAnimatedOtherTicketsRow(BuildContext context, {required int noOfTicketsToSkipFromStart, bool isHalf = false}) { Widget _buildOtherTicketsRow(BuildContext context, {required int noOfTicketsToSkipFromStart, bool isHalf = false}) {
final otherTickets = tickets.length > 2 ? tickets.sublist(noOfTicketsToSkipFromStart) : <TicketDetailsModel>[]; final otherTickets = tickets.length > 2 ? tickets.sublist(noOfTicketsToSkipFromStart) : <TicketDetailsModel>[];
if (otherTickets.isEmpty) return const SizedBox.shrink(); if (otherTickets.isEmpty) return const SizedBox.shrink();
@ -57,39 +54,40 @@ class PriorityTickets extends StatelessWidget {
switch (tickets.length) { switch (tickets.length) {
case 1: case 1:
return [_buildPrimaryTicket(context, tickets[0], isFullWidth: true)]; return [_buildPrimaryTicket(context, tickets[0], isFullWidth: true)];
case 2: case 2:
return [ return [
_buildPrimaryTicket(context, tickets[0], isHalf: true), Expanded(child: _buildPrimaryTicket(context, tickets[0], isHalf: true)),
_buildCurrentServeText(), SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.5),
_buildSecondaryTicket(context, tickets[1], isHalf: true), Expanded(child: _buildSecondaryTicket(context, tickets[1], isHalf: true)),
]; ];
case 3: case 3:
case 4: case 4:
return [ return [
_buildPrimaryTicket(context, tickets[0], isHalf: true), Expanded(child: _buildPrimaryTicket(context, tickets[0], isHalf: true)),
_buildCurrentServeText(), SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.5),
_buildAnimatedOtherTicketsRow(context, noOfTicketsToSkipFromStart: 1, isHalf: true), Expanded(child: _buildOtherTicketsRow(context, noOfTicketsToSkipFromStart: 1, isHalf: true)),
]; ];
default: default:
return [ return [
Row( Expanded(
child: Row(
children: [ children: [
Expanded( Expanded(
flex: 2, flex: 2,
child: _buildPrimaryTicket(context, tickets[0]), child: _buildPrimaryTicket(context, tickets[0]),
), ),
_buildSpacing(), SizedBox(width: SizeConfig.getWidthMultiplier() * 2),
Expanded( Expanded(
flex: 1, flex: 1,
child: _buildSecondaryTicket(context, tickets[1]), child: _buildSecondaryTicket(context, tickets[1]),
), ),
], ],
), ),
_buildCurrentServeText(), ),
_buildAnimatedOtherTicketsRow(context, noOfTicketsToSkipFromStart: 2), // _buildCurrentServeText(),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15),
Expanded(child: _buildOtherTicketsRow(context, noOfTicketsToSkipFromStart: 2)),
]; ];
} }
} }
@ -146,7 +144,7 @@ class PriorityTickets extends StatelessWidget {
return primaryCallingCard; return primaryCallingCard;
} }
Widget _buildSecondaryTicket(BuildContext context, TicketDetailsModel ticket, {bool isHalf = false}) { Widget _buildSecondaryTicket(BuildContext context, TicketDetailsModel ticket, {EdgeInsets? margin, bool isHalf = false}) {
Widget secondaryCallingCard = QueueItemNormalCard( Widget secondaryCallingCard = QueueItemNormalCard(
ticketNo: ticket.ticketModel?.queueNo ?? '', ticketNo: ticket.ticketModel?.queueNo ?? '',
roomNo: ticket.ticketModel?.roomNo ?? '', roomNo: ticket.ticketModel?.roomNo ?? '',
@ -186,10 +184,6 @@ class PriorityTickets extends StatelessWidget {
); );
} }
Widget _buildSpacing() {
return SizedBox(width: SizeConfig.getWidthMultiplier() * 2);
}
// Helper methods to reduce repetition // Helper methods to reduce repetition
double _getTicketScale() { double _getTicketScale() {
return globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen ? 2.0 : 1.2; return globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen ? 2.0 : 1.2;

@ -1,4 +1,7 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/constants/app_constants.dart';
import 'package:hmg_qline/models/global_config_model.dart'; import 'package:hmg_qline/models/global_config_model.dart';
import 'package:hmg_qline/models/ticket_model.dart'; import 'package:hmg_qline/models/ticket_model.dart';
@ -9,16 +12,18 @@ import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart';
import 'package:hmg_qline/views/main_queue_screen/components/priority_tickets.dart'; import 'package:hmg_qline/views/main_queue_screen/components/priority_tickets.dart';
import 'package:hmg_qline/views/view_helpers/size_config.dart'; import 'package:hmg_qline/views/view_helpers/size_config.dart';
class PriorityTicketsWithSidelist extends StatelessWidget { class PriorityTicketsWithSideSection extends StatelessWidget {
final List<TicketDetailsModel> tickets; final List<TicketDetailsModel> tickets;
final GlobalConfigurationsModel globalConfigurationsModel; final GlobalConfigurationsModel globalConfigurationsModel;
final ScreenOrientationEnum screenOrientationEnum; final ScreenOrientationEnum screenOrientationEnum;
final bool showThankyouMessage;
const PriorityTicketsWithSidelist({ const PriorityTicketsWithSideSection({
super.key, super.key,
required this.tickets, required this.tickets,
required this.globalConfigurationsModel, required this.globalConfigurationsModel,
required this.screenOrientationEnum, required this.screenOrientationEnum,
required this.showThankyouMessage,
}); });
Widget ticketListItem({required TicketData? ticketModel}) { Widget ticketListItem({required TicketData? ticketModel}) {
@ -37,7 +42,7 @@ class PriorityTicketsWithSidelist extends StatelessWidget {
ticketModel!.queueNo ?? "", ticketModel!.queueNo ?? "",
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: AppColors.greyTextColor, color: AppColors.greyTextColor,
fontSize: SizeConfig.getWidthMultiplier() * 2, fontSize: SizeConfig.getWidthMultiplier() * 1.8,
textAlign: TextAlign.center, textAlign: TextAlign.center,
fontFamily: AppStrings.fontNamePoppins, fontFamily: AppStrings.fontNamePoppins,
), ),
@ -65,23 +70,31 @@ class PriorityTicketsWithSidelist extends StatelessWidget {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
AppText( Expanded(
flex: 3,
child: AppText(
callMessageAr, callMessageAr,
color: ticketModel.callTypeEnum.getColorByCallType(), color: ticketModel.callTypeEnum.getColorByCallType(),
fontSize: SizeConfig.getWidthMultiplier() * 2, fontSize: SizeConfig.getWidthMultiplier() * 1.8,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontFamily: AppStrings.fontNameGesTwo, fontFamily: AppStrings.fontNameGesTwo,
fontHeight: 1, fontHeight: 1,
textOverflow: TextOverflow.clip,
maxLines: 1,
),
), ),
SizedBox(width: SizeConfig.getWidthMultiplier()), SizedBox(width: SizeConfig.getWidthMultiplier()),
if (callMessageEng.isNotEmpty) ...[ if (callMessageEng.isNotEmpty) ...[
AppText( Expanded(
flex: 2,
child: AppText(
"($callMessageEng)", "($callMessageEng)",
color: ticketModel.callTypeEnum.getColorByCallType(), color: ticketModel.callTypeEnum.getColorByCallType(),
fontSize: SizeConfig.getWidthMultiplier() * 2, fontSize: SizeConfig.getWidthMultiplier() * 1.8,
fontFamily: AppStrings.fontNamePoppins, fontFamily: AppStrings.fontNamePoppins,
fontHeight: 1, fontHeight: 1,
), ),
),
] ]
], ],
), ),
@ -98,8 +111,11 @@ class PriorityTicketsWithSidelist extends StatelessWidget {
ticketModel.roomNo ?? "", ticketModel.roomNo ?? "",
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: AppColors.greyTextColor, color: AppColors.greyTextColor,
fontSize: SizeConfig.getWidthMultiplier() * 2, fontSize: SizeConfig.getWidthMultiplier() * 1.8,
fontFamily: globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins, fontFamily: globalConfigurationsModel.screenLanguageEnum == LanguageEnum.arabic ? AppStrings.fontNameCairo : AppStrings.fontNamePoppins,
maxLines: 1,
textOverflow: TextOverflow.clip,
textDirection: globalConfigurationsModel.textDirection,
), ),
), ),
) )
@ -108,17 +124,37 @@ class PriorityTicketsWithSidelist extends StatelessWidget {
); );
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final priorityTickets = tickets.sublist(0, AppConstants.thresholdForListUI); List<TicketDetailsModel> priorityTickets = [];
final otherTickets = tickets.sublist(AppConstants.thresholdForListUI, tickets.length); List<TicketDetailsModel> otherTickets = [];
log("tickets : ${tickets.length}");
log("priorityTickets : ${priorityTickets.length}");
log("otherTickets : ${otherTickets.length}");
if (tickets.length > AppConstants.thresholdForListUI) {
priorityTickets = tickets.sublist(0, AppConstants.thresholdForListUI);
otherTickets = tickets.sublist(AppConstants.thresholdForListUI, tickets.length);
} else {
priorityTickets = tickets;
}
final List<Widget> children = [ final List<Widget> children = [
Expanded(flex: 5, child: PriorityTickets(globalConfigurationsModel: globalConfigurationsModel, tickets: priorityTickets)), Expanded(flex: 5, child: PriorityTickets(globalConfigurationsModel: globalConfigurationsModel, tickets: priorityTickets)),
if (screenOrientationEnum == ScreenOrientationEnum.portraitUp || screenOrientationEnum == ScreenOrientationEnum.portraitDown) ...[ if (screenOrientationEnum == ScreenOrientationEnum.portraitUp || screenOrientationEnum == ScreenOrientationEnum.portraitDown) ...[
SizedBox(width: SizeConfig.getWidthMultiplier() * 2), SizedBox(width: SizeConfig.getWidthMultiplier() * 2),
], ],
if (screenOrientationEnum == ScreenOrientationEnum.landscapeLeft || screenOrientationEnum == ScreenOrientationEnum.landscapeRight) ...[
SizedBox(height: SizeConfig.getHeightMultiplier() * 0.2),
],
if (showThankyouMessage) ...[
showThankyouWidget(),
] else ...[
Expanded( Expanded(
flex: 5, flex: !globalConfigurationsModel.isRssFeedReq && (screenOrientationEnum == ScreenOrientationEnum.landscapeLeft || screenOrientationEnum == ScreenOrientationEnum.landscapeRight) ? 6 : 4,
// flex: !globalConfigurationsModel.isRssFeedReq && (screenOrientationEnum == ScreenOrientationEnum.landscapeLeft || screenOrientationEnum == ScreenOrientationEnum.landscapeRight) ? 6 : 4,
child: customShadowSmoothContainer( child: customShadowSmoothContainer(
child: Column( child: Column(
children: [ children: [
@ -171,13 +207,16 @@ class PriorityTicketsWithSidelist extends StatelessWidget {
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.06), SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.06),
Expanded( Expanded(
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(horizontal: SizeConfig.getWidthMultiplier() * 6), padding: EdgeInsets.symmetric(horizontal: SizeConfig.getWidthMultiplier() * 3),
child: ListView.separated( child: ListView.separated(
separatorBuilder: (context, int index) => Divider( separatorBuilder: (context, int index) => Padding(
padding: EdgeInsets.only(right: SizeConfig.getWidthMultiplier() * 2),
child: Divider(
color: AppColors.lightBorderColor, color: AppColors.lightBorderColor,
thickness: SizeConfig.getHeightMultiplier()! * 0.01, thickness: SizeConfig.getHeightMultiplier()! * 0.01,
height: SizeConfig.getHeightMultiplier()! * 0.14, height: SizeConfig.getHeightMultiplier()! * 0.14,
), ),
),
itemCount: otherTickets.length, itemCount: otherTickets.length,
itemBuilder: (ctx, index) { itemBuilder: (ctx, index) {
final ticketModel = otherTickets[index].ticketModel; final ticketModel = otherTickets[index].ticketModel;
@ -190,6 +229,7 @@ class PriorityTicketsWithSidelist extends StatelessWidget {
), ),
), ),
) )
],
]; ];
return (screenOrientationEnum == ScreenOrientationEnum.portraitUp || screenOrientationEnum == ScreenOrientationEnum.portraitDown) return (screenOrientationEnum == ScreenOrientationEnum.portraitUp || screenOrientationEnum == ScreenOrientationEnum.portraitDown)

@ -60,7 +60,6 @@ class QueueItemCallingCard extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final text = "${callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false)} | $roomText $roomNo"; final text = "${callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false)} | $roomText $roomNo";
return Stack( return Stack(
children: [ children: [
customShadowSmoothContainerWithBackground( customShadowSmoothContainerWithBackground(
@ -68,13 +67,20 @@ class QueueItemCallingCard extends StatelessWidget {
callTypeEnum: callTypeEnum, callTypeEnum: callTypeEnum,
child: Directionality( child: Directionality(
textDirection: textDirection, textDirection: textDirection,
child: IntrinsicHeight(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
children: [ children: [
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0, left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
), ),
child: callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.5), child: callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.5),
), ),
@ -92,29 +98,45 @@ class QueueItemCallingCard extends StatelessWidget {
), ),
), ),
), ),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15), ],
),
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0, left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 5 : 0,
left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0, right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 5 : 0,
top: SizeConfig.getHeightMultiplier() * 0.25,
), ),
child: AppText( child: AppText(
callTypeEnum.getMessageByCallTypeForArabic(globalConfigurationsModel, isListView: false), getFormattedTicket(ticketNo, isClinicAdded),
color: callTypeEnum.getColorByCallType(), fontSize: SizeConfig.getWidthMultiplier() * 7.4,
fontSize: SizeConfig.getWidthMultiplier() * 2.5, letterSpacing: -1,
fontHeight: 1, fontHeight: 0.5,
fontFamily: AppStrings.fontNameGesTwo, color: AppColors.greyTextColor,
fontWeight: FontWeight.bold,
fontFamily: AppStrings.fontNamePoppins,
), ),
), ),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15), ],
),
SizedBox(height: SizeConfig.getHeightMultiplier() * 0.17),
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0, left: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0, right: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
), ),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
callTypeEnum.getMessageByCallTypeForArabic(globalConfigurationsModel, isListView: false),
color: callTypeEnum.getColorByCallType(),
fontSize: SizeConfig.getWidthMultiplier() * 2.5,
fontHeight: 1,
fontFamily: AppStrings.fontNameGesTwo,
),
SizedBox(height: SizeConfig.getHeightMultiplier() * 0.05),
ClipRRect( ClipRRect(
child: AppText( child: AppText(
text, text,
@ -128,34 +150,18 @@ class QueueItemCallingCard extends StatelessWidget {
), ),
], ],
), ),
),
], ],
), ),
), ),
],
), ),
Padding(
padding: EdgeInsets.only(
top: SizeConfig.getHeightMultiplier() * 0.1,
left: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 2 : 0,
right: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 2 : 0,
),
child: SvgPicture.asset(AppAssets.hmgLogoPatternDarkIcon, height: SizeConfig.getHeightMultiplier() * 1),
), ),
Padding(
padding: EdgeInsets.only(
left: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 6 : 0,
right: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 6 : 0,
top: SizeConfig.getHeightMultiplier() * 0.4,
), ),
child: AppText(
getFormattedTicket(ticketNo, isClinicAdded),
fontSize: SizeConfig.getWidthMultiplier() * 7.4,
letterSpacing: -1,
fontHeight: 0.5,
color: AppColors.greyTextColor,
fontWeight: FontWeight.bold,
fontFamily: AppStrings.fontNamePoppins,
), ),
Positioned(
top: SizeConfig.getHeightMultiplier() * 0.1,
left: SizeConfig.getWidthMultiplier() * 2,
child: SvgPicture.asset(AppAssets.hmgLogoPatternDarkIcon, height: SizeConfig.getHeightMultiplier() * 1),
), ),
], ],
); );

@ -1,4 +1,3 @@
import 'package:blinking_text/blinking_text.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/constants/app_constants.dart';
@ -20,6 +19,8 @@ class QueueItemNormalCard extends StatelessWidget {
final CallTypeEnum callTypeEnum; final CallTypeEnum callTypeEnum;
final ScreenTypeEnum screenTypeEnum; final ScreenTypeEnum screenTypeEnum;
final LanguageEnum langTypeEnum; final LanguageEnum langTypeEnum;
final double? height;
final double? width;
const QueueItemNormalCard({ const QueueItemNormalCard({
super.key, super.key,
@ -33,6 +34,8 @@ class QueueItemNormalCard extends StatelessWidget {
required this.callTypeEnum, required this.callTypeEnum,
required this.screenTypeEnum, required this.screenTypeEnum,
required this.langTypeEnum, required this.langTypeEnum,
this.height,
this.width,
}); });
String getFormattedTicket(String ticketNo, bool isClinicAdded) { String getFormattedTicket(String ticketNo, bool isClinicAdded) {
@ -53,16 +56,23 @@ class QueueItemNormalCard extends StatelessWidget {
return Stack( return Stack(
children: [ children: [
customShadowSmoothContainer( customShadowSmoothContainer(
padding: EdgeInsets.symmetric( height: height,
vertical: SizeConfig.getHeightMultiplier() * 0.1, width: width,
horizontal: SizeConfig.getWidthMultiplier() * 1.5, padding: EdgeInsets.only(
top: SizeConfig.getHeightMultiplier() * 0.05,
left: SizeConfig.getWidthMultiplier() * 1.5,
right: SizeConfig.getWidthMultiplier() * 1.5,
), ),
child: Directionality( child: Directionality(
textDirection: textDirection, textDirection: textDirection,
child: IntrinsicHeight(
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.14), Flexible(
AppText( flex: 3,
child: Center(
child: AppText(
getFormattedTicket(ticketNo, isClinicAdded), getFormattedTicket(ticketNo, isClinicAdded),
fontSize: SizeConfig.getWidthMultiplier() * 5, fontSize: SizeConfig.getWidthMultiplier() * 5,
letterSpacing: -1, letterSpacing: -1,
@ -71,15 +81,34 @@ class QueueItemNormalCard extends StatelessWidget {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontFamily: AppStrings.fontNamePoppins, fontFamily: AppStrings.fontNamePoppins,
), ),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15), ),
Row( ),
mainAxisAlignment: MainAxisAlignment.end, Flexible(
flex: 3,
child: Row(
children: [ children: [
callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.35), callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.35),
], ],
), ),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.14), ),
IntrinsicWidth( Flexible(
flex: 4,
child: Center(
child: AppText(
textAlign: TextAlign.center,
"${callTypeEnum.getMessageByCallTypeForArabic(globalConfigurationsModel, isListView: false)} ",
color: AppColors.greyTextColor,
fontSize: SizeConfig.getWidthMultiplier() * 2,
fontHeight: 1,
fontFamily: AppStrings.fontNameGesTwo,
maxLines: 2,
textOverflow: TextOverflow.clip,
),
),
),
Flexible(
flex: 2,
child: IntrinsicWidth(
child: callTypeContainer( child: callTypeContainer(
textDirection: textDirection, textDirection: textDirection,
isDisableRightBorderRadius: false, isDisableRightBorderRadius: false,
@ -94,31 +123,20 @@ class QueueItemNormalCard extends StatelessWidget {
), ),
), ),
), ),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.14),
AppText(
textAlign: TextAlign.center,
"${callTypeEnum.getMessageByCallTypeForArabic(globalConfigurationsModel, isListView: false)} ",
color: callTypeEnum.getColorByCallType(),
fontSize: SizeConfig.getWidthMultiplier() * 2,
fontHeight: 1,
fontFamily: AppStrings.fontNameGesTwo,
maxLines: 2,
textOverflow: TextOverflow.clip,
), ),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.14), Flexible(
Row( flex: 2,
mainAxisAlignment: MainAxisAlignment.center, child: Container(
children: [ alignment: Alignment.bottomCenter,
Expanded(
child: Center( child: Center(
child: ClipRRect(
child: AppText( child: AppText(
text, text,
color: callTypeEnum.getColorByCallType(), color: AppColors.greyTextColor,
fontSize: SizeConfig.getWidthMultiplier() * 1.5, fontSize: SizeConfig.getWidthMultiplier() * 1.5,
fontFamily: AppStrings.fontNamePoppins, fontFamily: AppStrings.fontNamePoppins,
textAlign: TextAlign.left, textAlign: TextAlign.center,
textOverflow: TextOverflow.clip, textOverflow: TextOverflow.clip,
fontHeight: 1.2,
maxLines: 1, maxLines: 1,
), ),
), ),
@ -126,17 +144,17 @@ class QueueItemNormalCard extends StatelessWidget {
), ),
], ],
), ),
],
), ),
), ),
), ),
Padding( Positioned(
padding: EdgeInsets.only( left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 2 : null,
left: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 2 : 0, right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 2 : null,
right: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 2 : 0,
top: SizeConfig.getHeightMultiplier() * 0.1, top: SizeConfig.getHeightMultiplier() * 0.1,
child: SvgPicture.asset(
AppAssets.hmgLogoPatternLightIcon,
height: SizeConfig.getHeightMultiplier() * 0.8,
), ),
child: SvgPicture.asset(AppAssets.hmgLogoPatternLightIcon, height: SizeConfig.getHeightMultiplier() * 0.8),
), ),
], ],
); );

@ -121,18 +121,21 @@ class _MainQueueScreenState extends State<MainQueueScreen> {
), ),
], ],
); );
} else if (queuingViewModel.currentTickets.length > AppConstants.thresholdForListUI) {
widget = PriorityTicketsWithSidelist(
tickets: queuingViewModel.currentTickets,
globalConfigurationsModel: screenConfigViewModel.globalConfigurationsModel,
screenOrientationEnum: screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum,
);
} else { } else {
widget = PriorityTickets( widget = PriorityTicketsWithSideSection(
tickets: queuingViewModel.currentTickets, tickets: queuingViewModel.currentTickets,
globalConfigurationsModel: screenConfigViewModel.globalConfigurationsModel, globalConfigurationsModel: screenConfigViewModel.globalConfigurationsModel,
screenOrientationEnum: screenConfigViewModel.globalConfigurationsModel.orientationTypeEnum,
showThankyouMessage: queuingViewModel.currentTickets.length <= AppConstants.thresholdForListUI,
// showThankyouMessage: true,
); );
} }
// else {
// widget = PriorityTickets(
// tickets: queuingViewModel.currentTickets,
// globalConfigurationsModel: screenConfigViewModel.globalConfigurationsModel,
// );
// }
return widget; return widget;
}, },

@ -57,11 +57,9 @@ dependencies:
restart_app: ^1.3.2 restart_app: ^1.3.2
zo_animated_border: ^1.0.1 zo_animated_border: ^1.0.1
animated_flip_counter: ^0.3.4 animated_flip_counter: ^0.3.4
# smooth_corner: ^1.1.1
# esc_pos_printer: ^4.0.0 # Ensure you are using the latest version
# esc_pos_utils: ^1.0.0
# win32: ^5.8.0
# tuple: ^2.0.2
dependency_overrides: dependency_overrides:
http: ^1.2.2 http: ^1.2.2

Loading…
Cancel
Save