feat: sales page

This commit is contained in:
efrilm
2025-08-02 10:50:48 +07:00
parent e825e5daed
commit 45b348684e
17 changed files with 1371 additions and 138 deletions
@@ -0,0 +1,123 @@
import 'package:enaklo_pos/core/components/buttons.dart';
import 'package:enaklo_pos/core/components/custom_modal_dialog.dart';
import 'package:enaklo_pos/core/components/spaces.dart';
import 'package:enaklo_pos/core/constants/colors.dart';
import 'package:enaklo_pos/core/extensions/build_context_ext.dart';
import 'package:enaklo_pos/core/extensions/date_time_ext.dart';
import 'package:flutter/material.dart';
class SalesFilterDialog extends StatefulWidget {
final DateTime startDate;
final DateTime endDate;
final void Function(DateTime start, DateTime end) onDateRangeChanged;
const SalesFilterDialog(
{super.key,
required this.startDate,
required this.endDate,
required this.onDateRangeChanged});
@override
State<SalesFilterDialog> createState() => _SalesFilterDialogState();
}
class _SalesFilterDialogState extends State<SalesFilterDialog> {
late DateTimeRange selectedDateRange;
@override
void initState() {
selectedDateRange =
DateTimeRange(start: widget.startDate, end: widget.endDate);
super.initState();
}
Future<void> _selectDateRange(BuildContext context) async {
final DateTimeRange? picked = await showDateRangePicker(
context: context,
initialDateRange: selectedDateRange,
firstDate: DateTime(2020),
lastDate: DateTime(2100),
builder: (context, child) {
return Theme(
data: Theme.of(context).copyWith(
colorScheme: ColorScheme.light(
primary: Colors.blue, // Header color
onPrimary: Colors.white, // Header text color
onSurface: Colors.black, // Body text color
),
),
child: child!,
);
},
);
if (picked != null) {
setState(() {
selectedDateRange = picked;
});
}
}
@override
Widget build(BuildContext context) {
return CustomModalDialog(
title: 'Filter',
contentPadding: const EdgeInsets.all(16.0),
child: Column(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Periode',
style: TextStyle(
color: AppColors.black,
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
GestureDetector(
onTap: () async => await _selectDateRange(context),
child: Container(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
margin: EdgeInsets.only(top: 8),
decoration: BoxDecoration(
border: Border.all(
color: AppColors.primary,
),
borderRadius: BorderRadius.circular(8),
),
child: Row(
children: [
Expanded(
child: Text(
'${selectedDateRange.start.toFormattedDate2()} - ${selectedDateRange.end.toFormattedDate2()}',
style: TextStyle(
color: AppColors.black,
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
),
Icon(
Icons.calendar_month_outlined,
color: AppColors.primary,
),
],
),
),
),
SpaceHeight(24),
Button.filled(
onPressed: () {
context.pop();
widget.onDateRangeChanged(
selectedDateRange.start, selectedDateRange.end);
},
label: 'Terapkan'),
],
),
],
),
);
}
}