diff --git a/assets/images/not_found.svg b/assets/images/not_found.svg
new file mode 100644
index 0000000..80aed53
--- /dev/null
+++ b/assets/images/not_found.svg
@@ -0,0 +1,8 @@
+
diff --git a/lib/api/pending_transactions_api_client.dart b/lib/api/pending_transactions_api_client.dart
index 45e87af..30c6241 100644
--- a/lib/api/pending_transactions_api_client.dart
+++ b/lib/api/pending_transactions_api_client.dart
@@ -33,4 +33,15 @@ class PendingTransactionsApiClient {
return responseData.getPendingTransactionsDetails ?? [];
}, url, postParams);
}
+
+ Future getAnnouncements(int itgAwarenessID, int itgPageNo, int itgRowID) async {
+ String url = "${ApiConsts.cocRest}GetAnnouncementDiscountsConfigData";
+ Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER.toString(), "ItgAwarenessID": itgAwarenessID, "ItgPageNo": itgPageNo, "ItgPageSize": 5, "ItgRowID": itgRowID};
+
+ postParams.addAll(AppState().postParamsJson);
+ return await ApiClient().postJsonForObject((json) {
+ GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
+ return responseData.mohemmITGResponseItem ?? "";
+ }, url, postParams);
+ }
}
diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart
index ea7b559..20d791b 100644
--- a/lib/classes/utils.dart
+++ b/lib/classes/utils.dart
@@ -141,6 +141,14 @@ class Utils {
return null;
}
+ static getBase64FromJpeg(img) {
+ try {
+ var b64 = img.replaceFirst('data:image/jpeg;base64,', '');
+ return b64;
+ } catch (e) {}
+ return null;
+ }
+
static bool isBase64(String str) {
RegExp _base64 = RegExp(r'^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$');
return _base64.hasMatch(str);
diff --git a/lib/models/get_announcement_details.dart b/lib/models/get_announcement_details.dart
new file mode 100644
index 0000000..33628ce
--- /dev/null
+++ b/lib/models/get_announcement_details.dart
@@ -0,0 +1,72 @@
+class GetAnnouncementDetails {
+ String? titleEN;
+ String? titleAR;
+ String? emailBodyEN;
+ String? emailBodyAR;
+ String? bodyEN;
+ String? bodyAR;
+ String? bannerImage;
+ String? rowID;
+ String? awarenessName;
+ String? created;
+ String? publishedDesc;
+ String? published;
+ String? twoLanguageTemplateDesc;
+ String? wFStatus;
+ String? totalItems;
+
+ GetAnnouncementDetails(
+ {this.titleEN,
+ this.titleAR,
+ this.emailBodyEN,
+ this.emailBodyAR,
+ this.bodyEN,
+ this.bodyAR,
+ this.bannerImage,
+ this.rowID,
+ this.awarenessName,
+ this.created,
+ this.publishedDesc,
+ this.published,
+ this.twoLanguageTemplateDesc,
+ this.wFStatus,
+ this.totalItems});
+
+ GetAnnouncementDetails.fromJson(Map json) {
+ titleEN = json['Title_EN'];
+ titleAR = json['Title_AR'];
+ emailBodyEN = json['EmailBody_EN'];
+ emailBodyAR = json['EmailBody_AR'];
+ bodyEN = json['Body_EN'];
+ bodyAR = json['Body_AR'];
+ bannerImage = json['Banner_Image'];
+ rowID = json['rowID'];
+ awarenessName = json['awarenessName'];
+ created = json['created'];
+ publishedDesc = json['PublishedDesc'];
+ published = json['Published'];
+ twoLanguageTemplateDesc = json['TwoLanguageTemplateDesc'];
+ wFStatus = json['WFStatus'];
+ totalItems = json['TotalItems'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['Title_EN'] = this.titleEN;
+ data['Title_AR'] = this.titleAR;
+ data['EmailBody_EN'] = this.emailBodyEN;
+ data['EmailBody_AR'] = this.emailBodyAR;
+ data['Body_EN'] = this.bodyEN;
+ data['Body_AR'] = this.bodyAR;
+ data['Banner_Image'] = this.bannerImage;
+ data['rowID'] = this.rowID;
+ data['awarenessName'] = this.awarenessName;
+ data['created'] = this.created;
+ data['PublishedDesc'] = this.publishedDesc;
+ data['Published'] = this.published;
+ data['TwoLanguageTemplateDesc'] = this.twoLanguageTemplateDesc;
+ data['WFStatus'] = this.wFStatus;
+ data['TotalItems'] = this.totalItems;
+ return data;
+ }
+}
diff --git a/lib/models/get_announcements.dart b/lib/models/get_announcements.dart
new file mode 100644
index 0000000..05b6988
--- /dev/null
+++ b/lib/models/get_announcements.dart
@@ -0,0 +1,72 @@
+class GetAnnouncementsObject {
+ String? titleEN;
+ String? titleAR;
+ String? bannerImage;
+ String? rowID;
+ String? awarenessName;
+ String? created;
+ String? publishedDesc;
+ String? published;
+ String? twoLanguageTemplateDesc;
+ String? wFStatus;
+ String? totalItems;
+ String? emailBodyEN;
+ String? emailBodyAR;
+ String? bodyEN;
+ String? bodyAR;
+
+ GetAnnouncementsObject(
+ {this.titleEN,
+ this.titleAR,
+ this.bannerImage,
+ this.rowID,
+ this.awarenessName,
+ this.created,
+ this.publishedDesc,
+ this.published,
+ this.twoLanguageTemplateDesc,
+ this.wFStatus,
+ this.totalItems,
+ this.emailBodyEN,
+ this.emailBodyAR,
+ this.bodyEN,
+ this.bodyAR});
+
+ GetAnnouncementsObject.fromJson(Map json) {
+ titleEN = json['Title_EN'];
+ titleAR = json['Title_AR'];
+ bannerImage = json['Banner_Image'];
+ rowID = json['rowID'];
+ awarenessName = json['awarenessName'];
+ created = json['created'];
+ publishedDesc = json['PublishedDesc'];
+ published = json['Published'];
+ twoLanguageTemplateDesc = json['TwoLanguageTemplateDesc'];
+ wFStatus = json['WFStatus'];
+ totalItems = json['TotalItems'];
+ emailBodyEN = json['EmailBody_EN'];
+ emailBodyAR = json['EmailBody_AR'];
+ bodyEN = json['Body_EN'];
+ bodyAR = json['Body_AR'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['Title_EN'] = this.titleEN;
+ data['Title_AR'] = this.titleAR;
+ data['Banner_Image'] = this.bannerImage;
+ data['rowID'] = this.rowID;
+ data['awarenessName'] = this.awarenessName;
+ data['created'] = this.created;
+ data['PublishedDesc'] = this.publishedDesc;
+ data['Published'] = this.published;
+ data['TwoLanguageTemplateDesc'] = this.twoLanguageTemplateDesc;
+ data['WFStatus'] = this.wFStatus;
+ data['TotalItems'] = this.totalItems;
+ data['EmailBody_EN'] = this.emailBodyEN;
+ data['EmailBody_AR'] = this.emailBodyAR;
+ data['Body_EN'] = this.bodyEN;
+ data['Body_AR'] = this.bodyAR;
+ return data;
+ }
+}
diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart
index 354e0db..2e7757c 100644
--- a/lib/ui/landing/dashboard_screen.dart
+++ b/lib/ui/landing/dashboard_screen.dart
@@ -101,8 +101,9 @@ class _DashboardScreenState extends State {
)
],
),
- ).onPress(() {
- data.update(context);
+ ).onPress(() async {
+ // data.update(context);
+ await Navigator.pushNamed(context, AppRoutes.announcements);
})
],
).paddingOnly(left: 21, right: 21, top: 48, bottom: 7),
diff --git a/lib/ui/screens/announcements/announcement_details.dart b/lib/ui/screens/announcements/announcement_details.dart
new file mode 100644
index 0000000..a3de742
--- /dev/null
+++ b/lib/ui/screens/announcements/announcement_details.dart
@@ -0,0 +1,104 @@
+import 'dart:convert';
+
+import 'package:flutter/material.dart';
+import 'package:flutter_html/flutter_html.dart';
+import 'package:mohem_flutter_app/api/pending_transactions_api_client.dart';
+import 'package:mohem_flutter_app/classes/utils.dart';
+import 'package:mohem_flutter_app/models/get_announcement_details.dart';
+import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
+
+class AnnouncementDetails extends StatefulWidget {
+ const AnnouncementDetails({Key? key}) : super(key: key);
+
+ @override
+ _AnnouncementDetailsState createState() => _AnnouncementDetailsState();
+}
+
+class _AnnouncementDetailsState extends State {
+ String jsonResponse = "";
+ int currentPageNo = 0;
+ int rowID = 0;
+
+ GetAnnouncementDetails? getAnnouncementDetailsObj;
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ getRequestID();
+ return Scaffold(
+ backgroundColor: Colors.white,
+ appBar: AppBarWidget(
+ context,
+ title: "Announcements",
+ ),
+ body: SingleChildScrollView(
+ child: Container(
+ width: double.infinity,
+ padding: const EdgeInsets.all(10.0),
+ margin: const EdgeInsets.all(12.0),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(10),
+ boxShadow: [
+ BoxShadow(
+ color: const Color(0xff000000).withOpacity(.05),
+ blurRadius: 26,
+ offset: const Offset(0, -3),
+ ),
+ ],
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ SizedBox(
+ width: double.infinity,
+ height: 150.0,
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(10),
+ child: Image.memory(
+ base64Decode(Utils.getBase64FromJpeg(getAnnouncementDetailsObj?.bannerImage)),
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ Container(
+ margin: const EdgeInsets.only(top: 12.0),
+ child: Html(
+ data: getAnnouncementDetailsObj?.bodyEN,
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+
+ getRequestID() {
+ if (currentPageNo == 0) {
+ final arguments = (ModalRoute.of(context)?.settings.arguments ?? {}) as Map;
+ currentPageNo = arguments["currentPageNo"];
+ rowID = arguments["rowID"];
+ getAnnouncementDetails(0, rowID);
+ }
+ }
+
+ void getAnnouncementDetails(int itgAwarenessID, int itgRowID) async {
+ try {
+ Utils.showLoading(context);
+ jsonResponse = await PendingTransactionsApiClient().getAnnouncements(itgAwarenessID, currentPageNo, itgRowID);
+ var jsonDecodedData = jsonDecode(jsonDecode(jsonResponse)['result']['data']);
+ getAnnouncementDetailsObj = GetAnnouncementDetails.fromJson(jsonDecodedData[0]);
+ Utils.hideLoading(context);
+ setState(() {});
+ } catch (ex) {
+ Utils.hideLoading(context);
+ Utils.handleException(ex, context, null);
+ }
+ }
+}
diff --git a/lib/ui/screens/announcements/announcements.dart b/lib/ui/screens/announcements/announcements.dart
new file mode 100644
index 0000000..cad3a9a
--- /dev/null
+++ b/lib/ui/screens/announcements/announcements.dart
@@ -0,0 +1,168 @@
+import 'dart:convert';
+
+import 'package:flutter/material.dart';
+import 'package:mohem_flutter_app/api/pending_transactions_api_client.dart';
+import 'package:mohem_flutter_app/app_state/app_state.dart';
+import 'package:mohem_flutter_app/classes/colors.dart';
+import 'package:mohem_flutter_app/classes/utils.dart';
+import 'package:mohem_flutter_app/config/routes.dart';
+import 'package:mohem_flutter_app/extensions/int_extensions.dart';
+import 'package:mohem_flutter_app/extensions/string_extensions.dart';
+import 'package:mohem_flutter_app/models/get_announcements.dart';
+import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
+import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
+
+class Announcements extends StatefulWidget {
+ const Announcements({Key? key}) : super(key: key);
+
+ @override
+ _AnnouncementsState createState() => _AnnouncementsState();
+}
+
+class _AnnouncementsState extends State {
+ String jsonResponse = "";
+ int currentPageNo = 1;
+ int currentOpenIndex = -1;
+
+ List getAnnouncementsObject = [];
+ List _foundAnnouncements = [];
+ TextEditingController searchController = TextEditingController();
+
+ @override
+ void initState() {
+ getAnnouncements(0, 0);
+ super.initState();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ backgroundColor: Colors.white,
+ appBar: AppBarWidget(
+ context,
+ title: "Announcements",
+ ),
+ body: getAnnouncementsObject.isNotEmpty
+ ? Container(
+ margin: const EdgeInsets.only(top: 10.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ 12.height,
+ Container(
+ margin: const EdgeInsets.fromLTRB(12.0, 0.0, 12.0, 0.0),
+ child: DynamicTextFieldWidget(
+ "Search",
+ "Search Announcements",
+ isEnable: true,
+ suffixIconData: Icons.search,
+ isPopup: false,
+ lines: 1,
+ isInputTypeNum: false,
+ isReadOnly: false,
+ onChange: (String value) {
+ _runFilter(value);
+ },
+ ),
+ ),
+ 12.height,
+ Expanded(
+ child: ListView.separated(
+ physics: const BouncingScrollPhysics(),
+ shrinkWrap: true,
+ itemBuilder: (BuildContext context, int index) {
+ return InkWell(
+ onTap: () {
+ openAnnouncementsDetails(int.parse(_foundAnnouncements[index].rowID!));
+ },
+ child: Container(
+ width: double.infinity,
+ padding: const EdgeInsets.all(10.0),
+ margin: const EdgeInsets.only(left: 12, right: 12, top: 10),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(10),
+ boxShadow: [
+ BoxShadow(
+ color: const Color(0xff000000).withOpacity(.05),
+ blurRadius: 26,
+ offset: const Offset(0, -3),
+ ),
+ ],
+ ),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ SizedBox(
+ width: 80.0,
+ height: 80.0,
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(10),
+ child: Image.memory(
+ base64Decode(Utils.getBase64FromJpeg(_foundAnnouncements[index].bannerImage)),
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ 12.width,
+ SizedBox(
+ height: 80.0,
+ width: 200.0,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ AppState().isArabic(context) ? _foundAnnouncements[index].titleAR!.toText13() : getAnnouncementsObject[index].titleEN!.toText13(),
+ 8.height,
+ _foundAnnouncements[index].created!.toText10(color: MyColors.grey98Color)
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ );
+ },
+ separatorBuilder: (BuildContext context, int index) => 1.height,
+ itemCount: _foundAnnouncements.length ?? 0))
+ ],
+ ),
+ )
+ : Utils.getNoDataWidget(context),
+ );
+ }
+
+ void _runFilter(String enteredKeyword) {
+ List results = [];
+ if (enteredKeyword.isEmpty) {
+ results = getAnnouncementsObject;
+ } else {
+ results = getAnnouncementsObject.where((user) => user.titleEN!.toLowerCase().contains(enteredKeyword.toLowerCase())).toList();
+ }
+ setState(() {
+ _foundAnnouncements = results;
+ });
+ }
+
+ void getAnnouncements(int itgAwarenessID, int itgRowID) async {
+ try {
+ Utils.showLoading(context);
+ jsonResponse = await PendingTransactionsApiClient().getAnnouncements(itgAwarenessID, currentPageNo, itgRowID);
+ var jsonDecodedData = jsonDecode(jsonDecode(jsonResponse)['result']['data']);
+ for (int i = 0; i < jsonDecodedData.length; i++) {
+ getAnnouncementsObject.add(GetAnnouncementsObject.fromJson(jsonDecodedData[i]));
+ }
+ _foundAnnouncements = getAnnouncementsObject;
+ Utils.hideLoading(context);
+ setState(() {});
+ } catch (ex) {
+ Utils.hideLoading(context);
+ Utils.handleException(ex, context, null);
+ }
+ }
+
+ void openAnnouncementsDetails(int rowID) async {
+ await Navigator.pushNamed(context, AppRoutes.announcementsDetails, arguments: {"currentPageNo": currentPageNo, "rowID": rowID});
+ }
+}