Compare commits
9 Commits
andy/merge
...
andy/coba-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
050f5f25e2 | ||
|
|
8e15f91b33 | ||
|
|
73cbde7f3e | ||
|
|
01d4560df1 | ||
|
|
532a341cec | ||
|
|
157ad9a34c | ||
|
|
0691012133 | ||
|
|
674471402a | ||
|
|
3c9253c1c1 |
2
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
{
|
||||
}
|
||||
@@ -1,13 +1,9 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<application
|
||||
android:label="PettyCash"
|
||||
android:label="app_petty_cash"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/launcher_icon"
|
||||
android:usesCleartextTraffic="true"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
>
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
|
||||
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 16 KiB |
@@ -1,7 +0,0 @@
|
||||
<network-security-config>
|
||||
<base-config cleartextTrafficPermitted="true">
|
||||
<trust-anchors>
|
||||
<certificates src="system" />
|
||||
</trust-anchors>
|
||||
</base-config>
|
||||
</network-security-config>
|
||||
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1,30 +0,0 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="32" height="32" fill="#F5F5F5"/>
|
||||
<path d="M-2213 -1590C-2213 -1591.1 -2212.1 -1592 -2211 -1592H1326C1327.1 -1592 1328 -1591.1 1328 -1590V2084C1328 2085.1 1327.1 2086 1326 2086H-2211C-2212.1 2086 -2213 2085.1 -2213 2084V-1590Z" fill="#2C2C2D"/>
|
||||
<path d="M-2211 -1591H1326V-1593H-2211V-1591ZM1327 -1590V2084H1329V-1590H1327ZM1326 2085H-2211V2087H1326V2085ZM-2212 2084V-1590H-2214V2084H-2212ZM-2211 2085C-2211.55 2085 -2212 2084.55 -2212 2084H-2214C-2214 2085.66 -2212.66 2087 -2211 2087V2085ZM1327 2084C1327 2084.55 1326.55 2085 1326 2085V2087C1327.66 2087 1329 2085.66 1329 2084H1327ZM1326 -1591C1326.55 -1591 1327 -1590.55 1327 -1590H1329C1329 -1591.66 1327.66 -1593 1326 -1593V-1591ZM-2211 -1593C-2212.66 -1593 -2214 -1591.66 -2214 -1590H-2212C-2212 -1590.55 -2211.55 -1591 -2211 -1591V-1593Z" fill="black" fill-opacity="0.1"/>
|
||||
<rect width="390" height="1084" transform="translate(-44 -414)" fill="white"/>
|
||||
<g filter="url(#filter0_dd_11_141)">
|
||||
<rect x="-24" y="-28" width="350" height="145" rx="12" fill="white"/>
|
||||
<rect x="-12" y="-12" width="56" height="56" rx="8" fill="#F15A29" fill-opacity="0.08"/>
|
||||
<path d="M20 14.6666H20.0133M14.6666 20H14.68M21.3333 21.3333H21.3466M2.66663 21.3333L29.3333 29.3333L21.3333 2.66663C16.8694 3.89048 12.801 6.25514 9.52805 9.52805C6.25514 12.801 3.89048 16.8694 2.66663 21.3333Z" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.61328 22.8133C8.69531 19.2219 10.6497 15.9542 13.3019 13.3019C15.9542 10.6497 19.2219 8.69531 22.8133 7.61328" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_dd_11_141" x="-44" y="-36" width="390" height="185" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feMorphology radius="4" operator="erode" in="SourceAlpha" result="effect1_dropShadow_11_141"/>
|
||||
<feOffset dy="12"/>
|
||||
<feGaussianBlur stdDeviation="12"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.568627 0 0 0 0 0.619608 0 0 0 0 0.670588 0 0 0 0.12 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_11_141"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset/>
|
||||
<feGaussianBlur stdDeviation="1"/>
|
||||
<feComposite in2="hardAlpha" operator="out"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.568627 0 0 0 0 0.619608 0 0 0 0 0.670588 0 0 0 0.2 0"/>
|
||||
<feBlend mode="normal" in2="effect1_dropShadow_11_141" result="effect2_dropShadow_11_141"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_11_141" result="shape"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
@@ -1,5 +0,0 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M28 16V9.33333H6.66667C5.95942 9.33333 5.28115 9.05238 4.78105 8.55229C4.28095 8.05219 4 7.37391 4 6.66667C4 5.95942 4.28095 5.28115 4.78105 4.78105C5.28115 4.28095 5.95942 4 6.66667 4H25.3333V9.33333" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M4 6.66675V25.3334C4 26.0407 4.28095 26.7189 4.78105 27.219C5.28115 27.7191 5.95942 28.0001 6.66667 28.0001H28V21.3334" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M24 16C23.2928 16 22.6145 16.281 22.1144 16.781C21.6143 17.2811 21.3334 17.9594 21.3334 18.6667C21.3334 19.3739 21.6143 20.0522 22.1144 20.5523C22.6145 21.0524 23.2928 21.3333 24 21.3333H29.3334V16H24Z" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 904 B |
@@ -1,5 +0,0 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M20.0001 2.66663H12.0001C11.2637 2.66663 10.6667 3.26358 10.6667 3.99996V6.66663C10.6667 7.40301 11.2637 7.99996 12.0001 7.99996H20.0001C20.7365 7.99996 21.3334 7.40301 21.3334 6.66663V3.99996C21.3334 3.26358 20.7365 2.66663 20.0001 2.66663Z" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M13.8667 16.8C14.3971 16.2696 15.1166 15.9716 15.8667 15.9716C16.6169 15.9716 17.3363 16.2696 17.8667 16.8C18.3971 17.3304 18.6951 18.0498 18.6951 18.8C18.6951 19.5501 18.3971 20.2696 17.8667 20.8L10.6667 28L5.33337 29.3333L6.66671 24L13.8667 16.8Z" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M21.3334 5.33325H24C24.7073 5.33325 25.3856 5.6142 25.8857 6.1143C26.3858 6.6144 26.6667 7.29267 26.6667 7.99992V26.6666C26.6667 27.3738 26.3858 28.0521 25.8857 28.5522C25.3856 29.0523 24.7073 29.3333 24 29.3333H16.6667M5.33337 17.9999V7.99992C5.33337 7.29267 5.61433 6.6144 6.11442 6.1143C6.61452 5.6142 7.2928 5.33325 8.00004 5.33325H10.6667" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 775 B |
|
Before Width: | Height: | Size: 716 B |
@@ -1,4 +0,0 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M26.6666 18.6666H5.33329C3.86053 18.6666 2.66663 19.8605 2.66663 21.3333V26.6666C2.66663 28.1394 3.86053 29.3333 5.33329 29.3333H26.6666C28.1394 29.3333 29.3333 28.1394 29.3333 26.6666V21.3333C29.3333 19.8605 28.1394 18.6666 26.6666 18.6666Z" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M8.01333 24H8M13.3467 24H13.3333M20 13.3333V18.6666M23.7867 9.55997C23.2913 9.0641 22.7031 8.67072 22.0557 8.40232C21.4082 8.13392 20.7142 7.99578 20.0133 7.99578C19.3125 7.99578 18.6184 8.13392 17.971 8.40232C17.3235 8.67072 16.7353 9.0641 16.24 9.55997M27.5467 5.78664C25.5465 3.78776 22.8344 2.66492 20.0067 2.66492C17.1789 2.66492 14.4669 3.78776 12.4667 5.78664" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 898 B |
|
Before Width: | Height: | Size: 599 B |
@@ -1,3 +0,0 @@
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2.66663 29.3333L6.66663 25.3333M9.99996 18L13.3333 14.6667M14 22L17.3333 18.6667M24 4L18.6666 9.33333H26.6666L21.3333 14.6667M8.39996 27.0667C8.69725 27.365 9.05051 27.6017 9.43947 27.7632C9.82844 27.9247 10.2455 28.0079 10.6666 28.0079C11.0878 28.0079 11.5048 27.9247 11.8938 27.7632C12.2827 27.6017 12.636 27.365 12.9333 27.0667L16 24L7.99996 16L4.93329 19.0667C4.63497 19.364 4.39826 19.7172 4.23675 20.1062C4.07524 20.4951 3.9921 20.9122 3.9921 21.3333C3.9921 21.7545 4.07524 22.1715 4.23675 22.5605C4.39826 22.9495 4.63497 23.3027 4.93329 23.6L8.39996 27.0667Z" stroke="#F15A29" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 763 B |
|
Before Width: | Height: | Size: 407 B |
|
Before Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 984 B After Width: | Height: | Size: 295 B |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 282 B |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 704 B |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 586 B |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 762 B |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 1.4 KiB |
@@ -15,13 +15,8 @@ class Constant {
|
||||
// static String baseUrl = "https://devregonline.pramita.co.id/one-api/xdoc/";
|
||||
|
||||
// tester devbandungraya
|
||||
static String baseUrlDevoneReport = "devone.aplikasi.web.id";
|
||||
|
||||
static String baseUrlDevone =
|
||||
"https://devone.aplikasi.web.id/one-api-pettycash/pettycash/";
|
||||
// "http://devone.aplikasi.web.id/one-api-pettycash/pettycash/";
|
||||
static String baseUrlFile =
|
||||
"https://devone.aplikasi.web.id/pettycash-media/attachment/";
|
||||
"http://devone.aplikasi.web.id/one-api-pettycash/pettycash/";
|
||||
|
||||
// static String baseUrl_appdoctor =
|
||||
// "http://devbandungraya.aplikasi.web.id/one-api/app_doctor/";
|
||||
@@ -265,18 +260,6 @@ class Constant {
|
||||
// background upload file
|
||||
static Color bgUploadFile = Color.fromRGBO(207, 207, 207, 0.20);
|
||||
|
||||
// background icon history
|
||||
static Color bgIconHistory = Color.fromRGBO(241, 90, 41, 0.16);
|
||||
|
||||
// background chip confirmed
|
||||
static Color bgChipConfirmed = Color(0xffe8f4f5);
|
||||
|
||||
static Color bgTextChipConfirmed = Color(0xff32827C);
|
||||
|
||||
// delete text
|
||||
static Color bgTextDelete = Color(0xffFF4842);
|
||||
static Color bgTextChipDelete = Color.fromRGBO(255, 72, 66, 0.12);
|
||||
|
||||
//typoGraphy
|
||||
static TextStyle titleH1Login({required BuildContext context}) {
|
||||
return TextStyle(
|
||||
@@ -285,13 +268,6 @@ class Constant {
|
||||
);
|
||||
}
|
||||
|
||||
static TextStyle titleH6_700({required BuildContext context}) {
|
||||
return TextStyle(
|
||||
fontSize: Constant.getActualYPhone(context: context, y: 18),
|
||||
fontWeight: FontWeight.w700,
|
||||
);
|
||||
}
|
||||
|
||||
static TextStyle titleH3_700({required BuildContext context}) {
|
||||
return TextStyle(
|
||||
fontSize: Constant.getActualYPhone(context: context, y: 24),
|
||||
@@ -363,13 +339,6 @@ class Constant {
|
||||
);
|
||||
}
|
||||
|
||||
static TextStyle H4_700V3({required BuildContext context}) {
|
||||
return TextStyle(
|
||||
fontSize: Constant.getActualYPhone(context: context, y: 16),
|
||||
fontWeight: FontWeight.w700,
|
||||
);
|
||||
}
|
||||
|
||||
static TextStyle titleH5({required BuildContext context}) {
|
||||
return TextStyle(
|
||||
fontSize: Constant.getActualYPhone(context: context, y: 18),
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
import '../screen/change_company/change_company.dart';
|
||||
import 'package:app_petty_cash/screen/camera/coba_camera.dart';
|
||||
import 'package:app_petty_cash/screen/camera/example.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../screen/home/home_screen.dart';
|
||||
import '../screen/transaksi/history_transaksi_screen.dart';
|
||||
import '../screen/transaksi/transaksi_screen.dart';
|
||||
import '../screen/login/login_screen.dart';
|
||||
import '../screen/splash/splash_screen.dart';
|
||||
@@ -19,8 +17,6 @@ const homeRoute = "/homeRoute";
|
||||
const transaksiRoute = "/transaksiRoute";
|
||||
const userRoute = "/userRoute";
|
||||
const reportRoute = "/reportRoute";
|
||||
const changeCompanyRoute = "/changeCompanyRoute";
|
||||
const historyTransaksiRoute = "/historyTransaksiRoute";
|
||||
const cameraExampleRoute = "/cameraExampleRoute";
|
||||
const cobaCameraRoute = "/cobaCameraRoute";
|
||||
|
||||
@@ -42,32 +38,6 @@ class AppRoute {
|
||||
});
|
||||
}
|
||||
|
||||
// change Company
|
||||
if (settings.name == changeCompanyRoute) {
|
||||
return MaterialPageRoute(builder: (context) {
|
||||
return MediaQuery(
|
||||
data: MediaQuery.of(context).copyWith(
|
||||
textScaleFactor: 1.0,
|
||||
padding: EdgeInsets.all(0),
|
||||
),
|
||||
child: ChangeCompanyScreen(),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// history transaksi
|
||||
if (settings.name == historyTransaksiRoute) {
|
||||
return MaterialPageRoute(builder: (context) {
|
||||
return MediaQuery(
|
||||
data: MediaQuery.of(context).copyWith(
|
||||
textScaleFactor: 1.0,
|
||||
padding: EdgeInsets.all(0),
|
||||
),
|
||||
child: HistoryTransaksiScreen(),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// report screen
|
||||
if (settings.name == reportRoute) {
|
||||
return MaterialPageRoute(builder: (context) {
|
||||
|
||||
@@ -2,12 +2,10 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:intl/date_symbol_data_local.dart';
|
||||
import 'app/route.dart';
|
||||
|
||||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
initializeDateFormatting();
|
||||
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
|
||||
statusBarIconBrightness:
|
||||
Brightness.dark, // this will change the brightness of the icons
|
||||
@@ -40,8 +38,8 @@ class MyApp extends StatelessWidget {
|
||||
},
|
||||
),
|
||||
debugShowCheckedModeBanner: false,
|
||||
// initialRoute: loginRoute,
|
||||
initialRoute: splashScreen,
|
||||
initialRoute: loginRoute,
|
||||
// initialRoute: splashScreen,
|
||||
// initialRoute: transaksiRoute,
|
||||
// initialRoute: reportRoute,
|
||||
// initialRoute: testFilePickerRoute,
|
||||
|
||||
@@ -25,8 +25,8 @@ class AuthDoctorModel {
|
||||
late String M_UserID;
|
||||
late String M_UserUsername;
|
||||
late String M_UserEmail;
|
||||
late String M_CompanyID;
|
||||
late String M_CompanyName;
|
||||
// late String M_UserM_DoctorCode;
|
||||
// late String M_UserM_DoctorID;
|
||||
// late String M_UserM_StaffID;
|
||||
// late String M_UserM_MouID;
|
||||
late String ip;
|
||||
@@ -39,8 +39,8 @@ class AuthDoctorModel {
|
||||
required this.M_UserID,
|
||||
required this.M_UserUsername,
|
||||
required this.M_UserEmail,
|
||||
required this.M_CompanyID,
|
||||
required this.M_CompanyName,
|
||||
// required this.M_UserM_DoctorCode,
|
||||
// required this.M_UserM_DoctorID,
|
||||
// this.M_UserM_StaffID = "",
|
||||
// this.M_UserM_MouID = "",
|
||||
this.ip = "",
|
||||
@@ -51,8 +51,8 @@ class AuthDoctorModel {
|
||||
M_UserID = json['M_UserID'].toString();
|
||||
M_UserUsername = json['M_UserUsername'].toString();
|
||||
M_UserEmail = json['M_UserEmail'].toString();
|
||||
M_CompanyID = json['M_CompanyID'].toString();
|
||||
M_CompanyName = json['M_CompanyName'].toString();
|
||||
// M_UserM_DoctorCode = json['M_UserM_DoctorCode'].toString();
|
||||
// M_UserM_DoctorID = json['M_UserM_DoctorID'].toString();
|
||||
// M_UserM_StaffID = json['M_UserM_StaffID'].toString();
|
||||
// M_UserM_MouID = json['M_UserM_MouID'].toString();
|
||||
ip = json['ip'].toString();
|
||||
@@ -64,8 +64,8 @@ class AuthDoctorModel {
|
||||
data['M_UserID'] = M_UserID;
|
||||
data['M_UserUsername'] = M_UserUsername;
|
||||
data['M_UserEmail'] = M_UserEmail;
|
||||
data['M_CompanyID'] = M_CompanyID;
|
||||
data['M_CompanyName'] = M_CompanyName;
|
||||
// data['M_UserM_DoctorCode'] = M_UserM_DoctorCode;
|
||||
// data['M_UserM_DoctorID'] = M_UserM_DoctorID;
|
||||
// data['M_UserM_StaffID'] = M_UserM_StaffID;
|
||||
// data['M_UserM_MouID'] = M_UserM_MouID;
|
||||
data['ip'] = ip;
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
class HistoryTransaksiModel {
|
||||
String? id;
|
||||
String? tanggaltransaksi;
|
||||
String? tipe;
|
||||
String? kategoriid;
|
||||
String? kategoriname;
|
||||
String? note;
|
||||
String? amount;
|
||||
String? sender;
|
||||
String? imgurl;
|
||||
String? isconfirm;
|
||||
String? tanggalconfirm;
|
||||
String? usertransaksi;
|
||||
String? userconfirm;
|
||||
|
||||
HistoryTransaksiModel(
|
||||
{this.id,
|
||||
this.tanggaltransaksi,
|
||||
this.tipe,
|
||||
this.kategoriid,
|
||||
this.kategoriname,
|
||||
this.note,
|
||||
this.amount,
|
||||
this.sender,
|
||||
this.imgurl,
|
||||
this.isconfirm,
|
||||
this.tanggalconfirm,
|
||||
this.usertransaksi,
|
||||
this.userconfirm});
|
||||
|
||||
HistoryTransaksiModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
tanggaltransaksi = json['tanggaltransaksi'];
|
||||
tipe = json['tipe'];
|
||||
kategoriid = json['kategoriid'];
|
||||
kategoriname = json['kategoriname'];
|
||||
note = json['note'];
|
||||
amount = json['amount'];
|
||||
sender = json['sender'];
|
||||
imgurl = json['imgurl'];
|
||||
isconfirm = json['isconfirm'];
|
||||
tanggalconfirm = json['tanggalconfirm'];
|
||||
usertransaksi = json['usertransaksi'];
|
||||
userconfirm = json['userconfirm'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['id'] = this.id;
|
||||
data['tanggaltransaksi'] = this.tanggaltransaksi;
|
||||
data['tipe'] = this.tipe;
|
||||
data['kategoriid'] = this.kategoriid;
|
||||
data['kategoriname'] = this.kategoriname;
|
||||
data['note'] = this.note;
|
||||
data['amount'] = this.amount;
|
||||
data['sender'] = this.sender;
|
||||
data['imgurl'] = this.imgurl;
|
||||
data['isconfirm'] = this.isconfirm;
|
||||
data['tanggalconfirm'] = this.tanggalconfirm;
|
||||
data['usertransaksi'] = this.usertransaksi;
|
||||
data['userconfirm'] = this.userconfirm;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
class InfoAccountBalanceModel {
|
||||
String? totalAll;
|
||||
String? kredit;
|
||||
String? debit;
|
||||
|
||||
InfoAccountBalanceModel({this.totalAll, this.kredit, this.debit});
|
||||
|
||||
InfoAccountBalanceModel.fromJson(Map<String, dynamic> json) {
|
||||
totalAll = json['total_all'];
|
||||
kredit = json['kredit'];
|
||||
debit = json['debit'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['total_all'] = this.totalAll;
|
||||
data['kredit'] = this.kredit;
|
||||
data['debit'] = this.debit;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
class ListTransaksiHomeModel {
|
||||
String? id;
|
||||
String? tanggaltransaksi;
|
||||
String? tipe;
|
||||
String? kategoriid;
|
||||
String? kategoriname;
|
||||
String? note;
|
||||
String? amount;
|
||||
String? sender;
|
||||
String? imgurl;
|
||||
String? isconfirm;
|
||||
String? tanggalconfirm;
|
||||
String? usertransaksi;
|
||||
String? userconfirm;
|
||||
|
||||
ListTransaksiHomeModel(
|
||||
{this.id,
|
||||
this.tanggaltransaksi,
|
||||
this.tipe,
|
||||
this.kategoriid,
|
||||
this.kategoriname,
|
||||
this.note,
|
||||
this.amount,
|
||||
this.sender,
|
||||
this.imgurl,
|
||||
this.isconfirm,
|
||||
this.tanggalconfirm,
|
||||
this.usertransaksi,
|
||||
this.userconfirm});
|
||||
|
||||
ListTransaksiHomeModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
tanggaltransaksi = json['tanggaltransaksi'];
|
||||
tipe = json['tipe'];
|
||||
kategoriid = json['kategoriid'];
|
||||
kategoriname = json['kategoriname'];
|
||||
note = json['note'];
|
||||
amount = json['amount'];
|
||||
sender = json['sender'];
|
||||
imgurl = json['imgurl'];
|
||||
isconfirm = json['isconfirm'];
|
||||
tanggalconfirm = json['tanggalconfirm'];
|
||||
usertransaksi = json['usertransaksi'];
|
||||
userconfirm = json['userconfirm'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['id'] = this.id;
|
||||
data['tanggaltransaksi'] = this.tanggaltransaksi;
|
||||
data['tipe'] = this.tipe;
|
||||
data['kategoriid'] = this.kategoriid;
|
||||
data['kategoriname'] = this.kategoriname;
|
||||
data['note'] = this.note;
|
||||
data['amount'] = this.amount;
|
||||
data['sender'] = this.sender;
|
||||
data['imgurl'] = this.imgurl;
|
||||
data['isconfirm'] = this.isconfirm;
|
||||
data['tanggalconfirm'] = this.tanggalconfirm;
|
||||
data['usertransaksi'] = this.usertransaksi;
|
||||
data['userconfirm'] = this.userconfirm;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../model/info_account_balance.dart';
|
||||
|
||||
final currentInfoAccountBalanceProvider = StateProvider<InfoAccountBalanceModel>(
|
||||
((ref) => InfoAccountBalanceModel(
|
||||
debit: "0",
|
||||
kredit: "0",
|
||||
totalAll: "0",
|
||||
)),
|
||||
);
|
||||
@@ -1,7 +1,3 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../app/constant.dart';
|
||||
import '../model/auth_model.dart';
|
||||
import 'base_repository.dart';
|
||||
@@ -23,8 +19,6 @@ class AuthRepository extends BaseRepository {
|
||||
// "doctor_id": "2891",
|
||||
// "password": "3"
|
||||
};
|
||||
|
||||
print(param);
|
||||
// final service = "${Constant.baseUrlDevone}xauth/login";
|
||||
final service = "${Constant.baseUrlDevone}auth/login";
|
||||
print('url login $service');
|
||||
@@ -88,7 +82,7 @@ class AuthRepository extends BaseRepository {
|
||||
// model: AuthDoctorModel.fromJson(resp["data"]["user"]),
|
||||
// );
|
||||
// return result;
|
||||
|
||||
|
||||
if (resp["status"] == "OK") {
|
||||
return resp['message'];
|
||||
} else {
|
||||
|
||||
@@ -2,33 +2,11 @@ import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../app/constant.dart';
|
||||
|
||||
abstract class BaseRepository {
|
||||
final Dio dio;
|
||||
BaseRepository({required this.dio});
|
||||
|
||||
Future<String> getCompanyID() async {
|
||||
final shared = await SharedPreferences.getInstance();
|
||||
String M_CompanyID = "0";
|
||||
|
||||
if (shared != null) {
|
||||
final bearerString = shared.get(Constant.bearerName).toString();
|
||||
final xmodel = jsonDecode(bearerString);
|
||||
if (xmodel != null) {
|
||||
M_CompanyID = xmodel["model"]["M_CompanyID"];
|
||||
}
|
||||
}
|
||||
|
||||
if (M_CompanyID == "0") {
|
||||
throw BaseRepositoryException(message: 'Invalid Company ID');
|
||||
}
|
||||
|
||||
return M_CompanyID;
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> post({
|
||||
required Map<String, dynamic> param,
|
||||
required String service,
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
import 'package:app_petty_cash/model/list_type_model.dart';
|
||||
|
||||
import '../app/constant.dart';
|
||||
import '../model/info_account_balance.dart';
|
||||
import '../model/list_transaksi_model.dart';
|
||||
import 'base_repository.dart';
|
||||
|
||||
class HomeRepository extends BaseRepository {
|
||||
HomeRepository({required super.dio});
|
||||
|
||||
// list transaksi home
|
||||
Future<List<ListTransaksiHomeModel>> getTransaksiListHome(
|
||||
String companyid,
|
||||
) async {
|
||||
final service =
|
||||
"${Constant.baseUrlDevone}homescreen/list_transaction/?companyid=$companyid";
|
||||
final resp = await get(
|
||||
// param: {
|
||||
// "": "",
|
||||
// },
|
||||
service: service,
|
||||
);
|
||||
|
||||
print("url list transaksi home : $service");
|
||||
|
||||
final result = List<ListTransaksiHomeModel>.empty(growable: true);
|
||||
resp['data'].forEach((e) {
|
||||
final model = ListTransaksiHomeModel.fromJson(e);
|
||||
result.add(model);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
// info account balance
|
||||
Future<InfoAccountBalanceModel> getInfoAccountBalance(
|
||||
String companyid,
|
||||
) async {
|
||||
final service =
|
||||
"${Constant.baseUrlDevone}homescreen/list_total/?companyid=$companyid";
|
||||
final resp = await get(
|
||||
// param: {
|
||||
// "": "",
|
||||
// },
|
||||
service: service,
|
||||
);
|
||||
|
||||
print("url card info account balance home : $service");
|
||||
|
||||
InfoAccountBalanceModel result = InfoAccountBalanceModel(
|
||||
debit: "0",
|
||||
kredit: "0",
|
||||
totalAll: "0",
|
||||
);
|
||||
|
||||
print(resp['data']);
|
||||
|
||||
final model = InfoAccountBalanceModel.fromJson(resp['data']);
|
||||
result = model;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,6 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:app_petty_cash/model/list_type_model.dart';
|
||||
|
||||
import '../app/constant.dart';
|
||||
import '../model/history_transaksi_model.dart';
|
||||
import '../model/list_category_model.dart';
|
||||
import 'base_repository.dart';
|
||||
|
||||
@@ -59,88 +56,23 @@ class TransaksiRepository extends BaseRepository {
|
||||
String catatan,
|
||||
String userid,
|
||||
String sender,
|
||||
String base64file,
|
||||
String fileName,
|
||||
String fileSize,
|
||||
String fileExtension,
|
||||
String url) async {
|
||||
// String paramPostInUrl = "";
|
||||
Map<String, dynamic> prm = {};
|
||||
String M_CompanyID = await getCompanyID();
|
||||
if (tipe == "DEBIT") {
|
||||
String paramPostInUrl = "";
|
||||
if (tipe == "KREDIT") {
|
||||
sender = "";
|
||||
prm = {
|
||||
'tanggal': tanggal,
|
||||
'tipe': tipe,
|
||||
'kategoriid': kategoriid,
|
||||
'jumlah': jumlah,
|
||||
'catatan': catatan,
|
||||
'url': url,
|
||||
'userid': userid,
|
||||
'sender': sender,
|
||||
'companyid': M_CompanyID,
|
||||
'base64File': base64file,
|
||||
'fileName': fileName,
|
||||
'fileSize': fileSize,
|
||||
'fileEkstension': fileExtension
|
||||
};
|
||||
|
||||
// paramPostInUrl =
|
||||
// "?tanggal=$tanggal&tipe=$tipe&kategoriid=$kategoriid&jumlah=$jumlah&catatan=$catatan&url=$url&userid=$userid&sender=$sender";
|
||||
paramPostInUrl =
|
||||
"?tanggal=$tanggal&tipe=$tipe&kategoriid=$kategoriid&jumlah=$jumlah&catatan=$catatan&url=$url&userid=$userid&sender=$sender";
|
||||
} else {
|
||||
if (tipe == "KREDIT") {
|
||||
if (tipe == "DEBIT") {
|
||||
kategoriid = "0";
|
||||
prm = {
|
||||
'tanggal': tanggal,
|
||||
'tipe': tipe,
|
||||
'kategoriid': kategoriid,
|
||||
'jumlah': jumlah,
|
||||
'catatan': catatan,
|
||||
'url': url,
|
||||
'userid': userid,
|
||||
'sender': sender,
|
||||
'companyid': M_CompanyID,
|
||||
'fileName': fileName,
|
||||
'fileSize': fileSize,
|
||||
'fileEkstension': fileExtension
|
||||
};
|
||||
// paramPostInUrl =
|
||||
// "?tanggal=$tanggal&tipe=$tipe&kategoriid=$kategoriid&jumlah=$jumlah&catatan=$catatan&url=$url&userid=$userid&sender=$sender";
|
||||
paramPostInUrl =
|
||||
"?tanggal=$tanggal&tipe=$tipe&kategoriid=$kategoriid&jumlah=$jumlah&catatan=$catatan&url=$url&userid=$userid&sender=$sender";
|
||||
}
|
||||
}
|
||||
|
||||
// paramPostInUrl += "&companyid=$M_CompanyID";
|
||||
// /?tanggal=2023-12-29&tipe=KREDIT&kategoriid=3&jumlah=5000&catatan=Lakban%20Besar&url=&userid=1&sender=
|
||||
|
||||
final service = "${Constant.baseUrlDevone}transaction/addtransaction";
|
||||
final resp = await post(
|
||||
// param: {
|
||||
// "": "",
|
||||
// },
|
||||
service: service,
|
||||
param: prm);
|
||||
|
||||
print("prm insert transaksi : ${jsonEncode(prm)}");
|
||||
|
||||
// final result = List<ListCategory>.empty(growable: true);
|
||||
// resp['data'].forEach((e) {
|
||||
// final model = ListCategory.fromJson(e);
|
||||
// result.add(model);
|
||||
// });
|
||||
|
||||
return resp['status'];
|
||||
}
|
||||
|
||||
// list history transaksi
|
||||
Future<List<HistoryTransaksiModel>> getListHistoryTransaksi(
|
||||
String companyid,
|
||||
String tglAwal,
|
||||
String tglAkhir,
|
||||
String categoryid,
|
||||
) async {
|
||||
final service =
|
||||
"${Constant.baseUrlDevone}/homescreen/list_transaction/?companyid=$companyid&startdate=$tglAwal&enddate=$tglAkhir&kategoriid=$categoryid";
|
||||
// https://devone.aplikasi.web.id/one-api-pettycash/pettycash/history/list_transaction/?companyid=1&startdate=2023-12-01&enddate=2023-12-30&kategoriid=0
|
||||
"${Constant.baseUrlDevone}transaction/addtransaction/$paramPostInUrl";
|
||||
final resp = await get(
|
||||
// param: {
|
||||
// "": "",
|
||||
@@ -148,31 +80,7 @@ class TransaksiRepository extends BaseRepository {
|
||||
service: service,
|
||||
);
|
||||
|
||||
print("url list history transaksi : $service");
|
||||
|
||||
final result = List<HistoryTransaksiModel>.empty(growable: true);
|
||||
resp['data'].forEach((e) {
|
||||
final model = HistoryTransaksiModel.fromJson(e);
|
||||
result.add(model);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
// delete transaksi
|
||||
Future<String> deleteTransaksi(
|
||||
String id,
|
||||
String userid,
|
||||
) async {
|
||||
final service =
|
||||
"${Constant.baseUrlDevone}transaction/deletetransaction/?id=$id&userid=$userid";
|
||||
final resp = await get(
|
||||
// param: {
|
||||
// "": "",
|
||||
// },
|
||||
service: service,
|
||||
);
|
||||
|
||||
print("url delete transaksi : $service");
|
||||
print("url insert transaksi : $service");
|
||||
|
||||
// final result = List<ListCategory>.empty(growable: true);
|
||||
// resp['data'].forEach((e) {
|
||||
@@ -180,10 +88,6 @@ class TransaksiRepository extends BaseRepository {
|
||||
// result.add(model);
|
||||
// });
|
||||
|
||||
if (resp['status'] != "OK") {
|
||||
return resp['message'];
|
||||
}
|
||||
|
||||
return resp['status'];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
|
||||
import '../../app/constant.dart';
|
||||
import '../../app/route.dart';
|
||||
import '../../provider/current_user_provider.dart';
|
||||
import '../../widget/custom_drawer.dart';
|
||||
|
||||
class ChangeCompanyScreen extends HookConsumerWidget {
|
||||
const ChangeCompanyScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
useEffect(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
||||
final userID = ref.read(currentUserProvider)?.model.M_UserID ?? "0";
|
||||
if (userID == "0") {
|
||||
//not login
|
||||
Navigator.of(context)
|
||||
.pushNamedAndRemoveUntil(loginRoute, (route) => true);
|
||||
|
||||
// Navigator.popAndPushNamed(context, loginRoute);
|
||||
return;
|
||||
}
|
||||
});
|
||||
return () {};
|
||||
}, []);
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: Constant.getActualYPhone(context: context, y: 30),
|
||||
),
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
// centerTitle: true,
|
||||
title: Text(
|
||||
'Change Company',
|
||||
style: TextStyle(color: Constant.textWhite),
|
||||
),
|
||||
backgroundColor: Constant.pcBtnBackgroundColor,
|
||||
iconTheme: IconThemeData(
|
||||
color: Constant.textWhite,
|
||||
),
|
||||
),
|
||||
drawer: CustomDrawer(),
|
||||
body: Text('Under Construction'),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,34 +1,17 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:app_petty_cash/screen/home/info_account_balance_provider.dart';
|
||||
import 'package:app_petty_cash/screen/home/list_transaksi_home_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../../app/constant.dart';
|
||||
import '../../app/route.dart';
|
||||
import '../../model/info_account_balance.dart';
|
||||
import '../../model/list_transaksi_model.dart';
|
||||
import '../../provider/current_info_account_balance_provider.dart';
|
||||
import '../../provider/current_user_provider.dart';
|
||||
import '../../widget/custom_drawer.dart';
|
||||
import '../../widget/history_row_atas_widget.dart';
|
||||
import '../../widget/sankbar_widget.dart';
|
||||
|
||||
class HomeScreen extends HookConsumerWidget {
|
||||
const HomeScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final M_CompanyID = useState<String>("0");
|
||||
final searchTransaksiHomeLoading = useState<bool>(false);
|
||||
final infoAccountBalanceHomeLoading = useState<bool>(false);
|
||||
final listTransaksiHome = useState<List<ListTransaksiHomeModel>>(
|
||||
List.empty(growable: true),
|
||||
);
|
||||
|
||||
useEffect(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
||||
final userID = ref.read(currentUserProvider)?.model.M_UserID ?? "0";
|
||||
@@ -44,80 +27,6 @@ class HomeScreen extends HookConsumerWidget {
|
||||
return () {};
|
||||
}, []);
|
||||
|
||||
Future<String> getCompanyID() async {
|
||||
final shared = await SharedPreferences.getInstance();
|
||||
String M_CompanyID = "0";
|
||||
|
||||
if (shared != null) {
|
||||
final bearerString = shared.get(Constant.bearerName).toString();
|
||||
final xmodel = jsonDecode(bearerString);
|
||||
if (xmodel != null) {
|
||||
M_CompanyID = xmodel["model"]["M_CompanyID"];
|
||||
}
|
||||
}
|
||||
|
||||
if (M_CompanyID == "0") {
|
||||
// throw BaseRepositoryException(message: 'Invalid Company ID');
|
||||
}
|
||||
|
||||
return M_CompanyID;
|
||||
}
|
||||
|
||||
useEffect(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
||||
M_CompanyID.value = await getCompanyID();
|
||||
// info account balance
|
||||
ref
|
||||
.read(infoAccountBalanceHomeProvider.notifier)
|
||||
.infoAccountBalanceHome(M_CompanyID.value);
|
||||
});
|
||||
return () {};
|
||||
}, []);
|
||||
|
||||
// read provider home
|
||||
ref.listen(
|
||||
listTransaksiHomeProvider,
|
||||
(previous, next) {
|
||||
if (next is ListTransaksiHomeStateLoading) {
|
||||
searchTransaksiHomeLoading.value = true;
|
||||
} else if (next is ListTransaksiHomeStateError) {
|
||||
// print(next.message);
|
||||
searchTransaksiHomeLoading.value = false;
|
||||
SanckbarWidget(context, next.message, snackbarType.error);
|
||||
} else if (next is ListTransaksiHomeStateDone) {
|
||||
// print(jsonEncode(next.model));
|
||||
// print(next.model.length);
|
||||
listTransaksiHome.value = next.model;
|
||||
searchTransaksiHomeLoading.value = false;
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
// read provider info account balance
|
||||
ref.listen(
|
||||
infoAccountBalanceHomeProvider,
|
||||
(previous, next) {
|
||||
if (next is InfoAccountBalanceHomeStateLoading) {
|
||||
infoAccountBalanceHomeLoading.value = true;
|
||||
} else if (next is InfoAccountBalanceHomeStateError) {
|
||||
// print(next.message);
|
||||
infoAccountBalanceHomeLoading.value = false;
|
||||
SanckbarWidget(context, next.message, snackbarType.error);
|
||||
} else if (next is InfoAccountBalanceHomeStateDone) {
|
||||
// print(jsonEncode(next.model));
|
||||
// print(next.model.length);
|
||||
// infoAccountBalanceObject.value = next.model;
|
||||
ref.read(currentInfoAccountBalanceProvider.notifier).state =
|
||||
InfoAccountBalanceModel(
|
||||
kredit: next.model.kredit,
|
||||
debit: next.model.debit,
|
||||
totalAll: next.model.totalAll,
|
||||
);
|
||||
infoAccountBalanceHomeLoading.value = false;
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: Constant.getActualYPhone(context: context, y: 30),
|
||||
@@ -135,258 +44,8 @@ class HomeScreen extends HookConsumerWidget {
|
||||
),
|
||||
drawer: CustomDrawer(),
|
||||
body: SafeArea(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: Constant.getActualYPhone(context: context, y: 36),
|
||||
left: Constant.getActualXPhone(context: context, x: 34),
|
||||
right: Constant.getActualXPhone(context: context, x: 34),
|
||||
),
|
||||
child: RefreshIndicator(
|
||||
onRefresh: () async {
|
||||
ref
|
||||
.read(infoAccountBalanceHomeProvider.notifier)
|
||||
.infoAccountBalanceHome(M_CompanyID.value);
|
||||
},
|
||||
child: Container(
|
||||
width: Constant.getActualXPhone(context: context, x: 390),
|
||||
height: Constant.getActualYPhone(context: context, y: 844),
|
||||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
width: Constant.getActualXPhone(context: context, x: 332),
|
||||
height:
|
||||
Constant.getActualYPhone(context: context, y: 173),
|
||||
decoration: BoxDecoration(
|
||||
// color: Colors.black12,
|
||||
borderRadius: BorderRadius.circular(20),
|
||||
image: DecorationImage(
|
||||
image: AssetImage('images/background_card.png'),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Color.fromRGBO(145, 158, 171, 0.16),
|
||||
offset: Offset(0, 24),
|
||||
blurRadius: 48,
|
||||
),
|
||||
],
|
||||
),
|
||||
//Isi Card
|
||||
child: (infoAccountBalanceHomeLoading.value)
|
||||
? Center(
|
||||
child: CircularProgressIndicator(),
|
||||
)
|
||||
: Container(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
// Text1 & Text2
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: Constant.getActualYPhone(
|
||||
context: context, y: 17),
|
||||
left: Constant.getActualXPhone(
|
||||
context: context, x: 81),
|
||||
right: Constant.getActualXPhone(
|
||||
context: context, x: 81),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
'Account Balance',
|
||||
style: Constant.body1(
|
||||
context: context)
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Constant.textWhite),
|
||||
),
|
||||
Text(
|
||||
ref
|
||||
.watch(
|
||||
currentInfoAccountBalanceProvider)
|
||||
.totalAll
|
||||
.toString(),
|
||||
style: Constant.H4_700V3(
|
||||
context: context)
|
||||
.copyWith(
|
||||
color: Constant.textWhite,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 27),
|
||||
),
|
||||
|
||||
//Debit dan Kredit
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
// Spasi di sebelah kiri "Check In"
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: Constant.getActualXPhone(
|
||||
context: context, x: 20),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
'Debit',
|
||||
style: Constant.body1(
|
||||
context: context)
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight.w400,
|
||||
color:
|
||||
Constant.textWhite),
|
||||
),
|
||||
Text(
|
||||
ref
|
||||
.watch(
|
||||
currentInfoAccountBalanceProvider)
|
||||
.debit
|
||||
.toString(),
|
||||
style: Constant.H4_700V3(
|
||||
context: context)
|
||||
.copyWith(
|
||||
color:
|
||||
Constant.textWhite),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
// SizedBox(
|
||||
// width: Constant.getActualXPhone(
|
||||
// context: context, x: 51),
|
||||
// ),
|
||||
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
right: Constant.getActualXPhone(
|
||||
context: context, x: 28),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
'Credit',
|
||||
style: Constant.body1(
|
||||
context: context)
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight.w400,
|
||||
color:
|
||||
Constant.textWhite),
|
||||
),
|
||||
Text(
|
||||
ref
|
||||
.watch(
|
||||
currentInfoAccountBalanceProvider)
|
||||
.kredit
|
||||
.toString(),
|
||||
style: Constant.H4_700V3(
|
||||
context: context)
|
||||
.copyWith(
|
||||
color:
|
||||
Constant.textWhite),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 17),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 44),
|
||||
),
|
||||
|
||||
Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
'Transaksi Terkini',
|
||||
style: Constant.titleH5_600(context: context)
|
||||
.copyWith(color: Constant.textBlack),
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 24),
|
||||
),
|
||||
|
||||
// list transaksi
|
||||
(searchTransaksiHomeLoading.value)
|
||||
? Center(
|
||||
child: CircularProgressIndicator(),
|
||||
)
|
||||
: Container(
|
||||
child: Expanded(
|
||||
child: ListView.builder(
|
||||
itemCount: listTransaksiHome.value.length,
|
||||
itemBuilder: (context, idx) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(
|
||||
bottom: Constant.getActualYPhone(
|
||||
context: context,
|
||||
y: 10,
|
||||
),
|
||||
),
|
||||
child: Card(
|
||||
elevation: 2.0,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(10),
|
||||
child: Column(
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
// atas
|
||||
HistoryRowAtasWidget(
|
||||
icon_category_id:
|
||||
listTransaksiHome
|
||||
.value[idx].kategoriid
|
||||
.toString(),
|
||||
icon_category_name:
|
||||
listTransaksiHome
|
||||
.value[idx].kategoriname
|
||||
.toString(),
|
||||
amount: listTransaksiHome
|
||||
.value[idx].amount
|
||||
.toString(),
|
||||
tglTransaksi: listTransaksiHome
|
||||
.value[idx].tanggaltransaksi
|
||||
.toString(),
|
||||
tipe: listTransaksiHome
|
||||
.value[idx].tipe
|
||||
.toString(),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
child: Center(
|
||||
child: Text('Home Screen Content'),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
import 'package:app_petty_cash/provider/current_info_account_balance_provider.dart';
|
||||
import 'package:app_petty_cash/repository/home_repository.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../model/info_account_balance.dart';
|
||||
import '../../provider/dio_provider.dart';
|
||||
import '../../repository/base_repository.dart';
|
||||
import 'list_transaksi_home_provider.dart';
|
||||
|
||||
abstract class InfoAccountBalanceHomeState extends Equatable {
|
||||
final DateTime date;
|
||||
const InfoAccountBalanceHomeState(this.date);
|
||||
@override
|
||||
List<Object?> get props => [date];
|
||||
}
|
||||
|
||||
class InfoAccountBalanceHomeStateInit extends InfoAccountBalanceHomeState {
|
||||
InfoAccountBalanceHomeStateInit() : super(DateTime.now());
|
||||
}
|
||||
|
||||
class InfoAccountBalanceHomeStateLoading extends InfoAccountBalanceHomeState {
|
||||
InfoAccountBalanceHomeStateLoading() : super(DateTime.now());
|
||||
}
|
||||
|
||||
class InfoAccountBalanceHomeStateError extends InfoAccountBalanceHomeState {
|
||||
final String message;
|
||||
InfoAccountBalanceHomeStateError({
|
||||
required this.message,
|
||||
}) : super(DateTime.now());
|
||||
}
|
||||
|
||||
class InfoAccountBalanceHomeStateDone extends InfoAccountBalanceHomeState {
|
||||
final InfoAccountBalanceModel model;
|
||||
// final String resp;
|
||||
InfoAccountBalanceHomeStateDone({
|
||||
required this.model,
|
||||
}) : super(DateTime.now());
|
||||
}
|
||||
|
||||
//notifier
|
||||
class InfoAccountBalanceHomeNotifier
|
||||
extends StateNotifier<InfoAccountBalanceHomeState> {
|
||||
final Ref ref;
|
||||
InfoAccountBalanceHomeNotifier({
|
||||
required this.ref,
|
||||
}) : super(InfoAccountBalanceHomeStateInit());
|
||||
|
||||
void infoAccountBalanceHome(
|
||||
String companyid,
|
||||
) async {
|
||||
try {
|
||||
state = InfoAccountBalanceHomeStateLoading();
|
||||
final dio = ref.read(dioProvider);
|
||||
final resp = await HomeRepository(dio: dio).getInfoAccountBalance(
|
||||
companyid,
|
||||
);
|
||||
state = InfoAccountBalanceHomeStateDone(model: resp);
|
||||
// list transaksi home
|
||||
ref.read(listTransaksiHomeProvider.notifier).listTransaksiHome(companyid);
|
||||
} catch (e) {
|
||||
if (e is BaseRepositoryException) {
|
||||
state = InfoAccountBalanceHomeStateError(message: e.message.toString());
|
||||
} else {
|
||||
state = InfoAccountBalanceHomeStateError(message: e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//provider
|
||||
final infoAccountBalanceHomeProvider = StateNotifierProvider<
|
||||
InfoAccountBalanceHomeNotifier, InfoAccountBalanceHomeState>(
|
||||
(ref) => InfoAccountBalanceHomeNotifier(ref: ref),
|
||||
);
|
||||
@@ -1,72 +0,0 @@
|
||||
|
||||
import 'package:app_petty_cash/repository/home_repository.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../model/list_transaksi_model.dart';
|
||||
import '../../repository/transaksi_repository.dart';
|
||||
import '../../provider/dio_provider.dart';
|
||||
import '../../repository/base_repository.dart';
|
||||
|
||||
abstract class ListTransaksiHomeState extends Equatable {
|
||||
final DateTime date;
|
||||
const ListTransaksiHomeState(this.date);
|
||||
@override
|
||||
List<Object?> get props => [date];
|
||||
}
|
||||
|
||||
class ListTransaksiHomeStateInit extends ListTransaksiHomeState {
|
||||
ListTransaksiHomeStateInit() : super(DateTime.now());
|
||||
}
|
||||
|
||||
class ListTransaksiHomeStateLoading extends ListTransaksiHomeState {
|
||||
ListTransaksiHomeStateLoading() : super(DateTime.now());
|
||||
}
|
||||
|
||||
class ListTransaksiHomeStateError extends ListTransaksiHomeState {
|
||||
final String message;
|
||||
ListTransaksiHomeStateError({
|
||||
required this.message,
|
||||
}) : super(DateTime.now());
|
||||
}
|
||||
|
||||
class ListTransaksiHomeStateDone extends ListTransaksiHomeState {
|
||||
final List<ListTransaksiHomeModel> model;
|
||||
// final String resp;
|
||||
ListTransaksiHomeStateDone({
|
||||
required this.model,
|
||||
}) : super(DateTime.now());
|
||||
}
|
||||
|
||||
//notifier
|
||||
class ListTransaksiHomeNotifier extends StateNotifier<ListTransaksiHomeState> {
|
||||
final Ref ref;
|
||||
ListTransaksiHomeNotifier({
|
||||
required this.ref,
|
||||
}) : super(ListTransaksiHomeStateInit());
|
||||
|
||||
void listTransaksiHome(
|
||||
String companyid,
|
||||
) async {
|
||||
try {
|
||||
state = ListTransaksiHomeStateLoading();
|
||||
final dio = ref.read(dioProvider);
|
||||
final resp = await HomeRepository(dio: dio).getTransaksiListHome(
|
||||
companyid,
|
||||
);
|
||||
state = ListTransaksiHomeStateDone(model: resp);
|
||||
} catch (e) {
|
||||
if (e is BaseRepositoryException) {
|
||||
state = ListTransaksiHomeStateError(message: e.message.toString());
|
||||
} else {
|
||||
state = ListTransaksiHomeStateError(message: e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//provider
|
||||
final listTransaksiHomeProvider =
|
||||
StateNotifierProvider<ListTransaksiHomeNotifier, ListTransaksiHomeState>(
|
||||
(ref) => ListTransaksiHomeNotifier(ref: ref),
|
||||
);
|
||||
@@ -29,8 +29,7 @@ class LoginScreen extends HookConsumerWidget {
|
||||
final authModel = AuthModel(
|
||||
token: xmodel["token"],
|
||||
model: AuthDoctorModel(
|
||||
M_CompanyID: xmodel["model"]["M_CompanyID"],
|
||||
M_CompanyName: xmodel["model"]["M_CompanyName"],
|
||||
// M_UserM_DoctorID: xmodel["model"]["M_UserM_DoctorID"],
|
||||
M_UserEmail: xmodel["model"]["M_UserEmail"],
|
||||
M_UserUsername: xmodel["model"]["M_UserUsername"],
|
||||
// M_UserM_DoctorCode: xmodel["model"]["M_UserM_DoctorCode"],
|
||||
@@ -55,22 +54,22 @@ class LoginScreen extends HookConsumerWidget {
|
||||
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
|
||||
child: Scaffold(
|
||||
resizeToAvoidBottomInset: true,
|
||||
// backgroundColor: Colors.transparent,
|
||||
backgroundColor: Constant.backgroundColor,
|
||||
body: SafeArea(
|
||||
child: Center(
|
||||
child: Container(
|
||||
width: Constant.getActualXPhone(context: context, x: 390),
|
||||
height: Constant.getActualYPhone(context: context, y: 844),
|
||||
// decoration: BoxDecoration(
|
||||
// gradient: LinearGradient(
|
||||
// colors: [
|
||||
// Color(0xffdadae6),
|
||||
// Color(0xfff6f7fb),
|
||||
// ],
|
||||
// begin: Alignment.centerLeft,
|
||||
// end: Alignment.centerRight,
|
||||
// ),
|
||||
// ),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [
|
||||
Color(0xffdadae6),
|
||||
Color(0xfff6f7fb),
|
||||
],
|
||||
begin: Alignment.centerLeft,
|
||||
end: Alignment.centerRight,
|
||||
),
|
||||
),
|
||||
// child: BlockBodyV2(),
|
||||
child: LoginFormScreen(),
|
||||
),
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../../widget/sankbar_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
@@ -29,26 +25,6 @@ class ReportScreen extends HookConsumerWidget {
|
||||
|
||||
final tglAkhir = useState<DateTime>(DateTime.now());
|
||||
final tglAkhirTmp = useState<String>("");
|
||||
String M_CompanyID = "0";
|
||||
|
||||
Future<String> getCompanyID() async {
|
||||
final shared = await SharedPreferences.getInstance();
|
||||
String M_CompanyID = "0";
|
||||
|
||||
if (shared != null) {
|
||||
final bearerString = shared.get(Constant.bearerName).toString();
|
||||
final xmodel = jsonDecode(bearerString);
|
||||
if (xmodel != null) {
|
||||
M_CompanyID = xmodel["model"]["M_CompanyID"];
|
||||
}
|
||||
}
|
||||
|
||||
if (M_CompanyID == "0") {
|
||||
// throw BaseRepositoryException(message: 'Invalid Company ID');
|
||||
}
|
||||
|
||||
return M_CompanyID;
|
||||
}
|
||||
|
||||
useEffect(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../repository/transaksi_repository.dart';
|
||||
import '../../provider/dio_provider.dart';
|
||||
import '../../repository/base_repository.dart';
|
||||
import 'search_history_transaksi_provider.dart';
|
||||
|
||||
abstract class DeleteTransaksiState extends Equatable {
|
||||
final DateTime date;
|
||||
const DeleteTransaksiState(this.date);
|
||||
@override
|
||||
List<Object?> get props => [date];
|
||||
}
|
||||
|
||||
class DeleteTransaksiStateInit extends DeleteTransaksiState {
|
||||
DeleteTransaksiStateInit() : super(DateTime.now());
|
||||
}
|
||||
|
||||
class DeleteTransaksiStateLoading extends DeleteTransaksiState {
|
||||
DeleteTransaksiStateLoading() : super(DateTime.now());
|
||||
}
|
||||
|
||||
class DeleteTransaksiStateError extends DeleteTransaksiState {
|
||||
final String message;
|
||||
DeleteTransaksiStateError({
|
||||
required this.message,
|
||||
}) : super(DateTime.now());
|
||||
}
|
||||
|
||||
class DeleteTransaksiStateDone extends DeleteTransaksiState {
|
||||
// final List<ListType> model;
|
||||
final String resp;
|
||||
DeleteTransaksiStateDone({
|
||||
required this.resp,
|
||||
}) : super(DateTime.now());
|
||||
}
|
||||
|
||||
//notifier
|
||||
class DeleteTransaksiNotifier extends StateNotifier<DeleteTransaksiState> {
|
||||
final Ref ref;
|
||||
DeleteTransaksiNotifier({
|
||||
required this.ref,
|
||||
}) : super(DeleteTransaksiStateInit());
|
||||
|
||||
void deleteTransaksi(
|
||||
String id,
|
||||
String userid,
|
||||
String companyid,
|
||||
String tglAwal,
|
||||
String tglAkhir,
|
||||
String categoryid,
|
||||
) async {
|
||||
try {
|
||||
state = DeleteTransaksiStateLoading();
|
||||
final dio = ref.read(dioProvider);
|
||||
final resp = await TransaksiRepository(dio: dio).deleteTransaksi(
|
||||
id,
|
||||
userid,
|
||||
);
|
||||
state = DeleteTransaksiStateDone(resp: resp);
|
||||
|
||||
// search lagi buat get data
|
||||
ref.read(searchHistoryTransaksiProvider.notifier).searchHistoryTransaksi(
|
||||
companyid,
|
||||
tglAwal,
|
||||
tglAkhir,
|
||||
categoryid,
|
||||
);
|
||||
} catch (e) {
|
||||
if (e is BaseRepositoryException) {
|
||||
state = DeleteTransaksiStateError(message: e.message.toString());
|
||||
} else {
|
||||
state = DeleteTransaksiStateError(message: e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//provider
|
||||
final deleteTransaksiProvider =
|
||||
StateNotifierProvider<DeleteTransaksiNotifier, DeleteTransaksiState>(
|
||||
(ref) => DeleteTransaksiNotifier(ref: ref),
|
||||
);
|
||||
@@ -43,18 +43,15 @@ class InsertTransaksiNotifier extends StateNotifier<InsertTransaksiState> {
|
||||
}) : super(InsertTransaksiStateInit());
|
||||
|
||||
void insertTransaksi(
|
||||
{required String tanggal,
|
||||
required String tipe,
|
||||
required String kategoriid,
|
||||
required String jumlah,
|
||||
required String catatan,
|
||||
required String userid,
|
||||
required String sender,
|
||||
required String url,
|
||||
required String base64file,
|
||||
required String fileName,
|
||||
required String fileSize,
|
||||
required String fileExtension}) async {
|
||||
String tanggal,
|
||||
String tipe,
|
||||
String kategoriid,
|
||||
String jumlah,
|
||||
String catatan,
|
||||
String userid,
|
||||
String sender,
|
||||
String url,
|
||||
) async {
|
||||
try {
|
||||
state = InsertTransaksiStateLoading();
|
||||
final dio = ref.read(dioProvider);
|
||||
@@ -66,10 +63,6 @@ class InsertTransaksiNotifier extends StateNotifier<InsertTransaksiState> {
|
||||
catatan,
|
||||
userid,
|
||||
sender,
|
||||
base64file,
|
||||
fileName,
|
||||
fileSize,
|
||||
fileExtension,
|
||||
url,
|
||||
);
|
||||
state = InsertTransaksiStateDone(resp: resp);
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../../model/history_transaksi_model.dart';
|
||||
import '../../repository/transaksi_repository.dart';
|
||||
import '../../provider/dio_provider.dart';
|
||||
import '../../repository/base_repository.dart';
|
||||
|
||||
abstract class SearchHistoryTransaksiState extends Equatable {
|
||||
final DateTime date;
|
||||
const SearchHistoryTransaksiState(this.date);
|
||||
@override
|
||||
List<Object?> get props => [date];
|
||||
}
|
||||
|
||||
class SearchHistoryTransaksiStateInit extends SearchHistoryTransaksiState {
|
||||
SearchHistoryTransaksiStateInit() : super(DateTime.now());
|
||||
}
|
||||
|
||||
class SearchHistoryTransaksiStateLoading extends SearchHistoryTransaksiState {
|
||||
SearchHistoryTransaksiStateLoading() : super(DateTime.now());
|
||||
}
|
||||
|
||||
class SearchHistoryTransaksiStateError extends SearchHistoryTransaksiState {
|
||||
final String message;
|
||||
SearchHistoryTransaksiStateError({
|
||||
required this.message,
|
||||
}) : super(DateTime.now());
|
||||
}
|
||||
|
||||
class SearchHistoryTransaksiStateDone extends SearchHistoryTransaksiState {
|
||||
final List<HistoryTransaksiModel> model;
|
||||
SearchHistoryTransaksiStateDone({
|
||||
required this.model,
|
||||
}) : super(DateTime.now());
|
||||
}
|
||||
|
||||
//notifier
|
||||
class SearchHistoryTransaksiNotifier
|
||||
extends StateNotifier<SearchHistoryTransaksiState> {
|
||||
final Ref ref;
|
||||
SearchHistoryTransaksiNotifier({
|
||||
required this.ref,
|
||||
}) : super(SearchHistoryTransaksiStateInit());
|
||||
|
||||
void searchHistoryTransaksi(
|
||||
String companyid,
|
||||
String tglAwal,
|
||||
String tglAkhir,
|
||||
String categoryid,
|
||||
) async {
|
||||
try {
|
||||
state = SearchHistoryTransaksiStateLoading();
|
||||
final dio = ref.read(dioProvider);
|
||||
final resp = await TransaksiRepository(dio: dio).getListHistoryTransaksi(
|
||||
companyid,
|
||||
tglAwal,
|
||||
tglAkhir,
|
||||
categoryid,
|
||||
);
|
||||
state = SearchHistoryTransaksiStateDone(model: resp);
|
||||
} catch (e) {
|
||||
if (e is BaseRepositoryException) {
|
||||
state = SearchHistoryTransaksiStateError(message: e.message.toString());
|
||||
} else {
|
||||
state = SearchHistoryTransaksiStateError(message: e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//provider
|
||||
final searchHistoryTransaksiProvider = StateNotifierProvider<
|
||||
SearchHistoryTransaksiNotifier, SearchHistoryTransaksiState>(
|
||||
(ref) => SearchHistoryTransaksiNotifier(ref: ref),
|
||||
);
|
||||
@@ -3,17 +3,16 @@ import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
class TransaksiPickDateWidget extends StatelessWidget {
|
||||
const TransaksiPickDateWidget(
|
||||
{super.key,
|
||||
required this.ctrlTglAwal,
|
||||
required this.tglAwal,
|
||||
required this.tglAwalTmp,
|
||||
required this.isLoading});
|
||||
const TransaksiPickDateWidget({
|
||||
super.key,
|
||||
required this.ctrlTglAwal,
|
||||
required this.tglAwal,
|
||||
required this.tglAwalTmp,
|
||||
});
|
||||
|
||||
final TextEditingController ctrlTglAwal;
|
||||
final ValueNotifier<DateTime> tglAwal;
|
||||
final ValueNotifier<String> tglAwalTmp;
|
||||
final ValueNotifier<bool> isLoading;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -64,38 +63,35 @@ class TransaksiPickDateWidget extends StatelessWidget {
|
||||
// color: Constant.colorIconDate,
|
||||
// ),
|
||||
),
|
||||
onTap: !isLoading.value
|
||||
? () async {
|
||||
final selectedDateAwal = await showDatePicker(
|
||||
keyboardType: TextInputType.none,
|
||||
// locale: const Locale("en-CA"),
|
||||
// locale: ,
|
||||
context: context,
|
||||
initialEntryMode: DatePickerEntryMode.calendarOnly,
|
||||
firstDate: DateTime(2000),
|
||||
lastDate: DateTime(2100),
|
||||
onTap: () async {
|
||||
final selectedDateAwal = await showDatePicker(
|
||||
keyboardType: TextInputType.none,
|
||||
// locale: const Locale("en-CA"),
|
||||
// locale: ,
|
||||
context: context,
|
||||
initialEntryMode: DatePickerEntryMode.calendarOnly,
|
||||
firstDate: DateTime(2000),
|
||||
lastDate: DateTime(2100),
|
||||
|
||||
initialDate: (ctrlTglAwal.text.isEmpty)
|
||||
? DateTime.now()
|
||||
: tglAwal.value,
|
||||
);
|
||||
initialDate:
|
||||
(ctrlTglAwal.text.isEmpty) ? DateTime.now() : tglAwal.value,
|
||||
);
|
||||
|
||||
if (selectedDateAwal != null) {
|
||||
String formattedDate =
|
||||
DateFormat('dd-MM-yyyy').format(selectedDateAwal);
|
||||
// ctrlTglAwal.text =
|
||||
// selectedDateAwal.toString().split(' ')[0];
|
||||
ctrlTglAwal.text = formattedDate;
|
||||
tglAwal.value = selectedDateAwal;
|
||||
tglAwalTmp.value = selectedDateAwal.toString();
|
||||
}
|
||||
if (selectedDateAwal != null) {
|
||||
String formattedDate =
|
||||
DateFormat('dd-MM-yyyy').format(selectedDateAwal);
|
||||
// ctrlTglAwal.text =
|
||||
// selectedDateAwal.toString().split(' ')[0];
|
||||
ctrlTglAwal.text = formattedDate;
|
||||
tglAwal.value = selectedDateAwal;
|
||||
tglAwalTmp.value = selectedDateAwal.toString();
|
||||
}
|
||||
|
||||
if (selectedDateAwal == null) {
|
||||
print('cancel button');
|
||||
return;
|
||||
}
|
||||
}
|
||||
: null,
|
||||
if (selectedDateAwal == null) {
|
||||
print('cancel button');
|
||||
return;
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'dart:convert';
|
||||
import 'dart:io' as io;
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:app_petty_cash/app/app_extension.dart';
|
||||
import 'package:app_petty_cash/app/route.dart';
|
||||
import 'package:app_petty_cash/model/list_type_model.dart';
|
||||
import 'package:app_petty_cash/screen/transaksi/insert_transaksi_provider.dart';
|
||||
@@ -10,6 +11,7 @@ import 'package:app_petty_cash/screen/transaksi/list_type_provider.dart';
|
||||
import 'package:app_petty_cash/screen/transaksi/transaksi_pick_date_widget.dart';
|
||||
import 'package:app_petty_cash/screen/transaksi/transaksi_select_kategori_widget.dart';
|
||||
import 'package:app_petty_cash/screen/transaksi/transaksi_upload_area_widget.dart';
|
||||
import 'package:dropdown_button2/dropdown_button2.dart';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@@ -17,12 +19,14 @@ import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:mime/mime.dart';
|
||||
|
||||
import '../../app/constant.dart';
|
||||
import '../../model/list_category_model.dart';
|
||||
import '../../provider/current_user_provider.dart';
|
||||
import '../../widget/custom_drawer.dart';
|
||||
import '../../widget/sankbar_widget.dart';
|
||||
import '../login/custom_text_field.dart';
|
||||
|
||||
class DummyDropdownTipe {
|
||||
final String options;
|
||||
@@ -49,13 +53,10 @@ class TransaksiScreen extends HookConsumerWidget {
|
||||
final ctrlJumlah = useTextEditingController(text: "");
|
||||
final ctrlCatatan = useTextEditingController(text: "");
|
||||
final ctrlNamaPengirim = useTextEditingController(text: "");
|
||||
final ctrlCompanyName = useTextEditingController(text: "");
|
||||
final fileData = useState<XFile?>(null);
|
||||
final fileDataBase64 = useState<String>("");
|
||||
final isImage = useState(false);
|
||||
final fileEkstension = useState("");
|
||||
final fileSize = useState(0);
|
||||
final fileName = useState("");
|
||||
|
||||
String formattedDate = DateFormat('dd-MM-yyyy').format(DateTime.now());
|
||||
|
||||
@@ -168,9 +169,6 @@ class TransaksiScreen extends HookConsumerWidget {
|
||||
// Navigator.popAndPushNamed(context, loginRoute);
|
||||
return;
|
||||
}
|
||||
|
||||
ctrlCompanyName.text =
|
||||
ref.read(currentUserProvider)?.model.M_CompanyName ?? "";
|
||||
});
|
||||
return () {};
|
||||
}, []);
|
||||
@@ -198,16 +196,15 @@ class TransaksiScreen extends HookConsumerWidget {
|
||||
// List<int> imageBytes = await fileData.value?.readAsBytes();
|
||||
if (fileData.value != null) {
|
||||
final bytes = io.File(fileData.value!.path).readAsBytesSync();
|
||||
String base64Image = base64Encode(await fileData.value!.readAsBytes());
|
||||
String base64Image = base64Encode(bytes);
|
||||
fileDataBase64.value = base64Image;
|
||||
final file = File(fileData.value!.path);
|
||||
print(file.lengthSync() / 1000000);
|
||||
print(await fileData.value!.length());
|
||||
fileSize.value = await fileData.value!.length();
|
||||
|
||||
// await getExternalStorageDirectory();
|
||||
// print(await fileData.value!.saveTo(path));
|
||||
print(fileDataBase64.value);
|
||||
print(base64Image);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,25 +214,13 @@ class TransaksiScreen extends HookConsumerWidget {
|
||||
source: ImageSource.camera,
|
||||
);
|
||||
if (pickedFile != null) {
|
||||
final tmpFile = FilePickerResult([
|
||||
PlatformFile(
|
||||
name: pickedFile.name,
|
||||
size: await pickedFile.length(),
|
||||
path: pickedFile.path,
|
||||
)
|
||||
]);
|
||||
if (await pickedFile.length() > 10000000) {
|
||||
SanckbarWidget(context, "File tidak boleh lebih dari 10 MB",
|
||||
snackbarType.warning);
|
||||
} else {
|
||||
fileData.value = pickedFile;
|
||||
isImage.value = true;
|
||||
fileEkstension.value = tmpFile.files.single.extension ?? "";
|
||||
DateTime now = new DateTime.now();
|
||||
fileName.value =
|
||||
"IMG-${now.year}${now.month}${now.day}.${tmpFile.files.single.extension ?? ''}";
|
||||
}
|
||||
|
||||
// final Directory appDocumentsDir =
|
||||
// await getApplicationDocumentsDirectory();
|
||||
// print(appDocumentsDir);
|
||||
@@ -280,14 +265,13 @@ class TransaksiScreen extends HookConsumerWidget {
|
||||
SanckbarWidget(context, "File tidak boleh lebih dari 10 MB",
|
||||
snackbarType.warning);
|
||||
} else {
|
||||
// File files = File(result.files.single.path!);
|
||||
File files = File(result.files.single.path!);
|
||||
print(result.files.single.extension);
|
||||
XFile fl = XFile(result.files.single.path!);
|
||||
fileName.value = result.files.single.name;
|
||||
|
||||
isImage.value = imgExt.contains(result.files.single.extension);
|
||||
|
||||
print(result.files.single.name);
|
||||
print("ini xfile");
|
||||
fileData.value = fl;
|
||||
await getBase64();
|
||||
fileEkstension.value = result.files.single.extension ?? "";
|
||||
@@ -297,69 +281,6 @@ class TransaksiScreen extends HookConsumerWidget {
|
||||
}
|
||||
}
|
||||
|
||||
insertTransaksi() {
|
||||
if (selectedListTypeData.value.typeid.toString() == "DEBIT") {
|
||||
ctrlNamaPengirim.text = "";
|
||||
// validasi form
|
||||
if (ctrlJumlah.text.isEmpty || ctrlCatatan.text.trim().isEmpty) {
|
||||
SanckbarWidget(
|
||||
context, "Jumlah dan catatan harus diisi", snackbarType.warning);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (selectedListTypeData.value.typeid.toString() == "KREDIT") {
|
||||
selectedListCategory.value.categoryid = "0";
|
||||
// validasi form
|
||||
if (ctrlNamaPengirim.text.trim().isEmpty ||
|
||||
ctrlJumlah.text.isEmpty ||
|
||||
ctrlCatatan.text.trim().isEmpty) {
|
||||
SanckbarWidget(
|
||||
context,
|
||||
"Nama pengirim, jumlah dan catatan harus diisi",
|
||||
snackbarType.warning);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DateTime parsedDate = DateFormat('dd-MM-yyyy').parse(
|
||||
ctrlTglAwal.value.text.toString(),
|
||||
);
|
||||
String formattedDateTransaksi =
|
||||
DateFormat('yyyy-MM-dd').format(parsedDate);
|
||||
var param = {
|
||||
"tgltransaksi": formattedDateTransaksi,
|
||||
"typeid": selectedListTypeData.value.typeid.toString(),
|
||||
"categoryid": selectedListCategory.value.categoryid.toString(),
|
||||
"jumlah": ctrlJumlah.value.text.toString(),
|
||||
"catatan": ctrlCatatan.value.text.toString(),
|
||||
// "userid": "1",
|
||||
"userid": userIDLogin,
|
||||
"namapengirim": ctrlNamaPengirim.value.text.toString(),
|
||||
"url": "",
|
||||
// "base64file": fileDataBase64.value,
|
||||
"fileName": fileName.value,
|
||||
"fileExtension": fileEkstension.value,
|
||||
"fileSize": fileSize.value.toString()
|
||||
};
|
||||
print(param);
|
||||
// return;
|
||||
ref.read(insertTransaksiProvider.notifier).insertTransaksi(
|
||||
tanggal: formattedDateTransaksi,
|
||||
tipe: selectedListTypeData.value.typeid.toString(),
|
||||
kategoriid: selectedListCategory.value.categoryid.toString(),
|
||||
jumlah: ctrlJumlah.value.text.toString(),
|
||||
catatan: ctrlCatatan.value.text.toString(),
|
||||
// "1",
|
||||
userid: userIDLogin,
|
||||
sender: ctrlNamaPengirim.value.text.toString(),
|
||||
url: "",
|
||||
base64file: fileDataBase64.value,
|
||||
fileName: fileData.value?.name ?? "",
|
||||
fileExtension: fileEkstension.value,
|
||||
fileSize: fileSize.value.toString());
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: Constant.getActualYPhone(context: context, y: 30),
|
||||
@@ -381,76 +302,133 @@ class TransaksiScreen extends HookConsumerWidget {
|
||||
child: SingleChildScrollView(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(20),
|
||||
child: Container(
|
||||
// height: MediaQuery.of(context).size.height - 10,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
// Company Name
|
||||
Text(
|
||||
'Company Name',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
TextField(
|
||||
controller: ctrlCompanyName,
|
||||
readOnly: true,
|
||||
decoration: InputDecoration(
|
||||
hintStyle:
|
||||
Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
labelStyle:
|
||||
Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.orange,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Constant.textGreyv2,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
labelText: "Company Name",
|
||||
hintText: 'Company Name',
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
Text(
|
||||
'Tanggal Transaksi',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
// Tanggal Transaksi
|
||||
TransaksiPickDateWidget(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'Tanggal Transaksi',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600, color: Constant.textBlack),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
// Tanggal Transaksi
|
||||
TransaksiPickDateWidget(
|
||||
ctrlTglAwal: ctrlTglAwal,
|
||||
tglAwal: tglAwal,
|
||||
tglAwalTmp: tglAwalTmp,
|
||||
isLoading: transaksiIsLoading,
|
||||
tglAwalTmp: tglAwalTmp),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
// tipe transaksi
|
||||
Text(
|
||||
'Tipe Transaksi',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600, color: Constant.textBlack),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
SizedBox(
|
||||
width: Constant.getActualXPhone(context: context, x: 340),
|
||||
height: Constant.getActualYPhone(context: context, y: 36),
|
||||
child: (listTypeLoading.value)
|
||||
? SizedBox(
|
||||
width: Constant.getActualXPhone(
|
||||
context: context, x: 24),
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 32),
|
||||
child: Center(
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
)
|
||||
: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
if (listTypeData.value.isEmpty)
|
||||
Text('Radio Button Empty')
|
||||
else
|
||||
for (var i = 0;
|
||||
i < listTypeData.value.length;
|
||||
i++)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 20),
|
||||
child: Row(
|
||||
children: [
|
||||
Radio<ListType>(
|
||||
activeColor:
|
||||
Constant.pcBtnBackgroundColor,
|
||||
value: listTypeData.value[i],
|
||||
groupValue:
|
||||
selectedListTypeData.value,
|
||||
onChanged: (ListType? index) {
|
||||
if (isMounted()) {
|
||||
selectedListTypeData.value =
|
||||
index!;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
},
|
||||
),
|
||||
Text(
|
||||
listTypeData.value[i].typename ?? "",
|
||||
style:
|
||||
Constant.body1(context: context)
|
||||
.copyWith(
|
||||
color: Constant.textBlack,
|
||||
fontWeight: FontWeight.w400,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
// Kategori
|
||||
if (selectedListTypeData.value.typeid == "KREDIT") ...[
|
||||
Text(
|
||||
'Kategori',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
// Dropdown kategori
|
||||
(listCategoryLoading.value)
|
||||
? SizedBox(
|
||||
width: Constant.getActualXPhone(
|
||||
context: context, x: 24),
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 32),
|
||||
child: Center(
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
)
|
||||
: TransaksiSelectKategoriWidget(
|
||||
listCategoryData: listCategoryData,
|
||||
selectedListCategory: selectedListCategory),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
],
|
||||
|
||||
// tipe transaksi
|
||||
// Nama Pengirim
|
||||
if (selectedListTypeData.value.typeid == "DEBIT") ...[
|
||||
Text(
|
||||
'Tipe Transaksi',
|
||||
'Nama Pengirim',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack),
|
||||
@@ -458,164 +436,8 @@ class TransaksiScreen extends HookConsumerWidget {
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
SizedBox(
|
||||
width: Constant.getActualXPhone(context: context, x: 340),
|
||||
height: Constant.getActualYPhone(context: context, y: 36),
|
||||
child: (listTypeLoading.value)
|
||||
? SizedBox(
|
||||
width: Constant.getActualXPhone(
|
||||
context: context, x: 24),
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 32),
|
||||
child: Center(
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
)
|
||||
: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
if (listTypeData.value.isEmpty)
|
||||
Text('Radio Button Empty')
|
||||
else
|
||||
for (var i = 0;
|
||||
i < listTypeData.value.length;
|
||||
i++)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 20),
|
||||
child: Row(
|
||||
children: [
|
||||
Radio<ListType>(
|
||||
activeColor:
|
||||
Constant.pcBtnBackgroundColor,
|
||||
value: listTypeData.value[i],
|
||||
groupValue:
|
||||
selectedListTypeData.value,
|
||||
onChanged: !transaksiIsLoading.value
|
||||
? (ListType? index) {
|
||||
if (isMounted()) {
|
||||
selectedListTypeData
|
||||
.value = index!;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
: null,
|
||||
),
|
||||
Text(
|
||||
listTypeData.value[i].typename ??
|
||||
"",
|
||||
style:
|
||||
Constant.body1(context: context)
|
||||
.copyWith(
|
||||
color: Constant.textBlack,
|
||||
fontWeight: FontWeight.w400,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
// Kategori
|
||||
if (selectedListTypeData.value.typeid == "DEBIT") ...[
|
||||
Text(
|
||||
'Kategori',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height:
|
||||
Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
// Dropdown kategori
|
||||
(listCategoryLoading.value)
|
||||
? SizedBox(
|
||||
width: Constant.getActualXPhone(
|
||||
context: context, x: 24),
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 32),
|
||||
child: Center(
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
)
|
||||
: TransaksiSelectKategoriWidget(
|
||||
isLoading: transaksiIsLoading,
|
||||
listCategoryData: listCategoryData,
|
||||
selectedListCategory: selectedListCategory),
|
||||
|
||||
SizedBox(
|
||||
height:
|
||||
Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
],
|
||||
|
||||
// Nama Pengirim
|
||||
if (selectedListTypeData.value.typeid == "KREDIT") ...[
|
||||
Text(
|
||||
'Nama Pengirim',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack),
|
||||
),
|
||||
SizedBox(
|
||||
height:
|
||||
Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
TextField(
|
||||
controller: ctrlNamaPengirim,
|
||||
readOnly: transaksiIsLoading.value,
|
||||
decoration: InputDecoration(
|
||||
hintStyle:
|
||||
Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
labelStyle:
|
||||
Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.orange,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Constant.textGreyv2,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
labelText: "Nama Pengirim",
|
||||
hintText: 'Nama Pengirim',
|
||||
),
|
||||
),
|
||||
],
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
// jumlah
|
||||
Text(
|
||||
'Jumlah',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
TextField(
|
||||
controller: ctrlJumlah,
|
||||
keyboardType: TextInputType.number,
|
||||
readOnly: transaksiIsLoading.value,
|
||||
controller: ctrlNamaPengirim,
|
||||
decoration: InputDecoration(
|
||||
hintStyle:
|
||||
Constant.body2_400(context: context).copyWith(
|
||||
@@ -637,222 +459,202 @@ class TransaksiScreen extends HookConsumerWidget {
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
labelText: "Jumlah",
|
||||
hintText: 'Jumlah',
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
// catatan
|
||||
Text(
|
||||
'Catatan',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
TextField(
|
||||
readOnly: transaksiIsLoading.value,
|
||||
controller: ctrlCatatan,
|
||||
maxLines: 4,
|
||||
decoration: InputDecoration(
|
||||
hintStyle:
|
||||
Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
labelStyle:
|
||||
Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.orange,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Constant.textGreyv2,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
labelText: "Catatan",
|
||||
hintText: 'Catatan',
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
// Upload File
|
||||
TransaksiUploadAreaWidget(
|
||||
isLoading: transaksiIsLoading,
|
||||
isImage: isImage,
|
||||
fileData: fileData,
|
||||
fileDataBase64: fileDataBase64,
|
||||
pickFile: pickFile,
|
||||
pickImage: pickImage),
|
||||
|
||||
// Spacer(),
|
||||
|
||||
Container(
|
||||
margin: EdgeInsets.only(
|
||||
top: Constant.getActualYPhone(
|
||||
context: context, y: 24)),
|
||||
width: Constant.getActualXPhone(context: context, x: 390),
|
||||
height: Constant.getActualY(context: context, y: 64),
|
||||
child: ElevatedButton(
|
||||
style: ButtonStyle(
|
||||
backgroundColor: MaterialStateColor.resolveWith(
|
||||
(st) => Constant.pcBtnBackgroundColor),
|
||||
shape:
|
||||
MaterialStateProperty.all<RoundedRectangleBorder>(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
side: BorderSide(
|
||||
color: Constant.pcBtnBackgroundColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
shadowColor:
|
||||
MaterialStateProperty.all(Color(0xffff48423d)),
|
||||
elevation: MaterialStateProperty.all(4.0),
|
||||
),
|
||||
child: Stack(
|
||||
children: [
|
||||
(transaksiIsLoading.value)
|
||||
? SizedBox(
|
||||
width: Constant.getActualXPhone(
|
||||
context: context, x: 32),
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 32),
|
||||
child: CircularProgressIndicator(
|
||||
color: Colors.white,
|
||||
),
|
||||
)
|
||||
: Text(
|
||||
'Simpan',
|
||||
style: Constant.body1(context: context)
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.white),
|
||||
),
|
||||
],
|
||||
),
|
||||
onPressed: !transaksiIsLoading.value
|
||||
? () {
|
||||
// transaksiIsLoading.value = true;
|
||||
insertTransaksi();
|
||||
}
|
||||
: null,
|
||||
labelText: "Nama Pengirim",
|
||||
hintText: 'Nama Pengirim',
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
// jumlah
|
||||
Text(
|
||||
'Jumlah',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600, color: Constant.textBlack),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
TextField(
|
||||
controller: ctrlJumlah,
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: InputDecoration(
|
||||
hintStyle: Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
labelStyle: Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.orange,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Constant.textGreyv2,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
labelText: "Jumlah",
|
||||
hintText: 'Jumlah',
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
// catatan
|
||||
Text(
|
||||
'Catatan',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600, color: Constant.textBlack),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
TextField(
|
||||
controller: ctrlCatatan,
|
||||
maxLines: 4,
|
||||
decoration: InputDecoration(
|
||||
hintStyle: Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
labelStyle: Constant.body2_400(context: context).copyWith(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Colors.orange,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: Constant.textGreyv2,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
labelText: "Catatan",
|
||||
hintText: 'Catatan',
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
|
||||
// Upload File
|
||||
TransaksiUploadAreaWidget(
|
||||
isImage: isImage,
|
||||
fileData: fileData,
|
||||
fileDataBase64: fileDataBase64,
|
||||
pickFile: pickFile,
|
||||
pickImage: pickImage),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
// bottomNavigationBar: Padding(
|
||||
// padding: EdgeInsets.only(
|
||||
// right: Constant.getActualXPhone(context: context, x: 27),
|
||||
// left: Constant.getActualXPhone(context: context, x: 27),
|
||||
// bottom: Constant.getActualYPhone(context: context, y: 32),
|
||||
// top: Constant.getActualYPhone(context: context, y: 10),
|
||||
// ),
|
||||
// child: BottomAppBar(
|
||||
// elevation: 2.0,
|
||||
// child: Container(
|
||||
// width: Constant.getActualXPhone(context: context, x: 336),
|
||||
// height: Constant.getActualYPhone(context: context, y: 42),
|
||||
// child: ElevatedButton(
|
||||
// style: ButtonStyle(
|
||||
// backgroundColor: MaterialStateColor.resolveWith(
|
||||
// (st) => Constant.pcBtnBackgroundColor),
|
||||
// shape: MaterialStateProperty.all<RoundedRectangleBorder>(
|
||||
// RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.circular(8),
|
||||
// side: BorderSide(
|
||||
// color: Constant.pcBtnBackgroundColor,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// shadowColor: MaterialStateProperty.all(Color(0xffff48423d)),
|
||||
// elevation: MaterialStateProperty.all(4.0),
|
||||
// ),
|
||||
// child: Stack(
|
||||
// children: [
|
||||
// (transaksiIsLoading.value)
|
||||
// ? SizedBox(
|
||||
// width: Constant.getActualXPhone(
|
||||
// context: context, x: 24),
|
||||
// height: Constant.getActualYPhone(
|
||||
// context: context, y: 32),
|
||||
// child: CircularProgressIndicator(
|
||||
// color: Colors.white,
|
||||
// ),
|
||||
// )
|
||||
// : Text(
|
||||
// 'Simpan',
|
||||
// style: Constant.body1(context: context).copyWith(
|
||||
// fontWeight: FontWeight.w600,
|
||||
// color: Constant.white),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// onPressed: () {
|
||||
// if (selectedListTypeData.value.typeid.toString() == "DEBIT") {
|
||||
// ctrlNamaPengirim.text = "";
|
||||
// // validasi form
|
||||
// } else {
|
||||
// if (selectedListTypeData.value.typeid.toString() ==
|
||||
// "KREDIT") {
|
||||
// selectedListCategory.value.categoryid = "0";
|
||||
// // validasi form
|
||||
// }
|
||||
// }
|
||||
bottomNavigationBar: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
right: Constant.getActualXPhone(context: context, x: 27),
|
||||
left: Constant.getActualXPhone(context: context, x: 27),
|
||||
bottom: Constant.getActualYPhone(context: context, y: 32),
|
||||
top: Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
child: BottomAppBar(
|
||||
elevation: 2.0,
|
||||
child: Container(
|
||||
width: Constant.getActualXPhone(context: context, x: 336),
|
||||
height: Constant.getActualYPhone(context: context, y: 42),
|
||||
child: ElevatedButton(
|
||||
style: ButtonStyle(
|
||||
backgroundColor: MaterialStateColor.resolveWith(
|
||||
(st) => Constant.pcBtnBackgroundColor),
|
||||
shape: MaterialStateProperty.all<RoundedRectangleBorder>(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
side: BorderSide(
|
||||
color: Constant.pcBtnBackgroundColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
shadowColor: MaterialStateProperty.all(Color(0xffff48423d)),
|
||||
elevation: MaterialStateProperty.all(4.0),
|
||||
),
|
||||
child: Stack(
|
||||
children: [
|
||||
(transaksiIsLoading.value)
|
||||
? SizedBox(
|
||||
width: Constant.getActualXPhone(
|
||||
context: context, x: 24),
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 32),
|
||||
child: CircularProgressIndicator(
|
||||
color: Colors.white,
|
||||
),
|
||||
)
|
||||
: Text(
|
||||
'Simpan',
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.white),
|
||||
),
|
||||
],
|
||||
),
|
||||
onPressed: () {
|
||||
if (selectedListTypeData.value.typeid.toString() ==
|
||||
"KREDIT") {
|
||||
ctrlNamaPengirim.text = "";
|
||||
// validasi form
|
||||
} else {
|
||||
if (selectedListTypeData.value.typeid.toString() ==
|
||||
"DEBIT") {
|
||||
selectedListCategory.value.categoryid = "0";
|
||||
// validasi form
|
||||
}
|
||||
}
|
||||
|
||||
// DateTime parsedDate = DateFormat('dd-MM-yyyy').parse(
|
||||
// ctrlTglAwal.value.text.toString(),
|
||||
// );
|
||||
// String formattedDateTransaksi =
|
||||
// DateFormat('yyyy-MM-dd').format(parsedDate);
|
||||
// var param = {
|
||||
// "tgltransaksi": formattedDateTransaksi,
|
||||
// "typeid": selectedListTypeData.value.typeid.toString(),
|
||||
// "categoryid":
|
||||
// selectedListCategory.value.categoryid.toString(),
|
||||
// "jumlah": ctrlJumlah.value.text.toString(),
|
||||
// "catatan": ctrlCatatan.value.text.toString(),
|
||||
// // "userid": "1",
|
||||
// "userid": userIDLogin,
|
||||
// "namapengirim": ctrlNamaPengirim.value.text.toString(),
|
||||
// "url": "",
|
||||
// };
|
||||
// print(param);
|
||||
// ref.read(insertTransaksiProvider.notifier).insertTransaksi(
|
||||
// formattedDateTransaksi,
|
||||
// selectedListTypeData.value.typeid.toString(),
|
||||
// selectedListCategory.value.categoryid.toString(),
|
||||
// ctrlJumlah.value.text.toString(),
|
||||
// ctrlCatatan.value.text.toString(),
|
||||
// // "1",
|
||||
// userIDLogin,
|
||||
// ctrlNamaPengirim.value.text.toString(),
|
||||
// "",
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
DateTime parsedDate = DateFormat('dd-MM-yyyy').parse(
|
||||
ctrlTglAwal.value.text.toString(),
|
||||
);
|
||||
String formattedDateTransaksi =
|
||||
DateFormat('yyyy-MM-dd').format(parsedDate);
|
||||
var param = {
|
||||
"tgltransaksi": formattedDateTransaksi,
|
||||
"typeid": selectedListTypeData.value.typeid.toString(),
|
||||
"categoryid":
|
||||
selectedListCategory.value.categoryid.toString(),
|
||||
"jumlah": ctrlJumlah.value.text.toString(),
|
||||
"catatan": ctrlCatatan.value.text.toString(),
|
||||
// "userid": "1",
|
||||
"userid": userIDLogin,
|
||||
"namapengirim": ctrlNamaPengirim.value.text.toString(),
|
||||
"url": "",
|
||||
};
|
||||
print(param);
|
||||
ref.read(insertTransaksiProvider.notifier).insertTransaksi(
|
||||
formattedDateTransaksi,
|
||||
selectedListTypeData.value.typeid.toString(),
|
||||
selectedListCategory.value.categoryid.toString(),
|
||||
ctrlJumlah.value.text.toString(),
|
||||
ctrlCatatan.value.text.toString(),
|
||||
// "1",
|
||||
userIDLogin,
|
||||
ctrlNamaPengirim.value.text.toString(),
|
||||
"",
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -8,12 +8,10 @@ class TransaksiSelectKategoriWidget extends StatelessWidget {
|
||||
super.key,
|
||||
required this.listCategoryData,
|
||||
required this.selectedListCategory,
|
||||
required this.isLoading,
|
||||
});
|
||||
|
||||
final ValueNotifier<List<ListCategory>> listCategoryData;
|
||||
final ValueNotifier<ListCategory> selectedListCategory;
|
||||
final ValueNotifier<bool> isLoading;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -47,14 +45,12 @@ class TransaksiSelectKategoriWidget extends StatelessWidget {
|
||||
style: Constant.body1(context: context)
|
||||
.copyWith(color: Constant.textBlack, fontWeight: FontWeight.w400),
|
||||
value: selectedListCategory.value,
|
||||
onChanged: !isLoading.value
|
||||
? (ListCategory? newValue) {
|
||||
// if (newValue) {
|
||||
selectedListCategory.value = newValue!;
|
||||
print(selectedListCategory.value.categoryid);
|
||||
// }
|
||||
}
|
||||
: null,
|
||||
onChanged: (ListCategory? newValue) {
|
||||
// if (newValue) {
|
||||
selectedListCategory.value = newValue!;
|
||||
print(selectedListCategory.value.categoryid);
|
||||
// }
|
||||
},
|
||||
buttonStyleData: ButtonStyleData(
|
||||
height: Constant.getActualY(context: context, y: 80),
|
||||
width: Constant.getActualX(context: context, x: 320),
|
||||
|
||||
@@ -13,11 +13,9 @@ class TransaksiUploadAreaWidget extends StatelessWidget {
|
||||
required this.fileDataBase64,
|
||||
required this.pickFile,
|
||||
required this.pickImage,
|
||||
required this.isLoading,
|
||||
});
|
||||
|
||||
final ValueNotifier<bool> isImage;
|
||||
final ValueNotifier<bool> isLoading;
|
||||
final ValueNotifier<XFile?> fileData;
|
||||
final ValueNotifier<String> fileDataBase64;
|
||||
final Function pickImage;
|
||||
@@ -26,63 +24,60 @@ class TransaksiUploadAreaWidget extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InkWell(
|
||||
onTap: !isLoading.value
|
||||
? () {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return Container(
|
||||
height: Constant.getActualY(context: context, y: 200),
|
||||
padding: EdgeInsets.all(20),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
pickFile();
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.folder_copy_rounded,
|
||||
size: 50,
|
||||
color: Constant.pcBtnBackgroundColor,
|
||||
)),
|
||||
Text("Browse a file",
|
||||
style: Constant.body1(context: context)
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack))
|
||||
],
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
pickImage();
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.add_a_photo_rounded,
|
||||
size: 50,
|
||||
color: Constant.pcBtnBackgroundColor,
|
||||
)),
|
||||
Text("Take a picture",
|
||||
style: Constant.body1(context: context)
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack))
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
: null,
|
||||
onTap: () {
|
||||
print("tapped");
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return Container(
|
||||
height: Constant.getActualY(context: context, y: 200),
|
||||
padding: EdgeInsets.all(20),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
pickFile();
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.folder_copy_rounded,
|
||||
size: 50,
|
||||
color: Constant.pcBtnBackgroundColor,
|
||||
)),
|
||||
Text("Browse a file",
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack))
|
||||
],
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
pickImage();
|
||||
},
|
||||
icon: Icon(
|
||||
Icons.add_a_photo_rounded,
|
||||
size: 50,
|
||||
color: Constant.pcBtnBackgroundColor,
|
||||
)),
|
||||
Text("Take a picture",
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack))
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
child: Stack(
|
||||
alignment: AlignmentDirectional.topEnd,
|
||||
children: [
|
||||
@@ -152,7 +147,7 @@ class TransaksiUploadAreaWidget extends StatelessWidget {
|
||||
)));
|
||||
}),
|
||||
),
|
||||
if (fileData.value != null && !isLoading.value)
|
||||
if (fileData.value != null)
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
fileData.value = null;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
@@ -13,11 +12,9 @@ import '../provider/current_user_provider.dart';
|
||||
import '../screen/login/logout_provider.dart';
|
||||
|
||||
class CustomDrawer extends HookConsumerWidget {
|
||||
// final String userCompany;
|
||||
const CustomDrawer({
|
||||
Key? key,
|
||||
// required this.userCompany,
|
||||
}) : super(key: key);
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
@@ -25,26 +22,6 @@ class CustomDrawer extends HookConsumerWidget {
|
||||
final isLoading = useState(false);
|
||||
final errorMessage = useState("");
|
||||
final successMessage = useState("");
|
||||
final M_CompanyName = useState("-");
|
||||
|
||||
Future<String> getCompanyName() async {
|
||||
final shared = await SharedPreferences.getInstance();
|
||||
String M_CompanyName = "-";
|
||||
|
||||
if (shared != null) {
|
||||
final bearerString = shared.get(Constant.bearerName).toString();
|
||||
final xmodel = jsonDecode(bearerString);
|
||||
if (xmodel != null) {
|
||||
M_CompanyName = xmodel["model"]["M_CompanyName"];
|
||||
}
|
||||
}
|
||||
|
||||
if (M_CompanyName == "0") {
|
||||
// throw BaseRepositoryException(message: 'Invalid Company ID');
|
||||
}
|
||||
|
||||
return M_CompanyName;
|
||||
}
|
||||
|
||||
useEffect(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
||||
@@ -57,7 +34,6 @@ class CustomDrawer extends HookConsumerWidget {
|
||||
// Navigator.popAndPushNamed(context, loginRoute);
|
||||
return;
|
||||
}
|
||||
M_CompanyName.value = await getCompanyName();
|
||||
});
|
||||
return () {};
|
||||
}, []);
|
||||
@@ -80,6 +56,7 @@ class CustomDrawer extends HookConsumerWidget {
|
||||
shared.remove(bearerString);
|
||||
shared.clear();
|
||||
// Navigator.popAndPushNamed(context, loginRoute);
|
||||
|
||||
Navigator.of(context)
|
||||
.pushNamedAndRemoveUntil(loginRoute, (route) => false);
|
||||
}
|
||||
@@ -92,236 +69,135 @@ class CustomDrawer extends HookConsumerWidget {
|
||||
final currentMenu = ref.read(currentPageProvider);
|
||||
|
||||
return Drawer(
|
||||
elevation: 0,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(0))),
|
||||
child: Container(
|
||||
child: ListView(
|
||||
// padding: EdgeInsets.only(
|
||||
// top: Constant.getActualYPhone(context: context, y: 10),
|
||||
// ),
|
||||
children: [
|
||||
Container(
|
||||
// decoration: BoxDecoration(
|
||||
// border: Border(bottom: BorderSide(color: Colors.transparent)) // <--- use the global theme to change the dividerColor property
|
||||
// ),
|
||||
child: Image(
|
||||
image: AssetImage('images/logo_sismedika_landscape.png')),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(context: context, y: 8),
|
||||
),
|
||||
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: Constant.getActualYPhone(context: context, y: 10),
|
||||
bottom: Constant.getActualYPhone(context: context, y: 10),
|
||||
right: Constant.getActualXPhone(context: context, x: 24),
|
||||
left: Constant.getActualXPhone(context: context, x: 24),
|
||||
),
|
||||
child: Container(
|
||||
width: Constant.getActualXPhone(context: context, x: 300),
|
||||
),
|
||||
),
|
||||
|
||||
// Expanded(
|
||||
// child: Padding(
|
||||
// padding: EdgeInsets.only(
|
||||
// left: Constant.getActualXPhone(context: context, x: 24),
|
||||
// right: Constant.getActualXPhone(context: context, x: 71),
|
||||
// ),
|
||||
// child: Container(
|
||||
// decoration: BoxDecoration(
|
||||
// borderRadius: BorderRadius.circular(6),
|
||||
// color: Constant.textGrey.withOpacity(0.16),
|
||||
// ),
|
||||
// child: Padding(
|
||||
// padding: EdgeInsets.only(
|
||||
// left: Constant.getActualXPhone(context: context, x: 8),
|
||||
// right: Constant.getActualXPhone(context: context, x: 8),
|
||||
// ),
|
||||
// child: Text(
|
||||
// M_CompanyName.value,
|
||||
// style: Constant.body3(context: context).copyWith(
|
||||
// fontWeight: FontWeight.w700,
|
||||
// color: Constant.textGreyv2,
|
||||
// backgroundColor: Constant.textGrey.withOpacity(0.16),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
|
||||
Chip(
|
||||
backgroundColor: Constant.textGrey.withOpacity(0.16),
|
||||
label: Text(
|
||||
M_CompanyName.value,
|
||||
style: TextStyle(
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
ListTile(
|
||||
leading: Icon(
|
||||
Icons.home,
|
||||
color: (currentMenu == 0)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Constant.textGreyv2,
|
||||
),
|
||||
title: Text(
|
||||
'Home',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 0)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Constant.textGreyv2,
|
||||
),
|
||||
),
|
||||
// tileColor: (currentMenu == 0)
|
||||
// ? Constant.pcBtnBackgroundColor
|
||||
// : Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Home screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 0);
|
||||
Navigator.pushNamed(context, homeRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: Icon(
|
||||
Icons.money,
|
||||
color: (currentMenu == 1)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Constant.textGreyv2,
|
||||
),
|
||||
title: Text(
|
||||
'Transaksi',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 1)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Constant.textGreyv2,
|
||||
),
|
||||
),
|
||||
// tileColor: (currentMenu == 1)
|
||||
// ? Constant.pcBtnBackgroundColor
|
||||
// : Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Transaksi screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 1);
|
||||
Navigator.pushNamed(context, transaksiRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: Icon(
|
||||
Icons.history,
|
||||
color: (currentMenu == 2)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Constant.textGreyv2,
|
||||
),
|
||||
title: Text(
|
||||
'History Transaksi',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 2)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Constant.textGreyv2,
|
||||
),
|
||||
),
|
||||
// tileColor: (currentMenu == 2)
|
||||
// ? Constant.pcBtnBackgroundColor
|
||||
// : Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to User screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 2);
|
||||
Navigator.pushNamed(context, historyTransaksiRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: Icon(
|
||||
Icons.feed,
|
||||
color: (currentMenu == 3)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Constant.textGreyv2,
|
||||
),
|
||||
title: Text(
|
||||
'Report',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 3)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Constant.textGreyv2,
|
||||
),
|
||||
),
|
||||
// tileColor: (currentMenu == 3)
|
||||
// ? Constant.pcBtnBackgroundColor
|
||||
// : Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Transaksi screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 3);
|
||||
Navigator.pushNamed(context, reportRoute);
|
||||
},
|
||||
),
|
||||
// ListTile(
|
||||
// title: Text(
|
||||
// 'User',
|
||||
// style: TextStyle(
|
||||
// color: (currentMenu == 4)
|
||||
// ? Constant.textWhite
|
||||
// : Constant.textBlack,
|
||||
// ),
|
||||
// ),
|
||||
// tileColor: (currentMenu == 4)
|
||||
// ? Constant.pcBtnBackgroundColor
|
||||
// : Colors.transparent,
|
||||
// onTap: () {
|
||||
// // Handle navigation to User screen
|
||||
// Navigator.pop(context);
|
||||
// ref.read(currentPageProvider.state).update((state) => 4);
|
||||
// Navigator.pushNamed(context, userRoute);
|
||||
// },
|
||||
// ),
|
||||
// ListTile(
|
||||
// title: Text(
|
||||
// 'Change Company',
|
||||
// style: TextStyle(
|
||||
// color: (currentMenu == 5)
|
||||
// ? Constant.textWhite
|
||||
// : Constant.textBlack,
|
||||
// ),
|
||||
// ),
|
||||
// tileColor: (currentMenu == 5)
|
||||
// ? Constant.pcBtnBackgroundColor
|
||||
// : Colors.transparent,
|
||||
// onTap: () {
|
||||
// // Handle navigation to User screen
|
||||
// Navigator.pop(context);
|
||||
// ref.read(currentPageProvider.state).update((state) => 5);
|
||||
// Navigator.pushNamed(context, changeCompanyRoute);
|
||||
// },
|
||||
// ),
|
||||
ListTile(
|
||||
leading: Icon(
|
||||
Icons.logout,
|
||||
color: Constant.textGreyv2,
|
||||
),
|
||||
title: Text(
|
||||
'Logout',
|
||||
style: TextStyle(color: Constant.textGreyv2),
|
||||
),
|
||||
onTap: () {
|
||||
// di set ke 0 lagi
|
||||
ref.read(currentPageProvider.state).update((state) => 0);
|
||||
ref.read(logoutProvider.notifier).logout(
|
||||
M_UserID: selectedUser?.model.M_UserID ?? "",
|
||||
M_UserUsername: selectedUser?.model.M_UserUsername ?? "",
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
child: ListView(
|
||||
padding: EdgeInsets.only(
|
||||
top: Constant.getActualYPhone(context: context, y: 10),
|
||||
),
|
||||
children: [
|
||||
// DrawerHeader(
|
||||
// decoration: BoxDecoration(
|
||||
// color: Colors.blue,
|
||||
// ),
|
||||
// child: Text(
|
||||
// 'Drawer Header',
|
||||
// style: TextStyle(
|
||||
// color: Colors.white,
|
||||
// fontSize: 24,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'Home',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 0)
|
||||
? Constant.textWhite
|
||||
: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
tileColor: (currentMenu == 0)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Home screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 0);
|
||||
Navigator.pushNamed(context, homeRoute);
|
||||
// Navigator.pushNamed(context, cameraExampleRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'Coba Camera',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 10)
|
||||
? Constant.textWhite
|
||||
: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
tileColor: (currentMenu == 10)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Home screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 10);
|
||||
// Navigator.pushNamed(context, homeRoute);
|
||||
Navigator.pushNamed(context, cobaCameraRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'Transaksi',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 1)
|
||||
? Constant.textWhite
|
||||
: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
tileColor: (currentMenu == 1)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Transaksi screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 1);
|
||||
Navigator.pushNamed(context, transaksiRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'Report',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 2)
|
||||
? Constant.textWhite
|
||||
: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
tileColor: (currentMenu == 2)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Transaksi screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 2);
|
||||
Navigator.pushNamed(context, reportRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'User',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 3)
|
||||
? Constant.textWhite
|
||||
: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
tileColor: (currentMenu == 3)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to User screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 3);
|
||||
Navigator.pushNamed(context, userRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'Logout',
|
||||
// style: TextStyle(color: Constant.textWhite),
|
||||
),
|
||||
onTap: () {
|
||||
// di set ke 0 lagi
|
||||
ref.read(currentPageProvider.state).update((state) => 0);
|
||||
ref.read(logoutProvider.notifier).logout(
|
||||
M_UserID: selectedUser?.model.M_UserID ?? "",
|
||||
M_UserUsername: selectedUser?.model.M_UserUsername ?? "",
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,221 +0,0 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../app/constant.dart';
|
||||
import '../app/route.dart';
|
||||
import '../provider/current_menu_provider.dart';
|
||||
import '../provider/current_user_provider.dart';
|
||||
import '../screen/login/logout_provider.dart';
|
||||
|
||||
class CustomDrawerV1 extends HookConsumerWidget {
|
||||
const CustomDrawerV1({
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final selectedUser = ref.read(currentUserProvider);
|
||||
final isLoading = useState(false);
|
||||
final errorMessage = useState("");
|
||||
final successMessage = useState("");
|
||||
|
||||
useEffect(() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
||||
final userID = ref.read(currentUserProvider)?.model.M_UserID ?? "0";
|
||||
if (userID == "0") {
|
||||
//not login
|
||||
Navigator.of(context)
|
||||
.pushNamedAndRemoveUntil(loginRoute, (route) => true);
|
||||
|
||||
// Navigator.popAndPushNamed(context, loginRoute);
|
||||
return;
|
||||
}
|
||||
});
|
||||
return () {};
|
||||
}, []);
|
||||
|
||||
ref.listen(logoutProvider, (prev, next) async {
|
||||
if (next is LogoutStateLoading) {
|
||||
isLoading.value = true;
|
||||
} else if (next is LogoutStateError) {
|
||||
isLoading.value = false;
|
||||
errorMessage.value = next.message;
|
||||
Timer(const Duration(seconds: 3), () {
|
||||
errorMessage.value = "";
|
||||
});
|
||||
} else if (next is LogoutStateDone) {
|
||||
isLoading.value = false;
|
||||
final shared = await SharedPreferences.getInstance();
|
||||
final bearerString = shared.get(Constant.bearerName).toString();
|
||||
// print(bearerString);
|
||||
if (bearerString.isNotEmpty) {
|
||||
shared.remove(bearerString);
|
||||
shared.clear();
|
||||
// Navigator.popAndPushNamed(context, loginRoute);
|
||||
|
||||
Navigator.of(context)
|
||||
.pushNamedAndRemoveUntil(loginRoute, (route) => false);
|
||||
}
|
||||
Timer(const Duration(seconds: 3), () async {
|
||||
successMessage.value = "";
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
final currentMenu = ref.read(currentPageProvider);
|
||||
|
||||
return Drawer(
|
||||
child: ListView(
|
||||
// padding: EdgeInsets.only(
|
||||
// top: Constant.getActualYPhone(context: context, y: 10),
|
||||
// ),
|
||||
children: [
|
||||
DrawerHeader(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.blue,
|
||||
),
|
||||
child: Text(
|
||||
'Drawer Header',
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 24,
|
||||
),
|
||||
),
|
||||
),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'Home',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 0)
|
||||
? Constant.textWhite
|
||||
: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
tileColor: (currentMenu == 0)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Home screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 0);
|
||||
Navigator.pushNamed(context, homeRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'Transaksi',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 1)
|
||||
? Constant.textWhite
|
||||
: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
tileColor: (currentMenu == 1)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Transaksi screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 1);
|
||||
Navigator.pushNamed(context, transaksiRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'History Transaksi',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 2)
|
||||
? Constant.textWhite
|
||||
: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
tileColor: (currentMenu == 2)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to User screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 2);
|
||||
Navigator.pushNamed(context, historyTransaksiRoute);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'Report',
|
||||
style: TextStyle(
|
||||
color: (currentMenu == 3)
|
||||
? Constant.textWhite
|
||||
: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
tileColor: (currentMenu == 3)
|
||||
? Constant.pcBtnBackgroundColor
|
||||
: Colors.transparent,
|
||||
onTap: () {
|
||||
// Handle navigation to Transaksi screen
|
||||
Navigator.pop(context);
|
||||
ref.read(currentPageProvider.state).update((state) => 3);
|
||||
Navigator.pushNamed(context, reportRoute);
|
||||
},
|
||||
),
|
||||
// ListTile(
|
||||
// title: Text(
|
||||
// 'User',
|
||||
// style: TextStyle(
|
||||
// color: (currentMenu == 4)
|
||||
// ? Constant.textWhite
|
||||
// : Constant.textBlack,
|
||||
// ),
|
||||
// ),
|
||||
// tileColor: (currentMenu == 4)
|
||||
// ? Constant.pcBtnBackgroundColor
|
||||
// : Colors.transparent,
|
||||
// onTap: () {
|
||||
// // Handle navigation to User screen
|
||||
// Navigator.pop(context);
|
||||
// ref.read(currentPageProvider.state).update((state) => 4);
|
||||
// Navigator.pushNamed(context, userRoute);
|
||||
// },
|
||||
// ),
|
||||
// ListTile(
|
||||
// title: Text(
|
||||
// 'Change Company',
|
||||
// style: TextStyle(
|
||||
// color: (currentMenu == 5)
|
||||
// ? Constant.textWhite
|
||||
// : Constant.textBlack,
|
||||
// ),
|
||||
// ),
|
||||
// tileColor: (currentMenu == 5)
|
||||
// ? Constant.pcBtnBackgroundColor
|
||||
// : Colors.transparent,
|
||||
// onTap: () {
|
||||
// // Handle navigation to User screen
|
||||
// Navigator.pop(context);
|
||||
// ref.read(currentPageProvider.state).update((state) => 5);
|
||||
// Navigator.pushNamed(context, changeCompanyRoute);
|
||||
// },
|
||||
// ),
|
||||
ListTile(
|
||||
title: Text(
|
||||
'Logout',
|
||||
// style: TextStyle(color: Constant.textWhite),
|
||||
),
|
||||
onTap: () {
|
||||
// di set ke 0 lagi
|
||||
ref.read(currentPageProvider.state).update((state) => 0);
|
||||
ref.read(logoutProvider.notifier).logout(
|
||||
M_UserID: selectedUser?.model.M_UserID ?? "",
|
||||
M_UserUsername: selectedUser?.model.M_UserUsername ?? "",
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
|
||||
import '../app/constant.dart';
|
||||
|
||||
class FieldRowHistoryTransaksi extends HookConsumerWidget {
|
||||
final String label;
|
||||
final String value;
|
||||
const FieldRowHistoryTransaksi({
|
||||
Key? key,
|
||||
required this.label,
|
||||
required this.value,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
return Row(
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 10),
|
||||
child: SizedBox(
|
||||
width: Constant.getActualXPhone(context: context, x: 100),
|
||||
child: Text(label),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
child: Text(':'),
|
||||
),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(right: 10),
|
||||
child: Text(
|
||||
value,
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,310 +0,0 @@
|
||||
import 'package:app_petty_cash/widget/sankbar_widget.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
import '../app/constant.dart';
|
||||
|
||||
class HistoryRowAtasWidget extends HookConsumerWidget {
|
||||
final String icon_category_id;
|
||||
final String icon_category_name;
|
||||
final String amount;
|
||||
final String tipe;
|
||||
final String tglTransaksi;
|
||||
// final ValueNotifier<bool> searchHistoryIsLoading;
|
||||
|
||||
const HistoryRowAtasWidget({
|
||||
Key? key,
|
||||
required this.icon_category_id,
|
||||
required this.icon_category_name,
|
||||
required this.amount,
|
||||
required this.tipe,
|
||||
required this.tglTransaksi,
|
||||
// required this.searchHistoryIsLoading,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
// check file exist
|
||||
// Future<Widget> checkFileExistence(String fileUrl) async {
|
||||
// try {
|
||||
// final dio = Dio();
|
||||
// final response = await dio.head(fileUrl);
|
||||
// if (response.statusCode == 200) {
|
||||
// return SvgPicture.network(
|
||||
// fileUrl,
|
||||
// semanticsLabel: 'Icon pizza',
|
||||
// // placeholderBuilder: (BuildContext context) => Container(
|
||||
// // padding: const EdgeInsets.all(30.0),
|
||||
// // child: const CircularProgressIndicator(),
|
||||
// // ),
|
||||
// );
|
||||
// } else {
|
||||
// return SvgPicture.network(
|
||||
// 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg',
|
||||
// semanticsLabel: 'Icon pizza',
|
||||
// // placeholderBuilder: (BuildContext context) => Container(
|
||||
// // padding: const EdgeInsets.all(30.0),
|
||||
// // child: const CircularProgressIndicator(),
|
||||
// // ),
|
||||
// );
|
||||
// }
|
||||
// } catch (e) {
|
||||
// // print('Error checking file existence: $e');
|
||||
// return SvgPicture.network(
|
||||
// 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg',
|
||||
// semanticsLabel: 'Icon pizza',
|
||||
// // placeholderBuilder: (BuildContext context) => Container(
|
||||
// // padding: const EdgeInsets.all(30.0),
|
||||
// // child: const CircularProgressIndicator(),
|
||||
// // ),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
final iconProvider =
|
||||
FutureProvider.family<Widget, String>((ref, fileUrl) async {
|
||||
try {
|
||||
final dio = Dio();
|
||||
final response = await dio.head(fileUrl);
|
||||
if (response.statusCode == 200) {
|
||||
return SvgPicture.network(
|
||||
fileUrl,
|
||||
semanticsLabel: 'Icon pizza',
|
||||
);
|
||||
} else {
|
||||
return SvgPicture.network(
|
||||
'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg',
|
||||
semanticsLabel: 'Icon pizza',
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
return SvgPicture.network(
|
||||
'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg',
|
||||
semanticsLabel: 'Icon pizza',
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
// fungsi tanggal
|
||||
String formatDateString(String inputDate) {
|
||||
try {
|
||||
// Parsing tanggal dari string input
|
||||
DateTime date = DateFormat('dd-MM-yyyy','id').parse(inputDate);
|
||||
|
||||
// Format tanggal ke '30 Des 2023'
|
||||
String formattedDate = DateFormat('dd MMM yyyy', 'id').format(date);
|
||||
|
||||
return formattedDate;
|
||||
} catch (e) {
|
||||
// Tangkap kesalahan jika format tanggal tidak sesuai
|
||||
print('Error parsing date: $e');
|
||||
// return 'Format Tanggal Salah';
|
||||
return inputDate;
|
||||
}
|
||||
}
|
||||
|
||||
Widget getIconUrl(String categoryid) {
|
||||
List<Map<String, String>> iconDataList = [
|
||||
{'categoryid': '1', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg'},
|
||||
{'categoryid': '2', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg'},
|
||||
{'categoryid': '3', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_3.svg'},
|
||||
{'categoryid': '4', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg'},
|
||||
{'categoryid': '5', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_5.svg'},
|
||||
{'categoryid': '6', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_6.svg'},
|
||||
{'categoryid': '7', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg'},
|
||||
{'categoryid': '8', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg'},
|
||||
{'categoryid': '9', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg'},
|
||||
{'categoryid': '10', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg'},
|
||||
{'categoryid': '11', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg'},
|
||||
{'categoryid': '12', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_12.svg'},
|
||||
{'categoryid': '13', 'url': 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg'},
|
||||
];
|
||||
|
||||
String urlFix = "";
|
||||
|
||||
for (var i = 0; i < iconDataList.length; i++) {
|
||||
if (iconDataList[i]['categoryid'] == categoryid) {
|
||||
// urlFix =
|
||||
// "https://devone.aplikasi.web.id/pettycash-media/icon/icon_$icon_category_id.svg";
|
||||
|
||||
urlFix = iconDataList[i]['url'] ?? "https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg";
|
||||
}
|
||||
}
|
||||
|
||||
if (urlFix == "") {
|
||||
urlFix =
|
||||
"https://devone.aplikasi.web.id/pettycash-media/icon/icon_13.svg";
|
||||
}
|
||||
|
||||
// return urlFix;
|
||||
return SvgPicture.network(
|
||||
urlFix,
|
||||
semanticsLabel: 'Icon category',
|
||||
);
|
||||
}
|
||||
|
||||
return Row(
|
||||
children: [
|
||||
// kiri
|
||||
Container(
|
||||
width: Constant.getActualXPhone(context: context, x: 38),
|
||||
height: Constant.getActualYPhone(context: context, y: 38),
|
||||
decoration: BoxDecoration(
|
||||
color: Color.fromRGBO(241, 90, 41, 0.08),
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(8.0),
|
||||
),
|
||||
),
|
||||
// child: Text('s'),
|
||||
// child: FutureBuilder<Widget>(
|
||||
// future: checkFileExistence(
|
||||
// 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_$icon_category_id.svg',
|
||||
// ),
|
||||
// builder: (context, snapshot) {
|
||||
// // if (snapshot.connectionState == ConnectionState.waiting) {
|
||||
// // // return CircularProgressIndicator();
|
||||
// // return Text('');
|
||||
// // } else if (snapshot.hasError) {
|
||||
// // return Icon(
|
||||
// // Icons.error,
|
||||
// // color: Colors.red,
|
||||
// // );
|
||||
// // } else {
|
||||
// // return snapshot.data ?? Container();
|
||||
// // }
|
||||
|
||||
// if (snapshot.connectionState == ConnectionState.done) {
|
||||
// return snapshot.data ?? Container();
|
||||
// } else if (snapshot.hasError) {
|
||||
// return Icon(
|
||||
// Icons.error,
|
||||
// color: Colors.red,
|
||||
// );
|
||||
// } else {
|
||||
// return Text('');
|
||||
// }
|
||||
// },
|
||||
// ),
|
||||
// child: Consumer(
|
||||
// builder: (context, watch, child) {
|
||||
// String iconUrl =
|
||||
// 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_$icon_category_id.svg';
|
||||
// final iconAsyncValue = ref.read(
|
||||
// iconProvider(
|
||||
// iconUrl,
|
||||
// ),
|
||||
// );
|
||||
|
||||
// return iconAsyncValue.when(
|
||||
// loading: () {
|
||||
// print('loading iconurl : $iconUrl');
|
||||
// return CircularProgressIndicator();
|
||||
// },
|
||||
// error: (error, stackTrace) {
|
||||
// print('error iconurl : $iconUrl');
|
||||
// return Icon(
|
||||
// Icons.error,
|
||||
// color: Colors.red,
|
||||
// );
|
||||
// },
|
||||
// data: (iconWidget) {
|
||||
// print('data iconurl : $iconUrl');
|
||||
// return iconWidget ?? Container();
|
||||
// }
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
|
||||
// child: SvgPicture.network(
|
||||
// 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_$icon_category_id.svg',
|
||||
// semanticsLabel: 'Icon pizza',
|
||||
// ),
|
||||
|
||||
child: getIconUrl(icon_category_id),
|
||||
),
|
||||
|
||||
// tengah
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: Constant.getActualYPhone(context: context, y: 20),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
icon_category_name,
|
||||
style: Constant.body2_600(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(
|
||||
context: context,
|
||||
y: 8,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
amount,
|
||||
style: Constant.body1_600(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.pcBtnBackgroundColor),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
// kanan
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
right: Constant.getActualYPhone(context: context, y: 8),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Container(
|
||||
// width: Constant.getActualXPhone(context: context, x: 32),
|
||||
height: Constant.getActualYPhone(context: context, y: 19),
|
||||
decoration: BoxDecoration(
|
||||
color: Constant.bgIconHistory,
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(6.0),
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(2.0),
|
||||
child: Text(
|
||||
tipe,
|
||||
style: Constant.body1_600(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.pcBtnBackgroundColor),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(
|
||||
context: context,
|
||||
y: 8,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
formatDateString(tglTransaksi),
|
||||
style: Constant.body1_600(context: context).copyWith(
|
||||
fontWeight: FontWeight.w600, color: Constant.textGreyv2),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,68 +1,68 @@
|
||||
{
|
||||
"info": {
|
||||
"version": 1,
|
||||
"author": "xcode"
|
||||
"images" : [
|
||||
{
|
||||
"size" : "16x16",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_16.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"size": "16x16",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_16.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "16x16",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_32.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "32x32",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_32.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "32x32",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_64.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "128x128",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_128.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "128x128",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_256.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "256x256",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_256.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "256x256",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_512.png",
|
||||
"scale": "2x"
|
||||
},
|
||||
{
|
||||
"size": "512x512",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_512.png",
|
||||
"scale": "1x"
|
||||
},
|
||||
{
|
||||
"size": "512x512",
|
||||
"idiom": "mac",
|
||||
"filename": "app_icon_1024.png",
|
||||
"scale": "2x"
|
||||
}
|
||||
]
|
||||
}
|
||||
{
|
||||
"size" : "16x16",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_32.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "32x32",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_32.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "32x32",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_64.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "128x128",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_128.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "128x128",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_256.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "256x256",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_256.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "256x256",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_512.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"size" : "512x512",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_512.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"size" : "512x512",
|
||||
"idiom" : "mac",
|
||||
"filename" : "app_icon_1024.png",
|
||||
"scale" : "2x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 780 B After Width: | Height: | Size: 520 B |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.2 KiB |
@@ -1,22 +1,6 @@
|
||||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
archive:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: archive
|
||||
sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.4.10"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -57,22 +41,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
checked_yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: checked_yaml
|
||||
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
cli_util:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cli_util
|
||||
sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.1"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -238,14 +206,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.18.6"
|
||||
flutter_launcher_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_launcher_icons
|
||||
sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.13.1"
|
||||
flutter_lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
@@ -278,14 +238,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
flutter_svg:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_svg
|
||||
sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.9"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
@@ -328,14 +280,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.2"
|
||||
image:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: image
|
||||
sha256: "004a2e90ce080f8627b5a04aecb4cdfac87d2c3f3b520aa291260be5a32c033d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.4"
|
||||
image_picker:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -408,22 +352,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.17.0"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.7"
|
||||
json_annotation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: json_annotation
|
||||
sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.8.1"
|
||||
lints:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -480,14 +408,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.3"
|
||||
path_parsing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_parsing
|
||||
sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
path_provider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -576,14 +496,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.3"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: petitparser
|
||||
sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.4.0"
|
||||
photo_view:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -608,14 +520,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.8"
|
||||
pointycastle:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pointycastle
|
||||
sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.7.4"
|
||||
riverpod:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -821,30 +725,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.1"
|
||||
vector_graphics:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics
|
||||
sha256: "18f6690295af52d081f6808f2f7c69f0eed6d7e23a71539d75f4aeb8f0062172"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.9+2"
|
||||
vector_graphics_codec:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_codec
|
||||
sha256: "531d20465c10dfac7f5cd90b60bbe4dd9921f1ec4ca54c83ebb176dbacb7bb2d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.9+2"
|
||||
vector_graphics_compiler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_compiler
|
||||
sha256: "03012b0a33775c5530576b70240308080e1d5050f0faf000118c20e6463bc0ad"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.9+2"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -917,22 +797,6 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xml
|
||||
sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.3.0"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml
|
||||
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
sdks:
|
||||
dart: ">=3.2.0 <4.0.0"
|
||||
flutter: ">=3.16.0"
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
name: app_petty_cash
|
||||
# name: PettyCash
|
||||
description: A new Flutter project.
|
||||
# The following line prevents the package from being accidentally published to
|
||||
# pub.dev using `flutter pub publish`. This is preferred for private packages.
|
||||
@@ -51,8 +50,6 @@ dependencies:
|
||||
flutter_multi_formatter: ^2.12.4
|
||||
top_snackbar_flutter: ^3.1.0
|
||||
url_launcher: ^6.1.13
|
||||
flutter_svg: ^2.0.9
|
||||
flutter_launcher_icons: ^0.13.1
|
||||
image_picker: ^1.0.7
|
||||
video_player: ^2.7.2
|
||||
photo_view: ^0.14.0
|
||||
@@ -73,24 +70,6 @@ dev_dependencies:
|
||||
# For information on the generic Dart part of this file, see the
|
||||
# following page: https://dart.dev/tools/pub/pubspec
|
||||
|
||||
flutter_launcher_icons:
|
||||
android: "launcher_icon"
|
||||
ios: true
|
||||
image_path: "images/logo_apk.png"
|
||||
min_sdk_android: 21 # android min sdk min:16, default 21
|
||||
web:
|
||||
generate: true
|
||||
image_path: "images/logo_apk.png"
|
||||
background_color: "#00FFFFFF"
|
||||
theme_color: "#00FFFFFF"
|
||||
windows:
|
||||
generate: true
|
||||
image_path: "images/logo_apk.png"
|
||||
icon_size: 48 # min:48, max:256, default: 48
|
||||
macos:
|
||||
generate: true
|
||||
image_path: "images/logo_apk.png"
|
||||
|
||||
# The following section is specific to Flutter packages.
|
||||
flutter:
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 780 B After Width: | Height: | Size: 917 B |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 20 KiB |
@@ -3,8 +3,8 @@
|
||||
"short_name": "app_petty_cash",
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"background_color": "#00FFFFFF",
|
||||
"theme_color": "#00FFFFFF",
|
||||
"background_color": "#0175C2",
|
||||
"theme_color": "#0175C2",
|
||||
"description": "A new Flutter project.",
|
||||
"orientation": "portrait-primary",
|
||||
"prefer_related_applications": false,
|
||||
@@ -32,4 +32,4 @@
|
||||
"purpose": "maskable"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 33 KiB |