order page

This commit is contained in:
efrilm
2025-10-27 21:55:19 +07:00
parent b8eefcbac0
commit 8bd61eb58e
38 changed files with 8795 additions and 89 deletions
+2
View File
@@ -6,6 +6,7 @@ import '../application/category/category_loader/category_loader_bloc.dart';
import '../application/checkout/checkout_form/checkout_form_bloc.dart';
import '../application/customer/customer_loader/customer_loader_bloc.dart';
import '../application/order/order_form/order_form_bloc.dart';
import '../application/order/order_loader/order_loader_bloc.dart';
import '../application/outlet/outlet_loader/outlet_loader_bloc.dart';
import '../application/payment_method/payment_method_loader/payment_method_loader_bloc.dart';
import '../application/product/product_loader/product_loader_bloc.dart';
@@ -40,6 +41,7 @@ class _AppWidgetState extends State<AppWidget> {
BlocProvider(create: (context) => getIt<TableFormBloc>()),
BlocProvider(create: (context) => getIt<PaymentMethodLoaderBloc>()),
BlocProvider(create: (context) => getIt<OrderFormBloc>()),
BlocProvider(create: (context) => getIt<OrderLoaderBloc>()),
BlocProvider(create: (context) => getIt<CustomerLoaderBloc>()),
],
child: MaterialApp.router(
@@ -0,0 +1,207 @@
import 'package:flutter/material.dart';
import '../../../common/extension/extension.dart';
import '../../../common/theme/theme.dart';
import '../../../domain/order/order.dart';
class OrderCard extends StatelessWidget {
final Order order;
final bool isActive;
const OrderCard({super.key, required this.order, required this.isActive});
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
decoration: BoxDecoration(
color: isActive ? AppColor.primary.withOpacity(0.1) : AppColor.white,
border: Border.all(
color: isActive ? AppColor.primary : AppColor.border,
),
borderRadius: BorderRadius.circular(8),
),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: Text(
order.orderNumber,
style: AppStyle.sm.copyWith(fontWeight: FontWeight.w600),
),
),
if (order.isRefund == true)
Container(
padding: const EdgeInsets.symmetric(
horizontal: 8,
vertical: 4,
),
decoration: BoxDecoration(
color: Colors.red.withOpacity(0.15),
borderRadius: BorderRadius.circular(16),
),
child: Text(
'Refund',
style: AppStyle.xs.copyWith(
color: AppColor.error,
fontWeight: FontWeight.w600,
fontSize: 10,
letterSpacing: 0.5,
),
),
),
if (order.isVoid == true)
Container(
padding: const EdgeInsets.symmetric(
horizontal: 8,
vertical: 4,
),
decoration: BoxDecoration(
color: Colors.red.withOpacity(0.15),
borderRadius: BorderRadius.circular(16),
),
child: Text(
'Void',
style: AppStyle.xs.copyWith(
color: AppColor.error,
fontWeight: FontWeight.w600,
fontSize: 10,
letterSpacing: 0.5,
),
),
),
],
),
const SizedBox(height: 12),
Row(
children: [
CircleAvatar(
radius: 22,
backgroundColor: AppColor.primary,
child: Icon(Icons.person, color: Colors.white),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
order.metadata['customer_name'] == ""
? "Anonim"
: order.metadata['customer_name'],
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
if (order.orderType == "dineIn") ...[
const SizedBox(height: 4),
Row(
children: [
Icon(
Icons.table_bar,
size: 16,
color: AppColor.textSecondary,
),
const SizedBox(width: 4),
Text(
'Meja ${order.tableNumber}',
style: AppStyle.md.copyWith(
color: AppColor.textSecondary,
),
),
],
),
],
],
),
),
_buildStatus(),
],
),
const SizedBox(height: 16),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
order.status == 'pending'
? ((order.totalAmount) - (order.totalPaid))
.currencyFormatRpV2
: (order.totalAmount).currencyFormatRpV2,
style: AppStyle.xl.copyWith(
fontSize: 18,
fontWeight: FontWeight.bold,
color: AppColor.primary,
),
),
Text(
(order.createdAt).toFormattedDateTime(),
style: TextStyle(color: AppColor.black),
),
],
),
],
),
),
);
}
Widget _buildStatus() {
switch (order.status) {
case 'pending':
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: AppColor.warning.withOpacity(0.15),
borderRadius: BorderRadius.circular(16),
),
child: Text(
(order.status).toUpperCase(),
style: AppStyle.sm.copyWith(
color: AppColor.warning,
fontWeight: FontWeight.w600,
letterSpacing: 0.5,
),
),
);
case 'completed':
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: AppColor.success.withOpacity(0.15),
borderRadius: BorderRadius.circular(16),
),
child: Text(
(order.status).toUpperCase(),
style: TextStyle(
color: AppColor.success,
fontWeight: FontWeight.w600,
fontSize: 12,
letterSpacing: 0.5,
),
),
);
default:
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: AppColor.textSecondary.withOpacity(0.15),
borderRadius: BorderRadius.circular(16),
),
child: Text(
(order.status).toUpperCase(),
style: TextStyle(
color: AppColor.textSecondary,
fontWeight: FontWeight.w600,
fontSize: 12,
letterSpacing: 0.5,
),
),
);
}
}
}
@@ -0,0 +1,67 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../application/order/order_loader/order_loader_bloc.dart';
import '../../../domain/order/order.dart';
import '../card/error_card.dart';
class OrderLoaderErrorStateWidget extends StatelessWidget {
final OrderFailure failure;
final String status;
const OrderLoaderErrorStateWidget({
super.key,
required this.failure,
required this.status,
});
@override
Widget build(BuildContext context) {
return failure.maybeMap(
orElse: () => ErrorCard(
title: 'Pesanan',
message: 'Terjadi kesalahan saat memuat pesanan',
onTap: () {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.fetched(status: status, isRefresh: true),
);
},
),
dynamicErrorMessage: (value) => ErrorCard(
title: 'Pesanan',
message: value.erroMessage,
onTap: () {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.fetched(status: status, isRefresh: true),
);
},
),
empty: (value) => ErrorCard(
title: 'Pesanan',
message: 'Data Pesanan Kosong',
onTap: () {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.fetched(status: status, isRefresh: true),
);
},
),
serverError: (value) => ErrorCard(
title: 'Pesanan',
message: 'Terjadi kesalahan saat memuat pesanan',
onTap: () {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.fetched(status: status, isRefresh: true),
);
},
),
unexpectedError: (value) => ErrorCard(
title: 'Pesanan',
message: 'Terjadi kesalahan saat memuat pesanan',
onTap: () {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.fetched(status: status, isRefresh: true),
);
},
),
);
}
}
@@ -52,6 +52,7 @@ class AppTextFormField extends StatelessWidget {
maxLines: maxLines,
validator: validator,
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(vertical: 0, horizontal: 12),
prefixIcon: prefixIcon,
suffixIcon: suffixIcon,
hintText: label,
@@ -10,54 +10,70 @@ class PageTitle extends StatelessWidget {
final String? subtitle;
final bool isBack;
final List<Widget>? actionWidget;
final Widget? bottom;
const PageTitle({
super.key,
required this.title,
this.subtitle,
this.isBack = true,
this.actionWidget,
this.bottom,
});
@override
Widget build(BuildContext context) {
return Container(
height: context.deviceHeight * 0.123,
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0),
decoration: BoxDecoration(
color: AppColor.white,
border: Border(bottom: BorderSide(color: AppColor.border, width: 1.0)),
),
child: Row(
children: [
if (isBack) ...[
GestureDetector(
onTap: () => context.router.maybePop(),
child: Icon(Icons.arrow_back, color: AppColor.primary, size: 24),
),
SpaceWidth(16),
],
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: AppStyle.xxl.copyWith(fontWeight: FontWeight.w600),
),
if (subtitle != null) ...[
const SizedBox(height: 4.0),
Text(
subtitle!,
style: AppStyle.md.copyWith(color: AppColor.textSecondary),
),
],
],
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: context.deviceHeight * 0.123,
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0),
decoration: BoxDecoration(
color: AppColor.white,
border: Border(
bottom: BorderSide(color: AppColor.border, width: 1.0),
),
),
if (actionWidget != null) ...actionWidget!,
],
),
child: Row(
children: [
if (isBack) ...[
GestureDetector(
onTap: () => context.router.maybePop(),
child: Icon(
Icons.arrow_back,
color: AppColor.primary,
size: 24,
),
),
SpaceWidth(16),
],
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: AppStyle.xxl.copyWith(fontWeight: FontWeight.w600),
),
if (subtitle != null) ...[
const SizedBox(height: 4.0),
Text(
subtitle!,
style: AppStyle.md.copyWith(
color: AppColor.textSecondary,
),
),
],
],
),
),
if (actionWidget != null) ...actionWidget!,
],
),
),
bottom ?? const SizedBox.shrink(),
],
);
}
}
@@ -0,0 +1,411 @@
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_datepicker/datepicker.dart';
import '../../../common/theme/theme.dart';
class DateRangePickerModal {
static Future<DateRangePickerSelectionChangedArgs?> show({
required BuildContext context,
String title = 'Pilih Rentang Tanggal',
DateTime? initialStartDate,
DateTime? initialEndDate,
DateTime? minDate,
DateTime? maxDate,
String confirmText = 'Pilih',
String cancelText = 'Batal',
Color primaryColor = AppColor.primary,
Function(DateTime? startDate, DateTime? endDate)? onChanged,
}) async {
return await showDialog<DateRangePickerSelectionChangedArgs?>(
context: context,
barrierDismissible: false,
builder: (BuildContext context) => _DateRangePickerDialog(
title: title,
initialStartDate: initialStartDate,
initialEndDate: initialEndDate,
minDate: minDate,
maxDate: maxDate,
confirmText: confirmText,
cancelText: cancelText,
primaryColor: primaryColor,
onChanged: onChanged,
),
);
}
}
class _DateRangePickerDialog extends StatefulWidget {
final String title;
final DateTime? initialStartDate;
final DateTime? initialEndDate;
final DateTime? minDate;
final DateTime? maxDate;
final String confirmText;
final String cancelText;
final Color primaryColor;
final Function(DateTime? startDate, DateTime? endDate)? onChanged;
const _DateRangePickerDialog({
required this.title,
this.initialStartDate,
this.initialEndDate,
this.minDate,
this.maxDate,
required this.confirmText,
required this.cancelText,
required this.primaryColor,
this.onChanged,
});
@override
State<_DateRangePickerDialog> createState() => _DateRangePickerDialogState();
}
class _DateRangePickerDialogState extends State<_DateRangePickerDialog>
with TickerProviderStateMixin {
DateRangePickerSelectionChangedArgs? _selectionChangedArgs;
late AnimationController _animationController;
late Animation<double> _scaleAnimation;
late Animation<double> _fadeAnimation;
@override
void initState() {
super.initState();
_animationController = AnimationController(
duration: const Duration(milliseconds: 300),
vsync: this,
);
_scaleAnimation = Tween<double>(begin: 0.8, end: 1.0).animate(
CurvedAnimation(parent: _animationController, curve: Curves.elasticOut),
);
_fadeAnimation = Tween<double>(begin: 0.0, end: 1.0).animate(
CurvedAnimation(parent: _animationController, curve: Curves.easeInOut),
);
_animationController.forward();
}
@override
void dispose() {
_animationController.dispose();
super.dispose();
}
void _onSelectionChanged(DateRangePickerSelectionChangedArgs args) {
setState(() {
_selectionChangedArgs = args;
});
// Note: onChanged callback is now called only when confirm button is pressed
// This allows users to see real-time selection without triggering callbacks
}
String _getSelectionText() {
if (_selectionChangedArgs?.value is PickerDateRange) {
final PickerDateRange range = _selectionChangedArgs!.value;
if (range.startDate != null && range.endDate != null) {
return '${_formatDate(range.startDate!)} - ${_formatDate(range.endDate!)}';
} else if (range.startDate != null) {
return _formatDate(range.startDate!);
}
}
return 'Belum ada tanggal dipilih';
}
String _formatDate(DateTime date) {
final months = [
'Jan',
'Feb',
'Mar',
'Apr',
'Mei',
'Jun',
'Jul',
'Agu',
'Sep',
'Okt',
'Nov',
'Des',
];
return '${date.day} ${months[date.month - 1]} ${date.year}';
}
bool get _isValidSelection {
if (_selectionChangedArgs?.value is PickerDateRange) {
final PickerDateRange range = _selectionChangedArgs!.value;
return range.startDate != null && range.endDate != null;
}
return false;
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _animationController,
builder: (context, child) {
return FadeTransition(
opacity: _fadeAnimation,
child: ScaleTransition(
scale: _scaleAnimation,
child: Dialog(
backgroundColor: Colors.transparent,
elevation: 0,
insetPadding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 24,
),
child: Container(
width: MediaQuery.of(context).size.width,
constraints: BoxConstraints(
maxWidth: 400,
maxHeight: MediaQuery.of(context).size.height * 0.85,
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.1),
blurRadius: 20,
offset: const Offset(0, 10),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// Header
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
widget.primaryColor,
widget.primaryColor.withOpacity(0.8),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
),
child: Row(
children: [
Icon(
Icons.calendar_today_rounded,
color: Colors.white,
size: 24,
),
const SizedBox(width: 12),
Expanded(
child: Text(
widget.title,
style: const TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
],
),
),
// Scrollable Content
Flexible(
child: SingleChildScrollView(
child: Column(
children: [
// Selection Info
Container(
width: double.infinity,
padding: const EdgeInsets.all(12),
margin: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: widget.primaryColor.withOpacity(0.1),
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: widget.primaryColor.withOpacity(0.2),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Tanggal Terpilih:',
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500,
color: widget.primaryColor,
),
),
const SizedBox(height: 4),
Text(
_getSelectionText(),
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: Colors.black87,
),
),
],
),
),
// Date Picker
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
),
child: Container(
height: 320,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
border: Border.all(
color: Colors.grey.withOpacity(0.2),
),
),
child: SfDateRangePicker(
onSelectionChanged: _onSelectionChanged,
selectionMode:
DateRangePickerSelectionMode.range,
initialSelectedRange:
(widget.initialStartDate != null &&
widget.initialEndDate != null)
? PickerDateRange(
widget.initialStartDate,
widget.initialEndDate,
)
: null,
minDate: widget.minDate,
maxDate: widget.maxDate,
startRangeSelectionColor: widget.primaryColor,
endRangeSelectionColor: widget.primaryColor,
rangeSelectionColor: widget.primaryColor
.withOpacity(0.2),
todayHighlightColor: widget.primaryColor,
headerStyle: DateRangePickerHeaderStyle(
backgroundColor: Colors.transparent,
textAlign: TextAlign.center,
textStyle: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
),
monthViewSettings:
DateRangePickerMonthViewSettings(
viewHeaderStyle:
DateRangePickerViewHeaderStyle(
backgroundColor: Colors.grey
.withOpacity(0.1),
textStyle: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
color: widget.primaryColor,
),
),
),
selectionTextStyle: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 14,
),
rangeTextStyle: TextStyle(
color: widget.primaryColor,
fontWeight: FontWeight.w500,
fontSize: 14,
),
),
),
),
],
),
),
),
// Action Buttons
Padding(
padding: const EdgeInsets.all(20),
child: Row(
children: [
Expanded(
child: OutlinedButton(
onPressed: () => Navigator.of(context).pop(),
style: OutlinedButton.styleFrom(
padding: const EdgeInsets.symmetric(
vertical: 14,
),
side: BorderSide(color: Colors.grey.shade400),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Text(
widget.cancelText,
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: Colors.grey,
),
),
),
),
const SizedBox(width: 16),
Expanded(
child: ElevatedButton(
onPressed: _isValidSelection
? () {
// Call onChanged when confirm button is pressed
if (widget.onChanged != null &&
_selectionChangedArgs?.value
is PickerDateRange) {
final PickerDateRange range =
_selectionChangedArgs!.value;
widget.onChanged!(
range.startDate,
range.endDate,
);
}
Navigator.of(
context,
).pop(_selectionChangedArgs);
}
: null,
style: ElevatedButton.styleFrom(
backgroundColor: widget.primaryColor,
padding: const EdgeInsets.symmetric(
vertical: 14,
),
elevation: 2,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
disabledBackgroundColor: Colors.grey.shade300,
),
child: Text(
widget.confirmText,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: _isValidSelection
? Colors.white
: Colors.grey.shade600,
),
),
),
),
],
),
),
],
),
),
),
),
);
},
);
}
}
@@ -30,7 +30,11 @@ class HomeRightTitle extends StatelessWidget {
children: [
Expanded(
child: Row(
children: [_buildButton('Daftar Pesanan', Icons.list, () {})],
children: [
_buildButton('Daftar Pesanan', Icons.list, () {
context.router.push(OrderRoute(status: 'pending'));
}),
],
),
),
Expanded(
@@ -0,0 +1,71 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../application/order/order_loader/order_loader_bloc.dart';
import '../../../common/theme/theme.dart';
import '../../../injection.dart';
import 'widgets/order_left_panel.dart';
import 'widgets/order_right_panel.dart';
@RoutePage()
class OrderPage extends StatelessWidget implements AutoRouteWrapper {
final String status;
const OrderPage({super.key, required this.status});
@override
Widget build(BuildContext context) {
return MultiBlocListener(
listeners: [
BlocListener<OrderLoaderBloc, OrderLoaderState>(
listenWhen: (previous, current) =>
previous.startDate != current.startDate ||
previous.endDate != current.endDate,
listener: (context, state) {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.fetched(status: status, isRefresh: true),
);
},
),
BlocListener<OrderLoaderBloc, OrderLoaderState>(
listenWhen: (previous, current) => previous.search != current.search,
listener: (context, state) {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.fetched(status: status, isRefresh: true),
);
},
),
],
child: SafeArea(
child: Scaffold(
backgroundColor: AppColor.background,
body: BlocBuilder<OrderLoaderBloc, OrderLoaderState>(
builder: (context, state) {
return Row(
children: [
Expanded(
flex: 2,
child: Material(
color: AppColor.white,
child: OrderLeftPanel(state: state, status: status),
),
),
Expanded(flex: 4, child: OrderRightPanel(state: state)),
],
);
},
),
),
),
);
}
@override
Widget wrappedRoute(BuildContext context) => BlocProvider(
create: (context) =>
getIt<OrderLoaderBloc>()
..add(OrderLoaderEvent.fetched(status: status, isRefresh: true)),
child: this,
);
}
@@ -0,0 +1,130 @@
import 'package:flutter/material.dart';
import '../../../../common/extension/extension.dart';
import '../../../../common/theme/theme.dart';
import '../../../../domain/order/order.dart';
import '../../../components/spaces/space.dart';
class OrderInformation extends StatelessWidget {
final Order? order;
const OrderInformation({super.key, this.order});
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: AppColor.primary,
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
order?.orderNumber ?? "",
style: const TextStyle(
color: Colors.white,
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
_buildStatus(),
],
),
const SizedBox(height: 8),
Row(
children: [
if (order?.orderType == 'dineIn') ...[
_buildRowItem(
Icons.table_restaurant_outlined,
'Meja ${order?.tableNumber}',
),
const SizedBox(width: 16),
],
_buildRowItem(Icons.restaurant_outlined, '${order?.orderType}'),
],
),
const SizedBox(height: 8),
Text(
'Pelanggan: ${order?.metadata['customer_name'] ?? ""}',
style: const TextStyle(color: Colors.white, fontSize: 14),
),
Text(
'Dibuat: ${order?.createdAt.toFormattedDateTime() ?? ""}',
style: const TextStyle(color: Colors.white70, fontSize: 12),
),
],
),
);
}
Row _buildRowItem(IconData icon, String title) {
return Row(
children: [
Icon(icon, color: Colors.white70, size: 16),
const SpaceWidth(4),
Text(
title,
style: const TextStyle(color: Colors.white70, fontSize: 14),
),
],
);
}
Container _buildStatus() {
switch (order?.status) {
case 'pending':
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
decoration: BoxDecoration(
color: Colors.orange,
borderRadius: BorderRadius.circular(12),
),
child: Text(
(order?.status ?? "").toUpperCase(),
style: TextStyle(
color: Colors.white,
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
);
case 'completed':
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
decoration: BoxDecoration(
color: Colors.greenAccent,
borderRadius: BorderRadius.circular(12),
),
child: Text(
(order?.status ?? "").toUpperCase(),
style: TextStyle(
color: Colors.white,
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
);
default:
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
decoration: BoxDecoration(
color: Colors.grey,
borderRadius: BorderRadius.circular(12),
),
child: Text(
(order?.status ?? "").toUpperCase(),
style: TextStyle(
color: Colors.white,
fontSize: 12,
fontWeight: FontWeight.bold,
),
),
);
}
}
}
@@ -0,0 +1,71 @@
import 'package:flutter/widgets.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../application/order/order_loader/order_loader_bloc.dart';
import '../../../../common/theme/theme.dart';
import '../../../components/card/order_card.dart';
import '../../../components/error/order_loader_error_state_widget.dart';
import '../../../components/loader/loader_with_text.dart';
import 'order_title.dart';
class OrderLeftPanel extends StatelessWidget {
final String status;
final OrderLoaderState state;
const OrderLeftPanel({super.key, required this.state, required this.status});
@override
Widget build(BuildContext context) {
return Column(
children: [
OrderTitle(
startDate: state.startDate,
endDate: state.endDate,
title: status == 'pending' ? "Pending Pesanan" : "Daftar Pesanan",
onChanged: (value) {
Future.delayed(const Duration(milliseconds: 800), () {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.searchChange(value),
);
});
},
onDateRangeChanged: (start, end) {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.dateTimeRangeChange(start!, end!),
);
},
),
Expanded(
child: state.failureOption.fold(() {
if (state.isFetching) {
return Center(child: LoaderWithText());
}
if (state.orders.isEmpty) {
return Center(
child: Text(
"Belum ada transaksi saat ini. ",
style: AppStyle.lg.copyWith(fontWeight: FontWeight.bold),
),
);
}
return ListView.builder(
itemCount: state.orders.length,
itemBuilder: (context, index) => GestureDetector(
onTap: () {
context.read<OrderLoaderBloc>().add(
OrderLoaderEvent.setSelectedOrder(state.orders[index]),
);
},
child: OrderCard(
order: state.orders[index],
isActive: state.orders[index] == state.selectedOrder,
),
),
);
}, (f) => OrderLoaderErrorStateWidget(failure: f, status: status)),
),
],
);
}
}
@@ -0,0 +1,357 @@
import 'package:flutter/material.dart';
import '../../../../common/extension/extension.dart';
import '../../../../common/theme/theme.dart';
import '../../../../domain/order/order.dart';
import '../../../components/spaces/space.dart';
class OrderList extends StatelessWidget {
final Order? order;
const OrderList({super.key, this.order});
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.only(top: 16),
decoration: BoxDecoration(
color: AppColor.white,
borderRadius: BorderRadius.circular(16),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildHeader(context),
const SpaceHeight(8),
_buildItemsList(context),
const SpaceHeight(8),
],
),
);
}
Widget _buildHeader(BuildContext context) {
return Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
AppColor.primary.withOpacity(0.1),
AppColor.primary.withOpacity(0.05),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
),
border: Border(
bottom: BorderSide(
color: AppColor.primary.withOpacity(0.1),
width: 1,
),
),
),
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Daftar Pembelian',
style: AppStyle.xl.copyWith(
fontWeight: FontWeight.w700,
letterSpacing: -0.5,
),
),
const SizedBox(height: 4),
Text(
'${order?.orderItems.length ?? 0} item',
style: TextStyle(
color: Colors.grey.shade600,
fontSize: 14,
fontWeight: FontWeight.w500,
),
),
],
),
),
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
decoration: BoxDecoration(
color: AppColor.primary.withOpacity(0.1),
borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColor.primary.withOpacity(0.2)),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.shopping_cart_outlined,
size: 16,
color: AppColor.primary,
),
const SizedBox(width: 4),
Text(
'Order',
style: AppStyle.sm.copyWith(
fontSize: 12,
fontWeight: FontWeight.w600,
),
),
],
),
),
],
),
);
}
Widget _buildItemsList(BuildContext context) {
return Column(
children: List.generate(order?.orderItems.length ?? 0, (index) {
final item = order!.orderItems[index];
return _buildItem(context, item, index);
}).toList(),
);
}
Widget _buildItem(BuildContext context, OrderItem product, int index) {
return AnimatedContainer(
duration: const Duration(milliseconds: 200),
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
decoration: BoxDecoration(
color: AppColor.white,
borderRadius: BorderRadius.circular(12),
border: Border.all(color: Colors.grey.shade200, width: 1),
),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
product.productName,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.2,
),
),
),
_buildStatusBadge(product.status),
],
),
if (product.productVariantName != '') ...[
const SizedBox(height: 4),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 8,
vertical: 4,
),
decoration: BoxDecoration(
color: Colors.grey.shade100,
borderRadius: BorderRadius.circular(6),
),
child: Text(
product.productVariantName,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w500,
color: Colors.grey.shade700,
),
),
),
],
const SizedBox(height: 12),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Harga Satuan',
style: TextStyle(
fontSize: 12,
color: Colors.grey.shade600,
fontWeight: FontWeight.w500,
),
),
const SizedBox(height: 2),
Text(
(product.unitPrice)
.toString()
.currencyFormatRpV2,
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
],
),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 6,
),
decoration: BoxDecoration(
color: AppColor.primary.withOpacity(0.1),
borderRadius: BorderRadius.circular(8),
),
child: Text(
'x${product.quantity}',
style: AppStyle.md.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.primary,
),
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
'Total',
style: AppStyle.sm.copyWith(
color: Colors.grey.shade600,
fontWeight: FontWeight.w500,
),
),
const SizedBox(height: 2),
Text(
(product.totalPrice)
.toString()
.currencyFormatRpV2,
style: AppStyle.lg.copyWith(
fontWeight: FontWeight.w700,
color: AppColor.primary,
),
),
],
),
],
),
],
),
),
],
),
if (order?.splitType == 'ITEM' && order?.status == 'pending') ...[
SpaceHeight(6),
Align(
alignment: Alignment.centerRight,
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 10,
vertical: 4,
),
decoration: BoxDecoration(
color: AppColor.primary.withOpacity(0.2),
borderRadius: BorderRadius.circular(8),
border: Border.all(color: AppColor.primary),
),
child: RichText(
text: TextSpan(
children: [
TextSpan(
text: '${product.paidQuantity} ',
style: AppStyle.sm.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.primary,
),
),
TextSpan(
text: 'dari ',
style: AppStyle.sm.copyWith(color: AppColor.primary),
),
TextSpan(
text: '${product.quantity} ',
style: AppStyle.sm.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.primary,
),
),
TextSpan(
text: 'kuantiti telah dibayar.',
style: AppStyle.sm.copyWith(color: AppColor.primary),
),
],
),
),
),
),
],
],
),
),
);
}
Widget _buildStatusBadge(String? status) {
Color backgroundColor;
Color textColor;
String displayText;
IconData icon;
switch (status) {
case "pending":
backgroundColor = Colors.white;
textColor = Colors.white;
displayText = "Pending";
icon = Icons.access_time;
break;
case "cancelled":
backgroundColor = Colors.red.withOpacity(0.1);
textColor = Colors.red.shade700;
displayText = "Batal";
icon = Icons.cancel_outlined;
break;
case "refund":
backgroundColor = Colors.purple.withOpacity(0.1);
textColor = Colors.purple.shade700;
displayText = "Refund";
icon = Icons.undo;
break;
default:
backgroundColor = Colors.green.withOpacity(0.1);
textColor = Colors.green.shade700;
displayText = "Selesai";
icon = Icons.check_circle_outline;
}
return Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6),
decoration: BoxDecoration(
color: backgroundColor,
borderRadius: BorderRadius.circular(20),
border: Border.all(color: textColor.withOpacity(0.2)),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(icon, size: 14, color: textColor),
const SizedBox(width: 4),
Text(
displayText,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
color: textColor,
),
),
],
),
);
}
}
@@ -0,0 +1,166 @@
import 'package:flutter/material.dart';
import '../../../../common/extension/extension.dart';
import '../../../../common/theme/theme.dart';
import '../../../../domain/order/order.dart';
import '../../../components/spaces/space.dart';
class OrderListPayment extends StatelessWidget {
final Order? order;
const OrderListPayment({super.key, this.order});
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Informasi Pembayaran',
style: AppStyle.lg.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.primary,
),
),
_buildPaymentStatus(),
],
),
const SpaceHeight(12),
...List.generate(
order?.payments.length ?? 0,
(index) => Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: _buildPaymentItem(
order?.payments[index] ?? PaymentOrder.empty(),
),
),
),
const SpaceHeight(4),
const Divider(),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Jumlah yang Dibayar',
style: AppStyle.md.copyWith(color: Colors.grey.shade700),
),
Text(
(order?.totalPaid ?? 0).currencyFormatRpV2,
style: TextStyle(fontWeight: FontWeight.w500),
),
],
),
if (((order?.totalAmount ?? 0) - (order?.totalPaid ?? 0)) != 0) ...[
const SpaceHeight(4),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Sisa Tagihan',
style: TextStyle(
color: Colors.red.shade700,
fontWeight: FontWeight.w500,
),
),
Text(
((order?.totalAmount ?? 0) - (order?.totalPaid ?? 0))
.currencyFormatRpV2,
style: TextStyle(
color: Colors.red.shade700,
fontWeight: FontWeight.w500,
),
),
],
),
],
],
),
);
}
Container _buildPaymentStatus() {
switch (order?.paymentStatus) {
case 'completed':
return Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: AppColor.success.withOpacity(0.2),
borderRadius: BorderRadius.circular(4),
),
child: Text(
(order?.paymentStatus ?? "").toTitleCase(),
style: AppStyle.xs.copyWith(
fontSize: 10,
fontWeight: FontWeight.bold,
color: AppColor.success,
),
),
);
default:
return Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: Colors.amber.shade100,
borderRadius: BorderRadius.circular(4),
),
child: Text(
(order?.paymentStatus ?? "").toTitleCase(),
style: AppStyle.xs.copyWith(
fontSize: 10,
fontWeight: FontWeight.bold,
color: Colors.amber.shade800,
),
),
);
}
}
Row _buildPaymentItem(PaymentOrder payment) {
return Row(
children: [
Container(
width: 32,
height: 32,
decoration: BoxDecoration(
color: Colors.green.shade100,
borderRadius: BorderRadius.circular(4),
),
child: Icon(Icons.payments, color: Colors.green.shade700, size: 16),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
payment.paymentMethodName,
style: AppStyle.md.copyWith(fontWeight: FontWeight.w500),
),
if ((payment.splitTotal) > 1)
Text(
'Split ${payment.splitNumber} of ${payment.splitTotal}',
style: AppStyle.md.copyWith(color: Colors.grey.shade600),
),
],
),
),
Text(
(payment.amount).currencyFormatRpV2,
style: AppStyle.md.copyWith(
fontWeight: FontWeight.w600,
color: AppColor.success,
),
),
],
);
}
}
@@ -0,0 +1,88 @@
import 'package:flutter/material.dart';
import '../../../../common/extension/extension.dart';
import '../../../../common/theme/theme.dart';
import '../../../../domain/order/order.dart';
import '../../../components/border/dashed_border.dart';
import '../../../components/spaces/space.dart';
class OrderPaymentSummary extends StatelessWidget {
final Order? order;
const OrderPaymentSummary({super.key, this.order});
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Ringkasan Pembayaran',
style: AppStyle.lg.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.primary,
),
),
const SpaceHeight(12),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Subtotal',
style: AppStyle.md.copyWith(color: Colors.grey.shade700),
),
Text((order?.subtotal ?? 0).currencyFormatRpV2),
],
),
const SpaceHeight(4),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Tax',
style: AppStyle.md.copyWith(color: Colors.grey.shade700),
),
Text((order?.taxAmount ?? 0).currencyFormatRpV2),
],
),
const SpaceHeight(4),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Discount',
style: AppStyle.md.copyWith(color: Colors.grey.shade700),
),
Text((order?.discountAmount ?? 0).currencyFormatRpV2),
],
),
const SpaceHeight(8),
const DashedDivider(color: AppColor.border),
const SpaceHeight(8),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text(
'Total',
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
Text(
(order?.totalAmount ?? 0).currencyFormatRpV2,
style: AppStyle.lg.copyWith(
fontWeight: FontWeight.bold,
color: AppColor.primary,
),
),
],
),
],
),
);
}
}
@@ -0,0 +1,114 @@
import 'package:flutter/material.dart';
import '../../../../application/order/order_loader/order_loader_bloc.dart';
import '../../../../common/theme/theme.dart';
import '../../../components/button/button.dart';
import '../../../components/spaces/space.dart';
import 'order_information.dart';
import 'order_list.dart';
import 'order_list_payment.dart';
import 'order_payment_summary.dart';
class OrderRightPanel extends StatelessWidget {
final OrderLoaderState state;
const OrderRightPanel({super.key, required this.state});
@override
Widget build(BuildContext context) {
if (state.selectedOrder == null) {
return Center(
child: Text(
"Belum ada order yang dipilih.",
style: AppStyle.lg.copyWith(fontWeight: FontWeight.bold),
),
);
}
return Column(
children: [
Expanded(
child: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
OrderInformation(order: state.selectedOrder),
OrderList(order: state.selectedOrder),
const SpaceHeight(16),
OrderPaymentSummary(order: state.selectedOrder),
const SpaceHeight(16),
if (state.selectedOrder?.payments != null &&
state.selectedOrder?.payments.isNotEmpty == true) ...[
OrderListPayment(order: state.selectedOrder),
const SpaceHeight(20),
],
],
),
),
),
),
Container(
padding: EdgeInsets.all(16),
decoration: BoxDecoration(color: AppColor.white),
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
AppElevatedButton.outlined(
onPressed: () {
if (state.selectedOrder?.status == 'completed') {
// onPrintRecipt(
// context,
// order: orderDetail!,
// paymentMethod:
// orderDetail!.payments
// ?.map((p) => p.paymentMethodName)
// .join(', ') ??
// "",
// nominalBayar: orderDetail?.totalPaid ?? 0,
// kembalian: 0,
// productQuantity: orderDetail!.orderItems!
// .toProductQuantities(),
// );
} else {
// onPrintBill(
// context,
// productQuantity: orderDetail!.orderItems!
// .toProductQuantities(),
// order: orderDetail!,
// );
}
},
label: 'Print Bill',
icon: Icon(Icons.print),
),
SpaceWidth(8),
if (state.selectedOrder?.status == 'pending') ...[
AppElevatedButton.outlined(
onPressed: () {},
label: 'Void',
icon: Icon(Icons.undo),
),
SpaceWidth(8),
AppElevatedButton.outlined(
onPressed: () {
// context.push(SplitBillPage(order: orderDetail!));
},
label: 'Split Bill',
icon: Icon(Icons.calculate_outlined),
),
SpaceWidth(8),
AppElevatedButton.filled(
width: 120,
onPressed: () {},
label: 'Bayar',
icon: Icon(Icons.payment, color: Colors.white),
),
],
],
),
),
],
);
}
}
@@ -0,0 +1,93 @@
import 'package:flutter/material.dart';
import '../../../../common/extension/extension.dart';
import '../../../../common/theme/theme.dart';
import '../../../components/field/field.dart';
import '../../../components/page/page_title.dart';
import '../../../components/picker/date_range_picker.dart';
import '../../../components/spaces/space.dart';
class OrderTitle extends StatelessWidget {
final String title;
final DateTime startDate;
final DateTime endDate;
final Function(String) onChanged;
final void Function(DateTime? start, DateTime? end) onDateRangeChanged;
const OrderTitle({
super.key,
required this.title,
required this.startDate,
required this.endDate,
required this.onChanged,
required this.onDateRangeChanged,
});
@override
Widget build(BuildContext context) {
return PageTitle(
title: title,
bottom: Container(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0),
decoration: BoxDecoration(
color: AppColor.white,
border: Border(
bottom: BorderSide(color: AppColor.border, width: 1.0),
),
),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
startDate.toFormattedDate() == endDate.toFormattedDate()
? startDate.toFormattedDate()
: '${startDate.toFormattedDate()} - ${endDate.toFormattedDate()}',
style: AppStyle.md.copyWith(fontWeight: FontWeight.w600),
),
Text(
'0 Pesanan',
style: AppStyle.md.copyWith(fontWeight: FontWeight.w600),
),
],
),
SpaceHeight(16),
Row(
children: [
Expanded(
child: AppTextFormField(
onChanged: onChanged,
label: 'Cari Pesanan',
showLabel: false,
),
),
SpaceWidth(12),
GestureDetector(
onTap: () => DateRangePickerModal.show(
context: context,
initialStartDate: startDate,
initialEndDate: endDate,
primaryColor: AppColor.primary,
onChanged: onDateRangeChanged,
),
child: Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: AppColor.primary,
borderRadius: BorderRadius.circular(12),
),
child: Icon(
Icons.filter_list_outlined,
color: AppColor.white,
size: 24,
),
),
),
],
),
],
),
),
);
}
}
+3
View File
@@ -28,5 +28,8 @@ class AppRouter extends RootStackRouter {
// Checkout
AutoRoute(page: CheckoutRoute.page),
// Order
AutoRoute(page: OrderRoute.page),
];
}
+91 -51
View File
@@ -20,90 +20,93 @@ import 'package:apskel_pos_flutter_v2/presentation/pages/main/pages/customer/cus
import 'package:apskel_pos_flutter_v2/presentation/pages/main/pages/home/home_page.dart'
as _i3;
import 'package:apskel_pos_flutter_v2/presentation/pages/main/pages/report/report_page.dart'
as _i6;
import 'package:apskel_pos_flutter_v2/presentation/pages/main/pages/setting/setting_page.dart'
as _i7;
import 'package:apskel_pos_flutter_v2/presentation/pages/main/pages/table/table_page.dart'
as _i10;
import 'package:apskel_pos_flutter_v2/presentation/pages/splash/splash_page.dart'
import 'package:apskel_pos_flutter_v2/presentation/pages/main/pages/setting/setting_page.dart'
as _i8;
import 'package:apskel_pos_flutter_v2/presentation/pages/sync/sync_page.dart'
import 'package:apskel_pos_flutter_v2/presentation/pages/main/pages/table/table_page.dart'
as _i11;
import 'package:apskel_pos_flutter_v2/presentation/pages/order/order_page.dart'
as _i6;
import 'package:apskel_pos_flutter_v2/presentation/pages/splash/splash_page.dart'
as _i9;
import 'package:auto_route/auto_route.dart' as _i11;
import 'package:apskel_pos_flutter_v2/presentation/pages/sync/sync_page.dart'
as _i10;
import 'package:auto_route/auto_route.dart' as _i12;
import 'package:flutter/widgets.dart' as _i13;
/// generated route for
/// [_i1.CheckoutPage]
class CheckoutRoute extends _i11.PageRouteInfo<void> {
const CheckoutRoute({List<_i11.PageRouteInfo>? children})
class CheckoutRoute extends _i12.PageRouteInfo<void> {
const CheckoutRoute({List<_i12.PageRouteInfo>? children})
: super(CheckoutRoute.name, initialChildren: children);
static const String name = 'CheckoutRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return _i11.WrappedRoute(child: const _i1.CheckoutPage());
return _i12.WrappedRoute(child: const _i1.CheckoutPage());
},
);
}
/// generated route for
/// [_i2.CustomerPage]
class CustomerRoute extends _i11.PageRouteInfo<void> {
const CustomerRoute({List<_i11.PageRouteInfo>? children})
class CustomerRoute extends _i12.PageRouteInfo<void> {
const CustomerRoute({List<_i12.PageRouteInfo>? children})
: super(CustomerRoute.name, initialChildren: children);
static const String name = 'CustomerRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return _i11.WrappedRoute(child: const _i2.CustomerPage());
return _i12.WrappedRoute(child: const _i2.CustomerPage());
},
);
}
/// generated route for
/// [_i3.HomePage]
class HomeRoute extends _i11.PageRouteInfo<void> {
const HomeRoute({List<_i11.PageRouteInfo>? children})
class HomeRoute extends _i12.PageRouteInfo<void> {
const HomeRoute({List<_i12.PageRouteInfo>? children})
: super(HomeRoute.name, initialChildren: children);
static const String name = 'HomeRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return _i11.WrappedRoute(child: const _i3.HomePage());
return _i12.WrappedRoute(child: const _i3.HomePage());
},
);
}
/// generated route for
/// [_i4.LoginPage]
class LoginRoute extends _i11.PageRouteInfo<void> {
const LoginRoute({List<_i11.PageRouteInfo>? children})
class LoginRoute extends _i12.PageRouteInfo<void> {
const LoginRoute({List<_i12.PageRouteInfo>? children})
: super(LoginRoute.name, initialChildren: children);
static const String name = 'LoginRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return _i11.WrappedRoute(child: const _i4.LoginPage());
return _i12.WrappedRoute(child: const _i4.LoginPage());
},
);
}
/// generated route for
/// [_i5.MainPage]
class MainRoute extends _i11.PageRouteInfo<void> {
const MainRoute({List<_i11.PageRouteInfo>? children})
class MainRoute extends _i12.PageRouteInfo<void> {
const MainRoute({List<_i12.PageRouteInfo>? children})
: super(MainRoute.name, initialChildren: children);
static const String name = 'MainRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return const _i5.MainPage();
@@ -112,81 +115,118 @@ class MainRoute extends _i11.PageRouteInfo<void> {
}
/// generated route for
/// [_i6.ReportPage]
class ReportRoute extends _i11.PageRouteInfo<void> {
const ReportRoute({List<_i11.PageRouteInfo>? children})
/// [_i6.OrderPage]
class OrderRoute extends _i12.PageRouteInfo<OrderRouteArgs> {
OrderRoute({
_i13.Key? key,
required String status,
List<_i12.PageRouteInfo>? children,
}) : super(
OrderRoute.name,
args: OrderRouteArgs(key: key, status: status),
initialChildren: children,
);
static const String name = 'OrderRoute';
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
final args = data.argsAs<OrderRouteArgs>();
return _i6.OrderPage(key: args.key, status: args.status);
},
);
}
class OrderRouteArgs {
const OrderRouteArgs({this.key, required this.status});
final _i13.Key? key;
final String status;
@override
String toString() {
return 'OrderRouteArgs{key: $key, status: $status}';
}
}
/// generated route for
/// [_i7.ReportPage]
class ReportRoute extends _i12.PageRouteInfo<void> {
const ReportRoute({List<_i12.PageRouteInfo>? children})
: super(ReportRoute.name, initialChildren: children);
static const String name = 'ReportRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return const _i6.ReportPage();
return const _i7.ReportPage();
},
);
}
/// generated route for
/// [_i7.SettingPage]
class SettingRoute extends _i11.PageRouteInfo<void> {
const SettingRoute({List<_i11.PageRouteInfo>? children})
/// [_i8.SettingPage]
class SettingRoute extends _i12.PageRouteInfo<void> {
const SettingRoute({List<_i12.PageRouteInfo>? children})
: super(SettingRoute.name, initialChildren: children);
static const String name = 'SettingRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return const _i7.SettingPage();
return const _i8.SettingPage();
},
);
}
/// generated route for
/// [_i8.SplashPage]
class SplashRoute extends _i11.PageRouteInfo<void> {
const SplashRoute({List<_i11.PageRouteInfo>? children})
/// [_i9.SplashPage]
class SplashRoute extends _i12.PageRouteInfo<void> {
const SplashRoute({List<_i12.PageRouteInfo>? children})
: super(SplashRoute.name, initialChildren: children);
static const String name = 'SplashRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return const _i8.SplashPage();
return const _i9.SplashPage();
},
);
}
/// generated route for
/// [_i9.SyncPage]
class SyncRoute extends _i11.PageRouteInfo<void> {
const SyncRoute({List<_i11.PageRouteInfo>? children})
/// [_i10.SyncPage]
class SyncRoute extends _i12.PageRouteInfo<void> {
const SyncRoute({List<_i12.PageRouteInfo>? children})
: super(SyncRoute.name, initialChildren: children);
static const String name = 'SyncRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return _i11.WrappedRoute(child: const _i9.SyncPage());
return _i12.WrappedRoute(child: const _i10.SyncPage());
},
);
}
/// generated route for
/// [_i10.TablePage]
class TableRoute extends _i11.PageRouteInfo<void> {
const TableRoute({List<_i11.PageRouteInfo>? children})
/// [_i11.TablePage]
class TableRoute extends _i12.PageRouteInfo<void> {
const TableRoute({List<_i12.PageRouteInfo>? children})
: super(TableRoute.name, initialChildren: children);
static const String name = 'TableRoute';
static _i11.PageInfo page = _i11.PageInfo(
static _i12.PageInfo page = _i12.PageInfo(
name,
builder: (data) {
return _i11.WrappedRoute(child: const _i10.TablePage());
return _i12.WrappedRoute(child: const _i11.TablePage());
},
);
}