feat(client): 录单表单优化 + 可搜索下拉支持新建 + 日期选择器组件
新增 DatePickerField 日期选择器与 date_util;可搜索下拉 SearchableOptionField 支持内联新建选项;入库/出库录单表单、商品页、财务页、app_shell 导航相应调整。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
/// 日期工具:统一 `yyyy-MM-dd` 的格式化与解析,收敛各处重复的 padLeft 逻辑。
|
||||
library;
|
||||
|
||||
/// 格式化为 `yyyy-MM-dd`(提交后端的统一格式)。
|
||||
String formatYmd(DateTime d) =>
|
||||
'${d.year}-${d.month.toString().padLeft(2, '0')}-${d.day.toString().padLeft(2, '0')}';
|
||||
|
||||
/// 解析 `yyyy-MM-dd`(或更长的带时间字符串,取前 10 位)。无效返回 null。
|
||||
DateTime? parseYmd(String? s) {
|
||||
if (s == null || s.isEmpty) return null;
|
||||
final t = s.length >= 10 ? s.substring(0, 10) : s;
|
||||
return DateTime.tryParse(t);
|
||||
}
|
||||
|
||||
/// 组合年/月/日为 `yyyy-MM-dd`,自动把超出当月的「日」clamp 回当月最大值
|
||||
/// (如 2 月选 31 → 28/29)。任一为空返回 null。
|
||||
String? composeYmd(int? year, int? month, int? day) {
|
||||
if (year == null || month == null || day == null) return null;
|
||||
final maxDay = DateTime(year, month + 1, 0).day; // 下月第 0 天 = 当月最后一天
|
||||
final d = day > maxDay ? maxDay : day;
|
||||
return formatYmd(DateTime(year, month, d));
|
||||
}
|
||||
Reference in New Issue
Block a user