199 lines
7.1 KiB
Dart
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),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|