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 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 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 {
@ -144,6 +148,7 @@ class AppAssets {
static String newVitalSignIcon = "assets/images/vitalsign_icon.svg";
static String newDoctorIcon = "assets/images/doctor_icon.svg";
static String textBgLeaf = "assets/new_design_icons/text_bg_leaf.svg";
}
class AppConstants {

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

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

@ -118,6 +118,21 @@ class ScreenDetailsRepoImp implements ScreenDetailsRepo {
@override
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 {
final body = {"cityID": cityId};
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]));
if (weathersWidgetModel.isNotEmpty) {
loggerService.logToFile(message: weathersWidgetModel.toString(), source: "getWeatherDetailsByCity-> screen_details_repo.dart", type: LogTypeEnum.data);
return weathersWidgetModel.first;
}
return null;
return constantWeathersWidgetModel;
} catch (e) {
loggerService.logError(e.toString());
loggerService.logToFile(message: e.toString(), source: "getWeatherDetailsByCity-> screen_details_repo.dart", type: LogTypeEnum.error);
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: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/date_display_widget.dart';
import 'package:hmg_qline/views/common_widgets/headline_tag_widget.dart';
import 'package:provider/provider.dart';
import 'package:hmg_qline/constants/app_constants.dart';
import 'package:hmg_qline/utilities/enums.dart';
@ -111,12 +113,12 @@ class _AppFooterState extends State<AppFooter> {
children: [
AppText(
label,
fontSize: SizeConfig.getWidthMultiplier()! * 1.8,
fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins,
),
AppText(
prayerName,
fontSize: SizeConfig.getWidthMultiplier()! * 2,
fontSize: SizeConfig.getWidthMultiplier()! * 1.8,
fontWeight: FontWeight.bold,
color: AppColors.darkGreyTextColor,
fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins,
@ -159,6 +161,115 @@ class _AppFooterState extends State<AppFooter> {
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
Widget build(BuildContext context) {
return Consumer<ScreenConfigViewModel>(
@ -167,14 +278,21 @@ class _AppFooterState extends State<AppFooter> {
screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown;
return Padding(
padding: EdgeInsets.symmetric(
horizontal: SizeConfig.getWidthMultiplier() * 4,
vertical: SizeConfig.getHeightMultiplier() * 0.14,
padding: EdgeInsets.fromLTRB(
SizeConfig.getWidthMultiplier() * 4,
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(
children: [
Expanded(
flex: 3,
flex: screenConfigVM.globalConfigurationsModel.isWeatherReq && screenConfigVM.globalConfigurationsModel.isPrayerTimeReq ? 2 : 3,
child: customShadowSmoothContainer(
height: SizeConfig.getHeightMultiplier() * 0.8,
padding: EdgeInsets.symmetric(
@ -218,26 +336,7 @@ class _AppFooterState extends State<AppFooter> {
),
],
),
Padding(
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),
],
),
),
_buildConnectionStatus(screenConfigVM),
],
),
),
@ -247,18 +346,46 @@ class _AppFooterState extends State<AppFooter> {
Directionality(
textDirection: screenConfigVM.globalConfigurationsModel.textDirection,
child: Expanded(
flex: isPortrait ? 2 : 3,
flex: 2,
child: customShadowSmoothContainer(
height: SizeConfig.getHeightMultiplier() * 0.8,
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,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
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(
width: SizeConfig.getWidthMultiplier() * 15,
width: SizeConfig.getWidthMultiplier() * 14,
child: Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
@ -275,14 +402,14 @@ class _AppFooterState extends State<AppFooter> {
_isMoreThanOneHour(_remainingTime)
? AppText(
screenConfigVM.nextPrayerTime,
fontSize: SizeConfig.getWidthMultiplier()! * 3,
fontSize: SizeConfig.getWidthMultiplier()! * 2.5,
fontWeight: FontWeight.bold,
color: AppColors.newRedColor,
letterSpacing: 1.5,
)
: AppText(
_remainingTime,
fontSize: SizeConfig.getWidthMultiplier()! * 3,
fontSize: SizeConfig.getWidthMultiplier()! * 2.5,
fontWeight: FontWeight.bold,
color: AppColors.newRedColor,
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) ...[
_buildPrayerColumn(screenConfigVM.globalConfigurationsModel.nextPrayerTextArb, screenConfigVM.nextPrayerToShowArb, isForArabic: true),
if (screenConfigVM.globalConfigurationsModel.isWeatherReq &&
(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:hmg_qline/constants/app_constants.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/views/common_widgets/app_texts_widget.dart';
import 'package:hmg_qline/views/view_helpers/size_config.dart';
@ -281,9 +280,11 @@ Widget engArabicTextWithSeparatorWidget({
mainAxisAlignment: mainAxisAlignment ?? MainAxisAlignment.start,
children: [
AppText(
englishText,
fontSize: fontSize ?? SizeConfig.getWidthMultiplier() * 2.6,
arabicText,
color: color ?? AppColors.darkGreyTextColor,
fontSize: fontSize ?? SizeConfig.getWidthMultiplier() * 2.6,
fontFamily: AppStrings.fontNameGesTwo,
fontWeight: FontWeight.bold,
),
AppText(
" | ",
@ -291,13 +292,99 @@ Widget engArabicTextWithSeparatorWidget({
color: color ?? AppColors.darkGreyTextColor,
),
AppText(
arabicText,
color: color ?? AppColors.darkGreyTextColor,
englishText,
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,
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,
double? height,
double? width,
bool removeRightBorder = false,
}) {
return Container(
padding: padding,
@ -316,7 +404,14 @@ Widget customShadowSmoothContainer({
alignment: Alignment.center,
decoration: BoxDecoration(
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(
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(
child: Container(
padding: const EdgeInsets.fromLTRB(10, 30, 10, 0),
child: Marquee(
text: feed,
text: feedToShow,
style: TextStyle(
fontWeight: FontWeight.w400,
fontSize: SizeConfig.getWidthMultiplier() * 2,
@ -424,7 +518,6 @@ Widget rssFeedWidget({required String feed}) {
decelerationDuration: const Duration(milliseconds: 500),
decelerationCurve: Curves.easeOut,
),
),
);
}
@ -438,7 +531,7 @@ Widget callTypeContainer({
required TextDirection textDirection,
bool isDisableRightBorderRadius = true,
}) {
final border = SizeConfig.getWidthMultiplier()! * 1;
final border = SizeConfig.getWidthMultiplier()! * 0.7;
return Container(
padding: padding,
margin: margin,
@ -448,7 +541,7 @@ Widget callTypeContainer({
decoration: BoxDecoration(
color: color,
borderRadius: isDisableRightBorderRadius
? textDirection == TextDirection.ltr
? textDirection == TextDirection.rtl
? BorderRadius.only(
topLeft: Radius.circular(border),
bottomLeft: Radius.circular(border),

@ -24,9 +24,16 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget {
textDirection: globalConfigurationsModel.textDirection,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: SizeConfig.getWidthMultiplier() * 4),
child: Row(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
engArabicTextWithSeparatorWidget(
englishText: globalConfigurationsModel.currentServeTextEng ?? "",
arabicText: globalConfigurationsModel.currentServeTextArb ?? "",
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
@ -36,14 +43,11 @@ class AppHeader extends StatelessWidget implements PreferredSizeWidget {
),
],
),
engArabicTextWithSeparatorWidget(
englishText: globalConfigurationsModel.currentServeTextEng ?? "",
arabicText: globalConfigurationsModel.currentServeTextArb ?? "",
),
// 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 GlobalConfigurationsModel globalConfigurationsModel;
const PriorityTickets({
required this.tickets,
required this.globalConfigurationsModel,
super.key,
});
const PriorityTickets({required this.tickets, required this.globalConfigurationsModel, super.key});
@override
Widget build(BuildContext context) {
@ -26,12 +22,13 @@ class PriorityTickets extends StatelessWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
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>[];
if (otherTickets.isEmpty) return const SizedBox.shrink();
@ -57,39 +54,40 @@ class PriorityTickets extends StatelessWidget {
switch (tickets.length) {
case 1:
return [_buildPrimaryTicket(context, tickets[0], isFullWidth: true)];
case 2:
return [
_buildPrimaryTicket(context, tickets[0], isHalf: true),
_buildCurrentServeText(),
_buildSecondaryTicket(context, tickets[1], isHalf: true),
Expanded(child: _buildPrimaryTicket(context, tickets[0], isHalf: true)),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.5),
Expanded(child: _buildSecondaryTicket(context, tickets[1], isHalf: true)),
];
case 3:
case 4:
return [
_buildPrimaryTicket(context, tickets[0], isHalf: true),
_buildCurrentServeText(),
_buildAnimatedOtherTicketsRow(context, noOfTicketsToSkipFromStart: 1, isHalf: true),
Expanded(child: _buildPrimaryTicket(context, tickets[0], isHalf: true)),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.5),
Expanded(child: _buildOtherTicketsRow(context, noOfTicketsToSkipFromStart: 1, isHalf: true)),
];
default:
return [
Row(
Expanded(
child: Row(
children: [
Expanded(
flex: 2,
child: _buildPrimaryTicket(context, tickets[0]),
),
_buildSpacing(),
SizedBox(width: SizeConfig.getWidthMultiplier() * 2),
Expanded(
flex: 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;
}
Widget _buildSecondaryTicket(BuildContext context, TicketDetailsModel ticket, {bool isHalf = false}) {
Widget _buildSecondaryTicket(BuildContext context, TicketDetailsModel ticket, {EdgeInsets? margin, bool isHalf = false}) {
Widget secondaryCallingCard = QueueItemNormalCard(
ticketNo: ticket.ticketModel?.queueNo ?? '',
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
double _getTicketScale() {
return globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen ? 2.0 : 1.2;

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

@ -60,7 +60,6 @@ class QueueItemCallingCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final text = "${callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false)} | $roomText $roomNo";
return Stack(
children: [
customShadowSmoothContainerWithBackground(
@ -68,13 +67,20 @@ class QueueItemCallingCard extends StatelessWidget {
callTypeEnum: callTypeEnum,
child: Directionality(
textDirection: textDirection,
child: IntrinsicHeight(
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
children: [
Padding(
padding: EdgeInsets.only(
right: textDirection == TextDirection.ltr ? 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),
),
@ -92,29 +98,45 @@ class QueueItemCallingCard extends StatelessWidget {
),
),
),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15),
],
),
Padding(
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() * 5 : 0,
right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 5 : 0,
top: SizeConfig.getHeightMultiplier() * 0.25,
),
child: AppText(
callTypeEnum.getMessageByCallTypeForArabic(globalConfigurationsModel, isListView: false),
color: callTypeEnum.getColorByCallType(),
fontSize: SizeConfig.getWidthMultiplier() * 2.5,
fontHeight: 1,
fontFamily: AppStrings.fontNameGesTwo,
getFormattedTicket(ticketNo, isClinicAdded),
fontSize: SizeConfig.getWidthMultiplier() * 7.4,
letterSpacing: -1,
fontHeight: 0.5,
color: AppColors.greyTextColor,
fontWeight: FontWeight.bold,
fontFamily: AppStrings.fontNamePoppins,
),
),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15),
],
),
SizedBox(height: SizeConfig.getHeightMultiplier() * 0.17),
Padding(
padding: EdgeInsets.only(
right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
left: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
right: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
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(
child: AppText(
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_svg/flutter_svg.dart';
import 'package:hmg_qline/constants/app_constants.dart';
@ -20,6 +19,8 @@ class QueueItemNormalCard extends StatelessWidget {
final CallTypeEnum callTypeEnum;
final ScreenTypeEnum screenTypeEnum;
final LanguageEnum langTypeEnum;
final double? height;
final double? width;
const QueueItemNormalCard({
super.key,
@ -33,6 +34,8 @@ class QueueItemNormalCard extends StatelessWidget {
required this.callTypeEnum,
required this.screenTypeEnum,
required this.langTypeEnum,
this.height,
this.width,
});
String getFormattedTicket(String ticketNo, bool isClinicAdded) {
@ -53,16 +56,23 @@ class QueueItemNormalCard extends StatelessWidget {
return Stack(
children: [
customShadowSmoothContainer(
padding: EdgeInsets.symmetric(
vertical: SizeConfig.getHeightMultiplier() * 0.1,
horizontal: SizeConfig.getWidthMultiplier() * 1.5,
height: height,
width: width,
padding: EdgeInsets.only(
top: SizeConfig.getHeightMultiplier() * 0.05,
left: SizeConfig.getWidthMultiplier() * 1.5,
right: SizeConfig.getWidthMultiplier() * 1.5,
),
child: Directionality(
textDirection: textDirection,
child: IntrinsicHeight(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.14),
AppText(
Flexible(
flex: 3,
child: Center(
child: AppText(
getFormattedTicket(ticketNo, isClinicAdded),
fontSize: SizeConfig.getWidthMultiplier() * 5,
letterSpacing: -1,
@ -71,15 +81,34 @@ class QueueItemNormalCard extends StatelessWidget {
fontWeight: FontWeight.bold,
fontFamily: AppStrings.fontNamePoppins,
),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15),
Row(
mainAxisAlignment: MainAxisAlignment.end,
),
),
Flexible(
flex: 3,
child: Row(
children: [
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(
textDirection: textDirection,
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),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
Flexible(
flex: 2,
child: Container(
alignment: Alignment.bottomCenter,
child: Center(
child: ClipRRect(
child: AppText(
text,
color: callTypeEnum.getColorByCallType(),
color: AppColors.greyTextColor,
fontSize: SizeConfig.getWidthMultiplier() * 1.5,
fontFamily: AppStrings.fontNamePoppins,
textAlign: TextAlign.left,
textAlign: TextAlign.center,
textOverflow: TextOverflow.clip,
fontHeight: 1.2,
maxLines: 1,
),
),
@ -126,17 +144,17 @@ class QueueItemNormalCard extends StatelessWidget {
),
],
),
],
),
),
),
Padding(
padding: EdgeInsets.only(
left: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 2 : 0,
right: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 2 : 0,
Positioned(
left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 2 : null,
right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 2 : null,
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 {
widget = PriorityTickets(
widget = PriorityTicketsWithSideSection(
tickets: queuingViewModel.currentTickets,
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;
},

@ -57,11 +57,9 @@ dependencies:
restart_app: ^1.3.2
zo_animated_border: ^1.0.1
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:
http: ^1.2.2

Loading…
Cancel
Save