h-1.flutter.4/@workspace/lib/widgets/master_edit_fields.dart
joe 9cec464868 feat: 各画面の AppBar に画面 ID を追加
- estimate_screen.dart: /S1. 見積入力
- invoice_screen.dart: /S2. 請求書入力
- order_screen.dart: /S3. 受発注入力
- sales_return_screen.dart: /S5. 売上返品入力
- sales_screen.dart: /S4. 売上入力(レジ)
- product_master_screen.dart: /M1. 商品マスタ
- customer_master_screen.dart: /M2. 得意先マスタ
- supplier_master_screen.dart: /M3. 仕入先マスタ
- warehouse_master_screen.dart: /M4. 倉庫マスタ
- employee_master_screen.dart: /M5. 担当者マスタ

README.md にも画面 ID マッピングを明記
2026-03-10 16:33:07 +09:00

201 lines
No EOL
5.4 KiB
Dart

import 'package:flutter/material.dart';
/// マスタ編集用の汎用テキストフィールドウィジェット
class MasterTextField extends StatelessWidget {
final String label;
final String? initialValue;
final String? hintText;
final VoidCallback? onTap;
const MasterTextField({
super.key,
required this.label,
this.initialValue,
this.hintText,
this.onTap,
});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(label, style: const TextStyle(fontWeight: FontWeight.bold)),
TextFormField(
initialValue: initialValue,
decoration: InputDecoration(
hintText: hintText,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4.0),
),
contentPadding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 12.0),
),
onTap: onTap,
textInputAction: TextInputAction.done,
),
],
),
);
}
}
/// マスタ編集用の汎用数値フィールドウィジェット
class MasterNumberField extends StatelessWidget {
final String label;
final double? initialValue;
final String? hintText;
final VoidCallback? onTap;
const MasterNumberField({
super.key,
required this.label,
this.initialValue,
this.hintText,
this.onTap,
});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(label, style: const TextStyle(fontWeight: FontWeight.bold)),
TextFormField(
initialValue: initialValue?.toString(),
decoration: InputDecoration(
hintText: hintText,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4.0),
),
contentPadding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 12.0),
),
onTap: onTap,
keyboardType: TextInputType.number,
textInputAction: TextInputAction.done,
),
],
),
);
}
}
/// ドロップダウンフィールドウィジェット
class MasterDropdownField<T> extends StatelessWidget {
final String label;
final List<String> options;
final String? selectedOption;
final VoidCallback? onTap;
const MasterDropdownField({
super.key,
required this.label,
required this.options,
this.selectedOption,
this.onTap,
});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(label, style: const TextStyle(fontWeight: FontWeight.bold)),
DropdownButtonFormField<String>(
value: selectedOption,
items: options.map((option) => DropdownMenuItem<String>(
value: option,
child: Text(option),
)).toList(),
decoration: InputDecoration(
hintText: options.isEmpty ? null : options.first,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4.0),
),
contentPadding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 12.0),
),
onTap: onTap,
isExpanded: true,
),
],
),
);
}
}
/// テキストエリアウィジェット
class MasterTextArea extends StatelessWidget {
final String label;
final String? initialValue;
final String? hintText;
final VoidCallback? onTap;
const MasterTextArea({
super.key,
required this.label,
this.initialValue,
this.hintText,
this.onTap,
});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(label, style: const TextStyle(fontWeight: FontWeight.bold)),
TextFormField(
initialValue: initialValue,
decoration: InputDecoration(
hintText: hintText,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4.0),
),
contentPadding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 12.0),
),
maxLines: 3,
onTap: onTap,
textInputAction: TextInputAction.newline,
),
],
),
);
}
}
/// チェックボックスウィジェット
class MasterCheckBox extends StatelessWidget {
final String label;
final bool? initialValue;
final VoidCallback? onChanged;
const MasterCheckBox({
super.key,
required this.label,
this.initialValue,
this.onChanged,
});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0),
child: Row(
children: [
Expanded(child: Text(label)),
Checkbox(
value: initialValue,
onChanged: onChanged ?? (_ => null),
),
],
),
);
}
}