Skip to content

Commit

Permalink
feat: [DatePicker] Added fieldFlex as prop to control the width. (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
bdlukaa authored Apr 8, 2024
2 parents ed77764 + 65db7dd commit 9c92486
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 3 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
## NEXT
* feat: Added `fieldFlex` to the DatePicker to control the width.

## 4.8.6

* fix: Pop the menu flyout before than calling the close callback ([#1009](https://github.com/bdlukaa/fluent_ui/issues/1009))
Expand Down
19 changes: 19 additions & 0 deletions example/lib/screens/forms/date_picker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class DatePickerPage extends StatefulWidget {
class _DatePickerPageState extends State<DatePickerPage> with PageMixin {
DateTime? simpleTime;
DateTime? hiddenTime;
DateTime? flexTime;

bool showYear = true;
bool showMonth = true;
Expand Down Expand Up @@ -105,6 +106,24 @@ DatePicker(
),
),
),
subtitle(content: const Text('A DatePicker with flex layout')),
CardHighlight(
codeSnippet: '''DateTime? selected;
DatePicker(
selected: selected,
fieldFlex: const [2, 3, 2], // Same order as fieldOrder
onChanged: (time) => setState(() => selected = time),
),''',
child: Align(
alignment: AlignmentDirectional.centerStart,
child: DatePicker(
selected: flexTime,
fieldFlex: const [2, 3, 2],
onChanged: (v) => setState(() => flexTime = v),
),
),
),
],
);
}
Expand Down
41 changes: 38 additions & 3 deletions lib/src/controls/form/pickers/date_picker.dart
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,13 @@ class DatePicker extends StatefulWidget {
this.autofocus = false,
this.locale,
this.fieldOrder,
this.fieldFlex,
}) : startDate = startDate ?? DateTime.now().subtract(kYearDuration * 100),
endDate = endDate ?? DateTime.now().add(kYearDuration * 25);
endDate = endDate ?? DateTime.now().add(kYearDuration * 25),
assert(
fieldFlex == null || fieldFlex.length == 3,
'fieldFlex must be null or have a length of 3',
);

/// The current date selected date.
///
Expand Down Expand Up @@ -153,6 +158,16 @@ class DatePicker extends StatefulWidget {
/// on the current locale
final List<DatePickerField>? fieldOrder;

/// The flex of the fields.
///
/// if null, the flex is base on the current locale.
///
/// See also:
///
/// * [getDateFlexFromLocale], which returns the flex of the fields based
/// on the current locale
final List<int>? fieldFlex;

@override
State<DatePicker> createState() => _DatePickerState();

Expand Down Expand Up @@ -268,6 +283,7 @@ class _DatePickerState extends State<DatePicker> {
final locale = widget.locale ?? Localizations.maybeLocaleOf(context);

final fieldOrder = widget.fieldOrder ?? getDateOrderFromLocale(locale);
final fieldFlex = widget.fieldFlex ?? getDateFlexFromLocale(locale);
assert(fieldOrder.isNotEmpty);
assert(
fieldOrder.where((f) => f == DatePickerField.month).length <= 1,
Expand Down Expand Up @@ -298,6 +314,7 @@ class _DatePickerState extends State<DatePicker> {
yearController: _yearController,
locale: widget.locale,
fieldOrder: fieldOrder,
fieldFlex: fieldFlex,
);
},
pickerHeight: widget.popupHeight,
Expand Down Expand Up @@ -326,7 +343,7 @@ class _DatePickerState extends State<DatePicker> {

final monthWidgets = [
Expanded(
flex: 2,
flex: fieldFlex[fieldOrder.indexOf(DatePickerField.month)],
child: Padding(
padding: widget.contentPadding,
child: Text(
Expand All @@ -343,6 +360,7 @@ class _DatePickerState extends State<DatePicker> {

final dayWidget = [
Expanded(
flex: fieldFlex[fieldOrder.indexOf(DatePickerField.day)],
child: Text(
widget.selected == null
? localizations.day
Expand All @@ -358,6 +376,7 @@ class _DatePickerState extends State<DatePicker> {

final yearWidgets = [
Expanded(
flex: fieldFlex[fieldOrder.indexOf(DatePickerField.year)],
child: Text(
widget.selected == null
? localizations.year
Expand Down Expand Up @@ -434,6 +453,7 @@ class _DatePickerContentPopUp extends StatefulWidget {
required this.endDate,
required this.locale,
required this.fieldOrder,
required this.fieldFlex,
});

final bool showMonth;
Expand All @@ -449,6 +469,7 @@ class _DatePickerContentPopUp extends StatefulWidget {
final DateTime endDate;
final Locale? locale;
final List<DatePickerField> fieldOrder;
final List<int> fieldFlex;

@override
State<_DatePickerContentPopUp> createState() =>
Expand Down Expand Up @@ -510,7 +531,8 @@ class __DatePickerContentPopUpState extends State<_DatePickerContentPopUp> {
final months = monthsInCurrentYear;
final monthWidget = [
Expanded(
flex: 2,
flex:
widget.fieldFlex[widget.fieldOrder.indexOf(DatePickerField.month)],
child: () {
final formatter = DateFormat.MMMM(locale.toString());
// MONTH
Expand Down Expand Up @@ -585,6 +607,7 @@ class __DatePickerContentPopUpState extends State<_DatePickerContentPopUp> {

final dayWidget = [
Expanded(
flex: widget.fieldFlex[widget.fieldOrder.indexOf(DatePickerField.day)],
child: () {
// DAY
final daysInMonth = _getDaysInMonth(localDate.month, localDate.year);
Expand Down Expand Up @@ -661,6 +684,7 @@ class __DatePickerContentPopUpState extends State<_DatePickerContentPopUp> {

final yearWidget = [
Expanded(
flex: widget.fieldFlex[widget.fieldOrder.indexOf(DatePickerField.year)],
child: () {
final years = widget.endDate.year - widget.startDate.year + 1;
final formatter = DateFormat.y(locale.toString());
Expand Down Expand Up @@ -810,3 +834,14 @@ List<DatePickerField> getDateOrderFromLocale(Locale? locale) {

return dmy;
}

/// Get the date flex based on the current locale.
/// The flex is used to determine the width of the fields.
List<int> getDateFlexFromLocale(Locale? locale) {
final lang = locale?.languageCode;
if (locale?.countryCode?.toLowerCase() == 'us') return const [2, 1, 1];

if (['zh', 'ko'].contains(lang)) return const [1, 1, 1];

return [1, 2, 1];
}

0 comments on commit 9c92486

Please sign in to comment.