bharat_erp/lib/modules/settings/presentation/screens/asset_settings_screen.dart
2026-07-14 18:15:26 +05:30

199 lines
7.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../../core/constants/enums.dart';
import '../../../../shared/widgets/app_button.dart';
import '../../../../shared/widgets/app_text_field.dart';
import '../../domain/entities/app_settings.dart';
import '../providers/settings_provider.dart';
import '../widgets/settings_widgets.dart';
import '../../../../shared/widgets/app_toast.dart';
class AssetSettingsScreen extends ConsumerStatefulWidget {
const AssetSettingsScreen({super.key});
@override
ConsumerState<AssetSettingsScreen> createState() => _AssetSettingsScreenState();
}
class _AssetSettingsScreenState extends ConsumerState<AssetSettingsScreen> {
final _formKey = GlobalKey<FormState>();
late final TextEditingController _prefixController;
late final TextEditingController _runningLengthController;
late final TextEditingController _warrantyReminderController;
late final TextEditingController _expiryAlertController;
late bool _autoGenerate;
late bool _qrEnabled;
late String _qrFormat;
late String _labelSize;
late Set<String> _enabledStatuses;
@override
void initState() {
super.initState();
final asset = ref.read(appSettingsProvider).asset;
_prefixController = TextEditingController(text: asset.codePrefix);
_runningLengthController =
TextEditingController(text: '${asset.runningNumberLength}');
_warrantyReminderController =
TextEditingController(text: '${asset.warrantyReminderDays}');
_expiryAlertController =
TextEditingController(text: '${asset.expiryAlertDays}');
_autoGenerate = asset.autoGenerateCode;
_qrEnabled = asset.qrEnabled;
_qrFormat = asset.qrFormat;
_labelSize = asset.labelSize;
_enabledStatuses = asset.enabledStatuses.toSet();
}
@override
void dispose() {
_prefixController.dispose();
_runningLengthController.dispose();
_warrantyReminderController.dispose();
_expiryAlertController.dispose();
super.dispose();
}
Future<void> _save() async {
if (!_formKey.currentState!.validate()) return;
await ref.read(appSettingsProvider.notifier).updateAsset(
AssetSettingsConfig(
codePrefix: _prefixController.text.trim(),
runningNumberLength: int.parse(_runningLengthController.text.trim()),
autoGenerateCode: _autoGenerate,
warrantyReminderDays:
int.parse(_warrantyReminderController.text.trim()),
expiryAlertDays: int.parse(_expiryAlertController.text.trim()),
qrEnabled: _qrEnabled,
qrFormat: _qrFormat,
labelSize: _labelSize,
enabledStatuses: _enabledStatuses.toList(),
),
);
if (mounted) {
showAppToastFromSnackBar(context,
const SnackBar(content: Text('Asset settings saved')),
);
}
}
@override
Widget build(BuildContext context) {
final prefix = _prefixController.text.trim().isEmpty
? 'AST'
: _prefixController.text.trim();
final length = int.tryParse(_runningLengthController.text.trim()) ?? 6;
final preview = '$prefix-${'0' * (length - 1)}1';
return SettingsPageLayout(
title: 'Asset Settings',
subtitle: 'Asset codes, statuses, warranty, and QR configuration',
child: Form(
key: _formKey,
child: Column(
children: [
SettingsFormCard(
title: 'Asset Code Generation',
subtitle: 'Preview: $preview',
children: [
AppTextField(
controller: _prefixController,
label: 'Prefix',
hint: 'AST, LAP, MOB',
onChanged: (_) => setState(() {}),
),
const SizedBox(height: 16),
AppTextField(
controller: _runningLengthController,
label: 'Running Number Length',
keyboardType: TextInputType.number,
onChanged: (_) => setState(() {}),
),
SettingsSwitchTile(
title: 'Auto Generate Asset Code',
value: _autoGenerate,
onChanged: (v) => setState(() => _autoGenerate = v),
),
],
),
const SizedBox(height: 16),
SettingsFormCard(
title: 'Asset Statuses',
subtitle: 'Enable or disable statuses used in the system',
children: AssetStatus.values.map((status) {
return CheckboxListTile(
contentPadding: EdgeInsets.zero,
title: Text(status.label),
value: _enabledStatuses.contains(status.value),
onChanged: (checked) {
setState(() {
if (checked == true) {
_enabledStatuses.add(status.value);
} else {
_enabledStatuses.remove(status.value);
}
});
},
);
}).toList(),
),
const SizedBox(height: 16),
SettingsFormCard(
title: 'Warranty Settings',
children: [
AppTextField(
controller: _warrantyReminderController,
label: 'Warranty Reminder Days',
keyboardType: TextInputType.number,
),
const SizedBox(height: 16),
AppTextField(
controller: _expiryAlertController,
label: 'Expiry Alert Days',
keyboardType: TextInputType.number,
),
],
),
const SizedBox(height: 16),
SettingsFormCard(
title: 'QR Settings',
children: [
SettingsSwitchTile(
title: 'Enable QR Codes',
value: _qrEnabled,
onChanged: (v) => setState(() => _qrEnabled = v),
),
SettingsDropdownField<String>(
label: 'QR Format',
value: _qrFormat,
items: const ['asset_id', 'asset_code', 'url'],
itemLabel: (v) => switch (v) {
'asset_id' => 'Asset ID',
'asset_code' => 'Asset Code',
'url' => 'URL Link',
_ => v,
},
onChanged: (v) => setState(() => _qrFormat = v!),
),
const SizedBox(height: 16),
SettingsDropdownField<String>(
label: 'Print Label Size',
value: _labelSize,
items: const ['50x25mm', '40x20mm', '70x35mm'],
itemLabel: (v) => v,
onChanged: (v) => setState(() => _labelSize = v!),
),
],
),
const SizedBox(height: 24),
AppButton(label: 'Save Changes', onPressed: _save),
],
),
),
);
}
}