From d72857e5470c49bb4e7d27204a08993a786bf3a4 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 19 Oct 2023 11:04:15 -0700 Subject: [PATCH 01/25] date_picker from commit 0402e56 --- package/lib/src/controls/create_control.dart | 7 + package/lib/src/controls/date_picker.dart | 167 +++++++++++++++++++ package/lib/src/models/control.dart | 8 + 3 files changed, 182 insertions(+) create mode 100644 package/lib/src/controls/date_picker.dart diff --git a/package/lib/src/controls/create_control.dart b/package/lib/src/controls/create_control.dart index 3e3d7c8fc..d4beb7187 100644 --- a/package/lib/src/controls/create_control.dart +++ b/package/lib/src/controls/create_control.dart @@ -27,6 +27,7 @@ import 'clipboard.dart'; import 'column.dart'; import 'container.dart'; import 'datatable.dart'; +import 'date_picker.dart'; import 'divider.dart'; import 'drag_target.dart'; import 'draggable.dart'; @@ -302,6 +303,12 @@ Widget createWidget(Key? key, ControlViewModel controlView, Control? parent, control: controlView.control, children: controlView.children, parentDisabled: parentDisabled); + case "datepicker": + return DatePickerControl( + parent: parent, + control: controlView.control, + children: controlView.children, + parentDisabled: parentDisabled); case "draggable": return DraggableControl( key: key, diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart new file mode 100644 index 000000000..fcc9f4bcf --- /dev/null +++ b/package/lib/src/controls/date_picker.dart @@ -0,0 +1,167 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_redux/flutter_redux.dart'; + +import '../actions.dart'; +import '../flet_app_services.dart'; +import '../models/app_state.dart'; +import '../models/control.dart'; +import '../protocol/update_control_props_payload.dart'; +import 'form_field.dart'; + +class DatePickerControl extends StatefulWidget { + final Control? parent; + final Control control; + final List children; + final bool parentDisabled; + + const DatePickerControl( + {Key? key, + this.parent, + required this.control, + required this.children, + required this.parentDisabled}) + : super(key: key); + + @override + State createState() => _DatePickerControlState(); +} + +class _DatePickerControlState extends State { + DateTime? _value; + String? _state; + + DateTime? get value { + return widget.control.attrDateTime("value"); + } + + @override + void initState() { + super.initState(); + _value = value; + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + debugPrint("DatePicker build: ${widget.control.id}"); + + return StoreConnector( + distinct: true, + converter: (store) => store.dispatch, + builder: (context, dispatch) { + debugPrint("DatePicker StoreConnector build: ${widget.control.id}"); + + String state = widget.control.attrString("state") ?? "initState"; + DateTime? firstDate = widget.control.attrDateTime("firstDate"); + DateTime? lastDate = widget.control.attrDateTime("firstDate"); + bool onChange = widget.control.attrBool("onChange", false)!; + String? localeString = widget.control.attrString("locale"); + String? helpText = widget.control.attrString("helpText"); + String? cancelText = widget.control.attrString("cancelText"); + String? confirmText = widget.control.attrString("confirmText"); + TextInputType keyboardType = parseTextInputType( + widget.control.attrString("keyboardType", "")!); + DatePickerMode datePickerMode = parseDatePickerMode( + widget.control.attrString("datePickerMode", "")!); + DatePickerEntryMode datePickerEntryMode = parseDatePickerEntryMode( + widget.control.attrString("datePickerEntryMode", "")!); + String? hintText = widget.control.attrString("hintText"); + + Locale locale; + if (localeString == null) { + locale = Localizations.localeOf(context); + } else { + locale = Locale(localeString); + } + + void onChanged(DateTime? dateValue) { + debugPrint("New date: $dateValue"); + var newState = "initState"; + String stringValue = dateValue?.toIso8601String() ?? ""; + List> props = [ + {"i": widget.control.id, "value": stringValue, "state": newState} + ]; + dispatch(UpdateControlPropsAction( + UpdateControlPropsPayload(props: props))); + FletAppServices.of(context).server.updateControlProps(props: props); + if (onChange) { + FletAppServices.of(context).server.sendPageEvent( + eventTarget: widget.control.id, + eventName: "change", + eventData: stringValue); + } + FletAppServices.of(context).server.sendPageEvent( + eventTarget: widget.control.id, + eventName: "submit", + eventData: ""); + } + + Widget selectDateDialog() { + Widget dialog = DatePickerDialog( + initialDate: _value ?? DateTime.now(), + firstDate: firstDate ?? DateTime(1900), + lastDate: lastDate ?? DateTime(2050), + helpText: helpText, + cancelText: cancelText, + confirmText: confirmText, + keyboardType: keyboardType, + initialCalendarMode: datePickerMode, + initialEntryMode: datePickerEntryMode, + fieldHintText: hintText, + ); + + dialog = Localizations.override( + context: context, + locale: locale, + child: dialog, + ); + + return dialog; + } + + if (_state != state) { + switch (state) { + case "pickDate": + WidgetsBinding.instance.addPostFrameCallback((_) { + showDialog( + context: context, + builder: (context) => selectDateDialog()).then((result) { + debugPrint("pickDate() completed"); + onChanged(result); + }); + }); + break; + } + } + return const SizedBox.shrink(); + }); + } +} + +DatePickerMode parseDatePickerMode(String mode) { + switch (mode.toLowerCase()) { + case "day": + return DatePickerMode.day; + case "year": + return DatePickerMode.year; + } + return DatePickerMode.day; +} + +DatePickerEntryMode parseDatePickerEntryMode(String mode) { + switch (mode.toLowerCase()) { + case "calendar": + return DatePickerEntryMode.calendar; + case "input": + return DatePickerEntryMode.input; + case "calendarOnly": + return DatePickerEntryMode.calendarOnly; + case "inputOnly": + return DatePickerEntryMode.inputOnly; + } + return DatePickerEntryMode.calendar; +} diff --git a/package/lib/src/models/control.dart b/package/lib/src/models/control.dart index 48475979a..52fd2a8df 100644 --- a/package/lib/src/models/control.dart +++ b/package/lib/src/models/control.dart @@ -86,6 +86,14 @@ class Control extends Equatable { return defValue; } + DateTime? attrDateTime(String name, [DateTime? defValue]) { + var value = attrs[name.toLowerCase()]; + if (value == null) { + return defValue; + } + return DateTime.parse(value); + } + Control copyWith( {String? id, String? pid, From 53fce41005c4e49667c477935aae58011543944d Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 19 Oct 2023 11:19:39 -0700 Subject: [PATCH 02/25] date_picker.py --- .../flet-core/src/flet_core/__init__.py | 1 + .../flet-core/src/flet_core/date_picker.py | 306 ++++++++++++++++++ 2 files changed, 307 insertions(+) create mode 100644 sdk/python/packages/flet-core/src/flet_core/date_picker.py diff --git a/sdk/python/packages/flet-core/src/flet_core/__init__.py b/sdk/python/packages/flet-core/src/flet_core/__init__.py index 03e06a65f..7b12b1720 100644 --- a/sdk/python/packages/flet-core/src/flet_core/__init__.py +++ b/sdk/python/packages/flet-core/src/flet_core/__init__.py @@ -67,6 +67,7 @@ DataRow, DataTable, ) +from flet_core.date_picker import DatePicker, DatePickerMode, DatePickerEntryMode from flet_core.divider import Divider from flet_core.drag_target import DragTarget, DragTargetAcceptEvent from flet_core.draggable import Draggable diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py new file mode 100644 index 000000000..f66d0e081 --- /dev/null +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -0,0 +1,306 @@ +from datetime import datetime, date +from enum import Enum +from typing import Any, Optional, Union + +from flet_core.control import Control, OptionalNumber +from flet_core.ref import Ref +from flet_core.text_style import TextStyle +from flet_core.types import ( + ResponsiveNumber, +) +from flet_core.textfield import KeyboardType, KeyboardTypeString + +try: + from typing import Literal +except ImportError: + from typing_extensions import Literal + + +DatePickerModeString = Literal["day", "year"] + + +class DatePickerMode(Enum): + DAY = "day" + YEAR = "year" + + +DatePickerEntryModeString = Literal["calendar", "input", "calendarOnly", "inputOnly"] + + +class DatePickerEntryMode(Enum): + CALENDAR = "calendar" + INPUT = "input" + CALENDAR_ONLY = "calendarOnly" + INPUT_ONLY = "inputOnly" + + +DatePickerState = Literal["pickDate", "initState"] + + +class DatePicker(Control): + """ + A button lets the user select date on datepicker dialog. + + Example: + ``` + import flet as ft + from flet_core.date_picker import DatePickerMode, DatePickerEntryMode + + + def main(page: ft.Page): + def change_date(e): + page.add(ft.Checkbox(label=f"Current date {date_picker.value}")) + date_button.text = f"{date_picker.value}" + page.update() + + date_picker = ft.DatePicker( + on_change=change_date, + date_picker_mode=DatePickerMode.YEAR, + date_picker_entry_mode=DatePickerEntryMode.INPUT, + hint_text="Say hello?", + ) + + page.overlay.append(date_picker) + + date_button = ft.ElevatedButton( + "Pick date", + icon=ft.icons.CALENDAR_MONTH, + on_click=lambda _: date_picker.pick_date(), + ) + + page.add(date_button) + + + ft.app(target=main) + ``` + + ----- + + Online docs: https://flet.dev/docs/controls/date_picker + """ + + def __init__( + self, + ref: Optional[Ref] = None, + expand: Optional[Union[bool, int]] = None, + col: Optional[ResponsiveNumber] = None, + opacity: OptionalNumber = None, + tooltip: Optional[str] = None, + visible: Optional[bool] = None, + disabled: Optional[bool] = None, + data: Any = None, + value: Optional[datetime] = None, + text_style: Optional[TextStyle] = None, + first_date: Optional[datetime] = None, + last_date: Optional[datetime] = None, + keyboard_type: Optional[KeyboardType] = None, + date_picker_mode: Optional[DatePickerMode] = None, + date_picker_entry_mode: Optional[DatePickerEntryMode] = None, + locale: Optional[str] = None, + help_text: Optional[str] = None, + cancel_text: Optional[str] = None, + confirm_text: Optional[str] = None, + hint_text: Optional[str] = None, + on_change=None, + on_submit=None, + ): + Control.__init__( + self, + ref=ref, + expand=expand, + col=col, + opacity=opacity, + tooltip=tooltip, + visible=visible, + disabled=disabled, + data=data, + ) + self.value = value + self.first_date = first_date + self.last_date = last_date + self.keyboard_type = keyboard_type + self.locale = locale + self.help_text = help_text + self.cancel_text = cancel_text + self.confirm_text = confirm_text + self.date_picker_mode = date_picker_mode + self.date_picker_entry_mode = date_picker_entry_mode + self.text_style = text_style + self.hint_text = hint_text + self.on_change = on_change + self.on_submit = on_submit + self.state = "initState" + + def _get_control_name(self): + return "date_picker" + + def _before_build_command(self): + super()._before_build_command() + + def pick_date(self): + self.state = "pickDate" + self.update() + + async def pick_date_async(self): + self.state = "pickDate" + await self.update_async() + + # state + @property + def state(self) -> Optional[DatePickerState]: + return self._get_attr("state") + + @state.setter + def state(self, value: Optional[DatePickerState]): + self._set_attr("state", value) + + # value + @property + def value(self) -> Optional[datetime]: + value_string = self._get_attr("value", def_value=None) + if value_string is None or value_string == "null": + return None + else: + return datetime.fromisoformat(value_string) + + @value.setter + def value(self, value: Optional[Union[datetime, str]]): + if isinstance(value, (date, datetime)): + value = value.isoformat() + self._set_attr("value", value) + + # first_date + @property + def first_date(self) -> Optional[datetime]: + value_string = self._get_attr("firstDate", def_value=None) + if value_string is None: + return None + else: + return datetime.fromisoformat(value_string) + + @first_date.setter + def first_date(self, value: Optional[Union[datetime, str]]): + if isinstance(value, (date, datetime)): + value = value.isoformat() + self._set_attr("firstDate", value) + + # last_date + @property + def last_date(self) -> Optional[datetime]: + value_string = self._get_attr("lastDate", def_value=None) + if value_string is None: + return None + else: + return datetime.fromisoformat(value_string) + + @last_date.setter + def last_date(self, value: Optional[Union[datetime, str]]): + if isinstance(value, (date, datetime)): + value = value.isoformat() + self._set_attr("lastDate", value) + + # locale + @property + def locale(self) -> Optional[str]: + return self._get_attr("locale", def_value=None) + + @locale.setter + def locale(self, value: Optional[str]): + self._set_attr("locale", value) + + # help_text + @property + def help_text(self) -> Optional[str]: + return self._get_attr("helpText", def_value=None) + + @help_text.setter + def help_text(self, value: Optional[str]): + self._set_attr("helpText", value) + + # cancel_text + @property + def cancel_text(self) -> Optional[str]: + return self._get_attr("cancelText", def_value=None) + + @cancel_text.setter + def cancel_text(self, value: Optional[str]): + self._set_attr("cancelText", value) + + # confirm_text + @property + def confirm_text(self) -> Optional[str]: + return self._get_attr("confirmText", def_value=None) + + @confirm_text.setter + def confirm_text(self, value: Optional[str]): + self._set_attr("confirmText", value) + + # keyboard_type + @property + def keyboard_type(self) -> Optional[KeyboardType]: + return self.__keyboard_type + + @keyboard_type.setter + def keyboard_type(self, value: Optional[KeyboardType]): + self.__keyboard_type = value + if isinstance(value, KeyboardType): + self._set_attr("keyboardType", value.value) + else: + self.__set_keyboard_type(value) + + def __set_keyboard_type(self, value: KeyboardTypeString): + self._set_attr("keyboardType", value) + + # date_picker_mode + @property + def date_picker_mode(self) -> DatePickerMode: + return self.__date_picker_mode + + @date_picker_mode.setter + def date_picker_mode(self, value: DatePickerMode): + self.__date_picker_mode = value + if isinstance(value, DatePickerMode): + self._set_attr("datePickerMode", value.value) + else: + self.__set_date_picker_mode(value) + + def __set_date_picker_mode(self, value: DatePickerMode): + self._set_attr("datePickerMode", value) + + # date_picker_entry_mode + @property + def date_picker_entry_mode(self) -> DatePickerEntryMode: + return self.__date_picker_entry_mode + + @date_picker_entry_mode.setter + def date_picker_entry_mode(self, value: DatePickerEntryMode): + self.__date_picker_entry_mode = value + if isinstance(value, DatePickerEntryMode): + self._set_attr("datePickerEntryMode", value.value) + else: + self.__set_date_picker_entry_mode(value) + + def __set_date_picker_entry_mode(self, value: DatePickerEntryMode): + self._set_attr("datePickerEntryMode", value) + + # on_change + @property + def on_change(self): + return self._get_event_handler("change") + + @on_change.setter + def on_change(self, handler): + self._add_event_handler("change", handler) + if handler is not None: + self._set_attr("onchange", True) + else: + self._set_attr("onchange", None) + + # on_submit + @property + def on_submit(self): + return self._get_event_handler("submit") + + @on_submit.setter + def on_submit(self, handler): + self._add_event_handler("submit", handler) From 5846b19e4012e6bcab68beb31bf774192e7b3225 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 19 Oct 2023 11:25:22 -0700 Subject: [PATCH 03/25] fixed control name, datepicker is shown in test --- sdk/python/packages/flet-core/src/flet_core/date_picker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index f66d0e081..30ddfccff 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -132,7 +132,7 @@ def __init__( self.state = "initState" def _get_control_name(self): - return "date_picker" + return "datepicker" def _before_build_command(self): super()._before_build_command() From 8001149b15e9c8b31195b8c3bf14554129a4e844 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Tue, 24 Oct 2023 11:59:53 -0700 Subject: [PATCH 04/25] fixed lastdate --- package/lib/src/controls/date_picker.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index fcc9f4bcf..35b703ae2 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -57,7 +57,7 @@ class _DatePickerControlState extends State { String state = widget.control.attrString("state") ?? "initState"; DateTime? firstDate = widget.control.attrDateTime("firstDate"); - DateTime? lastDate = widget.control.attrDateTime("firstDate"); + DateTime? lastDate = widget.control.attrDateTime("lastDate"); bool onChange = widget.control.attrBool("onChange", false)!; String? localeString = widget.control.attrString("locale"); String? helpText = widget.control.attrString("helpText"); From 24341976963b8fdc98ddc46a620ba89545263e7a Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Tue, 24 Oct 2023 12:18:19 -0700 Subject: [PATCH 05/25] Fixed value getter --- .../packages/flet-core/src/flet_core/date_picker.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 30ddfccff..2d2ab84a4 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -1,14 +1,12 @@ -from datetime import datetime, date +from datetime import date, datetime from enum import Enum from typing import Any, Optional, Union from flet_core.control import Control, OptionalNumber from flet_core.ref import Ref from flet_core.text_style import TextStyle -from flet_core.types import ( - ResponsiveNumber, -) from flet_core.textfield import KeyboardType, KeyboardTypeString +from flet_core.types import ResponsiveNumber try: from typing import Literal @@ -158,10 +156,7 @@ def state(self, value: Optional[DatePickerState]): @property def value(self) -> Optional[datetime]: value_string = self._get_attr("value", def_value=None) - if value_string is None or value_string == "null": - return None - else: - return datetime.fromisoformat(value_string) + return datetime.fromisoformat(value_string) if value_string else None @value.setter def value(self, value: Optional[Union[datetime, str]]): From 824c61fe102ce62a5372bc07ba9243a413af86d8 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Wed, 25 Oct 2023 10:18:55 -0700 Subject: [PATCH 06/25] removed StoreConnector and pass dispatch into constructor instead --- package/lib/src/controls/create_control.dart | 10 +- package/lib/src/controls/date_picker.dart | 187 +++++++++---------- 2 files changed, 96 insertions(+), 101 deletions(-) diff --git a/package/lib/src/controls/create_control.dart b/package/lib/src/controls/create_control.dart index d4beb7187..2d0598983 100644 --- a/package/lib/src/controls/create_control.dart +++ b/package/lib/src/controls/create_control.dart @@ -305,10 +305,12 @@ Widget createWidget(Key? key, ControlViewModel controlView, Control? parent, parentDisabled: parentDisabled); case "datepicker": return DatePickerControl( - parent: parent, - control: controlView.control, - children: controlView.children, - parentDisabled: parentDisabled); + parent: parent, + control: controlView.control, + children: controlView.children, + parentDisabled: parentDisabled, + dispatch: controlView.dispatch, + ); case "draggable": return DraggableControl( key: key, diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index 35b703ae2..502ee2959 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -13,14 +13,16 @@ class DatePickerControl extends StatefulWidget { final Control control; final List children; final bool parentDisabled; + final dynamic dispatch; - const DatePickerControl( - {Key? key, - this.parent, - required this.control, - required this.children, - required this.parentDisabled}) - : super(key: key); + const DatePickerControl({ + Key? key, + this.parent, + required this.control, + required this.children, + required this.parentDisabled, + required this.dispatch, + }) : super(key: key); @override State createState() => _DatePickerControlState(); @@ -49,96 +51,87 @@ class _DatePickerControlState extends State { Widget build(BuildContext context) { debugPrint("DatePicker build: ${widget.control.id}"); - return StoreConnector( - distinct: true, - converter: (store) => store.dispatch, - builder: (context, dispatch) { - debugPrint("DatePicker StoreConnector build: ${widget.control.id}"); - - String state = widget.control.attrString("state") ?? "initState"; - DateTime? firstDate = widget.control.attrDateTime("firstDate"); - DateTime? lastDate = widget.control.attrDateTime("lastDate"); - bool onChange = widget.control.attrBool("onChange", false)!; - String? localeString = widget.control.attrString("locale"); - String? helpText = widget.control.attrString("helpText"); - String? cancelText = widget.control.attrString("cancelText"); - String? confirmText = widget.control.attrString("confirmText"); - TextInputType keyboardType = parseTextInputType( - widget.control.attrString("keyboardType", "")!); - DatePickerMode datePickerMode = parseDatePickerMode( - widget.control.attrString("datePickerMode", "")!); - DatePickerEntryMode datePickerEntryMode = parseDatePickerEntryMode( - widget.control.attrString("datePickerEntryMode", "")!); - String? hintText = widget.control.attrString("hintText"); - - Locale locale; - if (localeString == null) { - locale = Localizations.localeOf(context); - } else { - locale = Locale(localeString); - } - - void onChanged(DateTime? dateValue) { - debugPrint("New date: $dateValue"); - var newState = "initState"; - String stringValue = dateValue?.toIso8601String() ?? ""; - List> props = [ - {"i": widget.control.id, "value": stringValue, "state": newState} - ]; - dispatch(UpdateControlPropsAction( - UpdateControlPropsPayload(props: props))); - FletAppServices.of(context).server.updateControlProps(props: props); - if (onChange) { - FletAppServices.of(context).server.sendPageEvent( - eventTarget: widget.control.id, - eventName: "change", - eventData: stringValue); - } - FletAppServices.of(context).server.sendPageEvent( - eventTarget: widget.control.id, - eventName: "submit", - eventData: ""); - } - - Widget selectDateDialog() { - Widget dialog = DatePickerDialog( - initialDate: _value ?? DateTime.now(), - firstDate: firstDate ?? DateTime(1900), - lastDate: lastDate ?? DateTime(2050), - helpText: helpText, - cancelText: cancelText, - confirmText: confirmText, - keyboardType: keyboardType, - initialCalendarMode: datePickerMode, - initialEntryMode: datePickerEntryMode, - fieldHintText: hintText, - ); - - dialog = Localizations.override( - context: context, - locale: locale, - child: dialog, - ); - - return dialog; - } - - if (_state != state) { - switch (state) { - case "pickDate": - WidgetsBinding.instance.addPostFrameCallback((_) { - showDialog( - context: context, - builder: (context) => selectDateDialog()).then((result) { - debugPrint("pickDate() completed"); - onChanged(result); - }); - }); - break; - } - } - return const SizedBox.shrink(); - }); + String state = widget.control.attrString("state") ?? "initState"; + DateTime? firstDate = widget.control.attrDateTime("firstDate"); + DateTime? lastDate = widget.control.attrDateTime("lastDate"); + bool onChange = widget.control.attrBool("onChange", false)!; + String? localeString = widget.control.attrString("locale"); + String? helpText = widget.control.attrString("helpText"); + String? cancelText = widget.control.attrString("cancelText"); + String? confirmText = widget.control.attrString("confirmText"); + TextInputType keyboardType = + parseTextInputType(widget.control.attrString("keyboardType", "")!); + DatePickerMode datePickerMode = + parseDatePickerMode(widget.control.attrString("datePickerMode", "")!); + DatePickerEntryMode datePickerEntryMode = parseDatePickerEntryMode( + widget.control.attrString("datePickerEntryMode", "")!); + String? hintText = widget.control.attrString("hintText"); + + Locale locale; + if (localeString == null) { + locale = Localizations.localeOf(context); + } else { + locale = Locale(localeString); + } + + void onChanged(DateTime? dateValue) { + debugPrint("New date: $dateValue"); + var newState = "initState"; + String stringValue = dateValue?.toIso8601String() ?? ""; + List> props = [ + {"i": widget.control.id, "value": stringValue, "state": newState} + ]; + widget.dispatch( + UpdateControlPropsAction(UpdateControlPropsPayload(props: props))); + FletAppServices.of(context).server.updateControlProps(props: props); + if (onChange) { + FletAppServices.of(context).server.sendPageEvent( + eventTarget: widget.control.id, + eventName: "change", + eventData: stringValue); + } + FletAppServices.of(context).server.sendPageEvent( + eventTarget: widget.control.id, eventName: "submit", eventData: ""); + } + + Widget selectDateDialog() { + Widget dialog = DatePickerDialog( + initialDate: _value ?? DateTime.now(), + firstDate: firstDate ?? DateTime(1900), + lastDate: lastDate ?? DateTime(2050), + helpText: helpText, + cancelText: cancelText, + confirmText: confirmText, + keyboardType: keyboardType, + initialCalendarMode: datePickerMode, + initialEntryMode: datePickerEntryMode, + fieldHintText: hintText, + ); + + dialog = Localizations.override( + context: context, + locale: locale, + child: dialog, + ); + + return dialog; + } + + if (_state != state) { + switch (state) { + case "pickDate": + WidgetsBinding.instance.addPostFrameCallback((_) { + showDialog( + context: context, + builder: (context) => selectDateDialog()).then((result) { + debugPrint("pickDate() completed"); + onChanged(result); + }); + }); + break; + } + } + return const SizedBox.shrink(); } } From 1bd4ca16e491a167e65b96a089e1af3a867578b2 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Wed, 25 Oct 2023 10:21:13 -0700 Subject: [PATCH 07/25] changed attr name to 'onChange' as in dart --- sdk/python/packages/flet-core/src/flet_core/date_picker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 2d2ab84a4..e705ba0f3 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -287,9 +287,9 @@ def on_change(self): def on_change(self, handler): self._add_event_handler("change", handler) if handler is not None: - self._set_attr("onchange", True) + self._set_attr("onChange", True) else: - self._set_attr("onchange", None) + self._set_attr("onChange", None) # on_submit @property From 82ee206fc795d22f9d0e3145ec829ae310c2e15d Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Wed, 25 Oct 2023 11:12:24 -0700 Subject: [PATCH 08/25] refactor --- package/lib/src/controls/date_picker.dart | 40 +++++++------------ .../flet-core/src/flet_core/date_picker.py | 13 ------ 2 files changed, 15 insertions(+), 38 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index 502ee2959..c10326107 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -29,32 +29,26 @@ class DatePickerControl extends StatefulWidget { } class _DatePickerControlState extends State { - DateTime? _value; String? _state; - DateTime? get value { - return widget.control.attrDateTime("value"); - } + // @override + // void initState() { + // super.initState(); + // } - @override - void initState() { - super.initState(); - _value = value; - } - - @override - void dispose() { - super.dispose(); - } + // @override + // void dispose() { + // super.dispose(); + // } @override Widget build(BuildContext context) { debugPrint("DatePicker build: ${widget.control.id}"); String state = widget.control.attrString("state") ?? "initState"; + DateTime? value = widget.control.attrDateTime("value"); DateTime? firstDate = widget.control.attrDateTime("firstDate"); DateTime? lastDate = widget.control.attrDateTime("lastDate"); - bool onChange = widget.control.attrBool("onChange", false)!; String? localeString = widget.control.attrString("locale"); String? helpText = widget.control.attrString("helpText"); String? cancelText = widget.control.attrString("cancelText"); @@ -84,19 +78,15 @@ class _DatePickerControlState extends State { widget.dispatch( UpdateControlPropsAction(UpdateControlPropsPayload(props: props))); FletAppServices.of(context).server.updateControlProps(props: props); - if (onChange) { - FletAppServices.of(context).server.sendPageEvent( - eventTarget: widget.control.id, - eventName: "change", - eventData: stringValue); - } FletAppServices.of(context).server.sendPageEvent( - eventTarget: widget.control.id, eventName: "submit", eventData: ""); + eventTarget: widget.control.id, + eventName: "change", + eventData: stringValue); } - Widget selectDateDialog() { + Widget createSelectDateDialog() { Widget dialog = DatePickerDialog( - initialDate: _value ?? DateTime.now(), + initialDate: value ?? DateTime.now(), firstDate: firstDate ?? DateTime(1900), lastDate: lastDate ?? DateTime(2050), helpText: helpText, @@ -123,7 +113,7 @@ class _DatePickerControlState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { showDialog( context: context, - builder: (context) => selectDateDialog()).then((result) { + builder: (context) => createSelectDateDialog()).then((result) { debugPrint("pickDate() completed"); onChanged(result); }); diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index e705ba0f3..6a579ed2d 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -286,16 +286,3 @@ def on_change(self): @on_change.setter def on_change(self, handler): self._add_event_handler("change", handler) - if handler is not None: - self._set_attr("onChange", True) - else: - self._set_attr("onChange", None) - - # on_submit - @property - def on_submit(self): - return self._get_event_handler("submit") - - @on_submit.setter - def on_submit(self, handler): - self._add_event_handler("submit", handler) From 1adb93c0243661b5598a62abce4cfc1f37fe6fed Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Wed, 25 Oct 2023 11:28:57 -0700 Subject: [PATCH 09/25] refactor --- package/lib/src/controls/date_picker.dart | 10 ---------- .../packages/flet-core/src/flet_core/date_picker.py | 2 -- 2 files changed, 12 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index c10326107..e5dd0b982 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -31,16 +31,6 @@ class DatePickerControl extends StatefulWidget { class _DatePickerControlState extends State { String? _state; - // @override - // void initState() { - // super.initState(); - // } - - // @override - // void dispose() { - // super.dispose(); - // } - @override Widget build(BuildContext context) { debugPrint("DatePicker build: ${widget.control.id}"); diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 6a579ed2d..30fe5bf90 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -100,7 +100,6 @@ def __init__( confirm_text: Optional[str] = None, hint_text: Optional[str] = None, on_change=None, - on_submit=None, ): Control.__init__( self, @@ -126,7 +125,6 @@ def __init__( self.text_style = text_style self.hint_text = hint_text self.on_change = on_change - self.on_submit = on_submit self.state = "initState" def _get_control_name(self): From 6b3420785ac66bc4b535c09e769ef6bd329b22f4 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Wed, 25 Oct 2023 13:05:02 -0700 Subject: [PATCH 10/25] on_dismiss event --- package/lib/src/controls/date_picker.dart | 22 ++++++++++++++++++- .../flet-core/src/flet_core/date_picker.py | 11 ++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index e5dd0b982..1acfaa152 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -74,6 +74,22 @@ class _DatePickerControlState extends State { eventData: stringValue); } + void onDismissed() { + var newState = "initState"; + String stringValue = value?.toIso8601String() ?? ""; + List> props = [ + {"i": widget.control.id, "value": stringValue, "state": newState} + ]; + widget.dispatch( + UpdateControlPropsAction(UpdateControlPropsPayload(props: props))); + FletAppServices.of(context).server.updateControlProps(props: props); + + FletAppServices.of(context).server.sendPageEvent( + eventTarget: widget.control.id, + eventName: "dismiss", + eventData: stringValue); + } + Widget createSelectDateDialog() { Widget dialog = DatePickerDialog( initialDate: value ?? DateTime.now(), @@ -105,7 +121,11 @@ class _DatePickerControlState extends State { context: context, builder: (context) => createSelectDateDialog()).then((result) { debugPrint("pickDate() completed"); - onChanged(result); + if (result != null) { + onChanged(result); + } else { + onDismissed(); + } }); }); break; diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 30fe5bf90..ceae2b8ea 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -100,6 +100,7 @@ def __init__( confirm_text: Optional[str] = None, hint_text: Optional[str] = None, on_change=None, + on_dismiss=None, ): Control.__init__( self, @@ -125,6 +126,7 @@ def __init__( self.text_style = text_style self.hint_text = hint_text self.on_change = on_change + self.on_dismiss = on_dismiss self.state = "initState" def _get_control_name(self): @@ -284,3 +286,12 @@ def on_change(self): @on_change.setter def on_change(self, handler): self._add_event_handler("change", handler) + + # on_dismiss + @property + def on_dismiss(self): + return self._get_event_handler("dismiss") + + @on_dismiss.setter + def on_dismiss(self, handler): + self._add_event_handler("dismiss", handler) From 92bc2fa264f8315ee6926e7321c800528e1cfef6 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Wed, 25 Oct 2023 13:29:02 -0700 Subject: [PATCH 11/25] current_date --- package/lib/src/controls/date_picker.dart | 2 ++ .../flet-core/src/flet_core/date_picker.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index 1acfaa152..2ac862b0b 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -39,6 +39,7 @@ class _DatePickerControlState extends State { DateTime? value = widget.control.attrDateTime("value"); DateTime? firstDate = widget.control.attrDateTime("firstDate"); DateTime? lastDate = widget.control.attrDateTime("lastDate"); + DateTime? currentDate = widget.control.attrDateTime("currentDate"); String? localeString = widget.control.attrString("locale"); String? helpText = widget.control.attrString("helpText"); String? cancelText = widget.control.attrString("cancelText"); @@ -95,6 +96,7 @@ class _DatePickerControlState extends State { initialDate: value ?? DateTime.now(), firstDate: firstDate ?? DateTime(1900), lastDate: lastDate ?? DateTime(2050), + currentDate: currentDate ?? DateTime.now(), helpText: helpText, cancelText: cancelText, confirmText: confirmText, diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index ceae2b8ea..32bed904f 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -91,6 +91,7 @@ def __init__( text_style: Optional[TextStyle] = None, first_date: Optional[datetime] = None, last_date: Optional[datetime] = None, + current_date: Optional[datetime] = None, keyboard_type: Optional[KeyboardType] = None, date_picker_mode: Optional[DatePickerMode] = None, date_picker_entry_mode: Optional[DatePickerEntryMode] = None, @@ -116,6 +117,7 @@ def __init__( self.value = value self.first_date = first_date self.last_date = last_date + self.current_date = current_date self.keyboard_type = keyboard_type self.locale = locale self.help_text = help_text @@ -194,6 +196,21 @@ def last_date(self, value: Optional[Union[datetime, str]]): value = value.isoformat() self._set_attr("lastDate", value) + # current_date + @property + def current_date(self) -> Optional[datetime]: + value_string = self._get_attr("currentDate", def_value=None) + if value_string is None: + return None + else: + return datetime.fromisoformat(value_string) + + @current_date.setter + def current_date(self, value: Optional[Union[datetime, str]]): + if isinstance(value, (date, datetime)): + value = value.isoformat() + self._set_attr("currentDate", value) + # locale @property def locale(self) -> Optional[str]: From e185726c4246b44a932395fe91f1137e9b178788 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 26 Oct 2023 09:41:01 -0700 Subject: [PATCH 12/25] error_format_text, error_invalid_text --- package/lib/src/controls/date_picker.dart | 6 ++++- .../flet-core/src/flet_core/date_picker.py | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index 2ac862b0b..5e2a7b0b7 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -44,6 +44,8 @@ class _DatePickerControlState extends State { String? helpText = widget.control.attrString("helpText"); String? cancelText = widget.control.attrString("cancelText"); String? confirmText = widget.control.attrString("confirmText"); + String? errorFormatText = widget.control.attrString("errorFormatText"); + String? errorInvalidText = widget.control.attrString("errorInvalidText"); TextInputType keyboardType = parseTextInputType(widget.control.attrString("keyboardType", "")!); DatePickerMode datePickerMode = @@ -100,6 +102,8 @@ class _DatePickerControlState extends State { helpText: helpText, cancelText: cancelText, confirmText: confirmText, + errorFormatText: errorFormatText, + errorInvalidText: errorInvalidText, keyboardType: keyboardType, initialCalendarMode: datePickerMode, initialEntryMode: datePickerEntryMode, @@ -130,7 +134,7 @@ class _DatePickerControlState extends State { } }); }); - break; + //break; } } return const SizedBox.shrink(); diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 32bed904f..90b3d28cb 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -99,6 +99,8 @@ def __init__( help_text: Optional[str] = None, cancel_text: Optional[str] = None, confirm_text: Optional[str] = None, + error_format_text: Optional[str] = None, + error_invalid_text: Optional[str] = None, hint_text: Optional[str] = None, on_change=None, on_dismiss=None, @@ -123,6 +125,8 @@ def __init__( self.help_text = help_text self.cancel_text = cancel_text self.confirm_text = confirm_text + self.error_format_text = error_format_text + self.error_invalid_text = error_invalid_text self.date_picker_mode = date_picker_mode self.date_picker_entry_mode = date_picker_entry_mode self.text_style = text_style @@ -247,6 +251,24 @@ def confirm_text(self) -> Optional[str]: def confirm_text(self, value: Optional[str]): self._set_attr("confirmText", value) + # error_format_text + @property + def error_format_text(self) -> Optional[str]: + return self._get_attr("errorFormatText", def_value=None) + + @error_format_text.setter + def error_format_text(self, value: Optional[str]): + self._set_attr("errorFormatText", value) + + # error_invalid_text + @property + def error_invalid_text(self) -> Optional[str]: + return self._get_attr("errorInvalidText", def_value=None) + + @error_invalid_text.setter + def error_invalid_text(self, value: Optional[str]): + self._set_attr("errorInvalidText", value) + # keyboard_type @property def keyboard_type(self) -> Optional[KeyboardType]: From a220d1cac9fc565c2945981065adbd9afd8fb481 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 26 Oct 2023 10:12:26 -0700 Subject: [PATCH 13/25] refactor --- package/lib/src/controls/date_picker.dart | 43 ++++++++----------- .../flet-core/src/flet_core/date_picker.py | 17 +++++--- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index 5e2a7b0b7..b02e25268 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -29,13 +29,12 @@ class DatePickerControl extends StatefulWidget { } class _DatePickerControlState extends State { - String? _state; + bool _open = false; @override Widget build(BuildContext context) { debugPrint("DatePicker build: ${widget.control.id}"); - - String state = widget.control.attrString("state") ?? "initState"; + var open = widget.control.attrBool("open", false)!; DateTime? value = widget.control.attrDateTime("value"); DateTime? firstDate = widget.control.attrDateTime("firstDate"); DateTime? lastDate = widget.control.attrDateTime("lastDate"); @@ -63,10 +62,9 @@ class _DatePickerControlState extends State { void onChanged(DateTime? dateValue) { debugPrint("New date: $dateValue"); - var newState = "initState"; String stringValue = dateValue?.toIso8601String() ?? ""; List> props = [ - {"i": widget.control.id, "value": stringValue, "state": newState} + {"i": widget.control.id, "value": stringValue, "open": "false"} ]; widget.dispatch( UpdateControlPropsAction(UpdateControlPropsPayload(props: props))); @@ -78,10 +76,9 @@ class _DatePickerControlState extends State { } void onDismissed() { - var newState = "initState"; String stringValue = value?.toIso8601String() ?? ""; List> props = [ - {"i": widget.control.id, "value": stringValue, "state": newState} + {"i": widget.control.id, "value": stringValue, "open": "false"} ]; widget.dispatch( UpdateControlPropsAction(UpdateControlPropsPayload(props: props))); @@ -119,24 +116,22 @@ class _DatePickerControlState extends State { return dialog; } - if (_state != state) { - switch (state) { - case "pickDate": - WidgetsBinding.instance.addPostFrameCallback((_) { - showDialog( - context: context, - builder: (context) => createSelectDateDialog()).then((result) { - debugPrint("pickDate() completed"); - if (result != null) { - onChanged(result); - } else { - onDismissed(); - } - }); - }); - //break; - } + if (open && !_open) { + WidgetsBinding.instance.addPostFrameCallback((_) { + showDialog( + context: context, + builder: (context) => createSelectDateDialog()).then((result) { + debugPrint("pickDate() completed"); + if (result != null) { + onChanged(result); + } else { + onDismissed(); + } + }); + }); } + + _open = open; return const SizedBox.shrink(); } } diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 90b3d28cb..5240835fc 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -87,6 +87,7 @@ def __init__( visible: Optional[bool] = None, disabled: Optional[bool] = None, data: Any = None, + open: bool = False, value: Optional[datetime] = None, text_style: Optional[TextStyle] = None, first_date: Optional[datetime] = None, @@ -133,7 +134,7 @@ def __init__( self.hint_text = hint_text self.on_change = on_change self.on_dismiss = on_dismiss - self.state = "initState" + self.open = open def _get_control_name(self): return "datepicker" @@ -142,21 +143,23 @@ def _before_build_command(self): super()._before_build_command() def pick_date(self): + self.open = True self.state = "pickDate" self.update() async def pick_date_async(self): + self.open = True self.state = "pickDate" await self.update_async() - # state + # open @property - def state(self) -> Optional[DatePickerState]: - return self._get_attr("state") + def open(self) -> Optional[bool]: + return self._get_attr("open", data_type="bool", def_value=False) - @state.setter - def state(self, value: Optional[DatePickerState]): - self._set_attr("state", value) + @open.setter + def open(self, value: Optional[bool]): + self._set_attr("open", value) # value @property From caa09caff6dcfed8da4997081702563f3aa55319 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 26 Oct 2023 10:40:41 -0700 Subject: [PATCH 14/25] field_hint_text, field_label_text --- package/lib/src/controls/date_picker.dart | 8 +++--- .../flet-core/src/flet_core/date_picker.py | 26 ++++++++++++++++--- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index b02e25268..789493a5a 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -51,7 +51,8 @@ class _DatePickerControlState extends State { parseDatePickerMode(widget.control.attrString("datePickerMode", "")!); DatePickerEntryMode datePickerEntryMode = parseDatePickerEntryMode( widget.control.attrString("datePickerEntryMode", "")!); - String? hintText = widget.control.attrString("hintText"); + String? fieldHintText = widget.control.attrString("fieldHintText"); + String? fieldLabelText = widget.control.attrString("fieldLabelText"); Locale locale; if (localeString == null) { @@ -92,7 +93,7 @@ class _DatePickerControlState extends State { Widget createSelectDateDialog() { Widget dialog = DatePickerDialog( - initialDate: value ?? DateTime.now(), + initialDate: value ?? currentDate ?? DateTime.now(), firstDate: firstDate ?? DateTime(1900), lastDate: lastDate ?? DateTime(2050), currentDate: currentDate ?? DateTime.now(), @@ -104,7 +105,8 @@ class _DatePickerControlState extends State { keyboardType: keyboardType, initialCalendarMode: datePickerMode, initialEntryMode: datePickerEntryMode, - fieldHintText: hintText, + fieldHintText: fieldHintText, + fieldLabelText: fieldLabelText, ); dialog = Localizations.override( diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 5240835fc..d90440138 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -102,7 +102,8 @@ def __init__( confirm_text: Optional[str] = None, error_format_text: Optional[str] = None, error_invalid_text: Optional[str] = None, - hint_text: Optional[str] = None, + field_hint_text: Optional[str] = None, + field_label_text: Optional[str] = None, on_change=None, on_dismiss=None, ): @@ -131,7 +132,8 @@ def __init__( self.date_picker_mode = date_picker_mode self.date_picker_entry_mode = date_picker_entry_mode self.text_style = text_style - self.hint_text = hint_text + self.field_hint_text = field_hint_text + self.field_label_text = field_label_text self.on_change = on_change self.on_dismiss = on_dismiss self.open = open @@ -144,12 +146,10 @@ def _before_build_command(self): def pick_date(self): self.open = True - self.state = "pickDate" self.update() async def pick_date_async(self): self.open = True - self.state = "pickDate" await self.update_async() # open @@ -227,6 +227,24 @@ def locale(self) -> Optional[str]: def locale(self, value: Optional[str]): self._set_attr("locale", value) + # field_hint_text + @property + def field_hint_text(self) -> Optional[str]: + return self._get_attr("fieldHintText", def_value=None) + + @field_hint_text.setter + def field_hint_text(self, value: Optional[str]): + self._set_attr("fieldHintText", value) + + # field_label_text + @property + def field_label_text(self) -> Optional[str]: + return self._get_attr("fieldLabelText", def_value=None) + + @field_label_text.setter + def field_label_text(self, value: Optional[str]): + self._set_attr("fieldLabelText", value) + # help_text @property def help_text(self) -> Optional[str]: From f30b32f70801a9c0eb340ff3478302d77ebb7f48 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 26 Oct 2023 11:18:02 -0700 Subject: [PATCH 15/25] fixed datePickerEntryMode and datePickerMode --- package/lib/src/controls/date_picker.dart | 41 +++++++---------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index 789493a5a..170b7eaa8 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -47,10 +47,19 @@ class _DatePickerControlState extends State { String? errorInvalidText = widget.control.attrString("errorInvalidText"); TextInputType keyboardType = parseTextInputType(widget.control.attrString("keyboardType", "")!); - DatePickerMode datePickerMode = - parseDatePickerMode(widget.control.attrString("datePickerMode", "")!); - DatePickerEntryMode datePickerEntryMode = parseDatePickerEntryMode( - widget.control.attrString("datePickerEntryMode", "")!); + DatePickerMode datePickerMode = DatePickerMode.values.firstWhere( + (a) => + a.name.toLowerCase() == + widget.control.attrString("datePickerMode", "")!.toLowerCase(), + orElse: () => DatePickerMode.day); + DatePickerEntryMode datePickerEntryMode = DatePickerEntryMode.values + .firstWhere( + (a) => + a.name.toLowerCase() == + widget.control + .attrString("datePickerEntryMode", "")! + .toLowerCase(), + orElse: () => DatePickerEntryMode.calendar); String? fieldHintText = widget.control.attrString("fieldHintText"); String? fieldLabelText = widget.control.attrString("fieldLabelText"); @@ -137,27 +146,3 @@ class _DatePickerControlState extends State { return const SizedBox.shrink(); } } - -DatePickerMode parseDatePickerMode(String mode) { - switch (mode.toLowerCase()) { - case "day": - return DatePickerMode.day; - case "year": - return DatePickerMode.year; - } - return DatePickerMode.day; -} - -DatePickerEntryMode parseDatePickerEntryMode(String mode) { - switch (mode.toLowerCase()) { - case "calendar": - return DatePickerEntryMode.calendar; - case "input": - return DatePickerEntryMode.input; - case "calendarOnly": - return DatePickerEntryMode.calendarOnly; - case "inputOnly": - return DatePickerEntryMode.inputOnly; - } - return DatePickerEntryMode.calendar; -} From 153a4c6bd0d98aa90f43f4a308fbafd6aa8f6e0c Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 26 Oct 2023 11:31:26 -0700 Subject: [PATCH 16/25] default value to current_date --- package/lib/src/controls/date_picker.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index 170b7eaa8..b24d4f2d9 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:flutter_redux/flutter_redux.dart'; +//import 'package:flutter_redux/flutter_redux.dart'; import '../actions.dart'; import '../flet_app_services.dart'; -import '../models/app_state.dart'; +//import '../models/app_state.dart'; import '../models/control.dart'; import '../protocol/update_control_props_payload.dart'; import 'form_field.dart'; @@ -86,7 +86,8 @@ class _DatePickerControlState extends State { } void onDismissed() { - String stringValue = value?.toIso8601String() ?? ""; + String stringValue = + value?.toIso8601String() ?? currentDate?.toIso8601String() ?? ""; List> props = [ {"i": widget.control.id, "value": stringValue, "open": "false"} ]; From 1d70859345ef84b9ba2abd5fa20c58ecaa28a822 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 26 Oct 2023 11:47:31 -0700 Subject: [PATCH 17/25] refactor --- package/lib/src/controls/date_picker.dart | 37 ++++++++--------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index b24d4f2d9..869ee322d 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -70,24 +70,17 @@ class _DatePickerControlState extends State { locale = Locale(localeString); } - void onChanged(DateTime? dateValue) { - debugPrint("New date: $dateValue"); - String stringValue = dateValue?.toIso8601String() ?? ""; - List> props = [ - {"i": widget.control.id, "value": stringValue, "open": "false"} - ]; - widget.dispatch( - UpdateControlPropsAction(UpdateControlPropsPayload(props: props))); - FletAppServices.of(context).server.updateControlProps(props: props); - FletAppServices.of(context).server.sendPageEvent( - eventTarget: widget.control.id, - eventName: "change", - eventData: stringValue); - } - - void onDismissed() { - String stringValue = - value?.toIso8601String() ?? currentDate?.toIso8601String() ?? ""; + void onClosed(DateTime? dateValue) { + String stringValue; + String eventName; + if (dateValue == null) { + stringValue = + value?.toIso8601String() ?? currentDate?.toIso8601String() ?? ""; + eventName = "dismiss"; + } else { + stringValue = dateValue?.toIso8601String() ?? ""; + eventName = "change"; + } List> props = [ {"i": widget.control.id, "value": stringValue, "open": "false"} ]; @@ -97,7 +90,7 @@ class _DatePickerControlState extends State { FletAppServices.of(context).server.sendPageEvent( eventTarget: widget.control.id, - eventName: "dismiss", + eventName: eventName, eventData: stringValue); } @@ -134,11 +127,7 @@ class _DatePickerControlState extends State { context: context, builder: (context) => createSelectDateDialog()).then((result) { debugPrint("pickDate() completed"); - if (result != null) { - onChanged(result); - } else { - onDismissed(); - } + onClosed(result); }); }); } From 736665c81f0c258defac3a123baabc8dca8647e6 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Thu, 26 Oct 2023 12:22:57 -0700 Subject: [PATCH 18/25] commented locale parts --- package/lib/src/controls/date_picker.dart | 24 +++++++++---------- .../flet-core/src/flet_core/date_picker.py | 18 +++++++------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index 869ee322d..54c5430e1 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -39,7 +39,7 @@ class _DatePickerControlState extends State { DateTime? firstDate = widget.control.attrDateTime("firstDate"); DateTime? lastDate = widget.control.attrDateTime("lastDate"); DateTime? currentDate = widget.control.attrDateTime("currentDate"); - String? localeString = widget.control.attrString("locale"); + //String? localeString = widget.control.attrString("locale"); String? helpText = widget.control.attrString("helpText"); String? cancelText = widget.control.attrString("cancelText"); String? confirmText = widget.control.attrString("confirmText"); @@ -63,12 +63,12 @@ class _DatePickerControlState extends State { String? fieldHintText = widget.control.attrString("fieldHintText"); String? fieldLabelText = widget.control.attrString("fieldLabelText"); - Locale locale; - if (localeString == null) { - locale = Localizations.localeOf(context); - } else { - locale = Locale(localeString); - } + //Locale locale; + // if (localeString == null) { + // locale = Localizations.localeOf(context); + // } else { + // //locale = Locale(localeString); + // } void onClosed(DateTime? dateValue) { String stringValue; @@ -112,11 +112,11 @@ class _DatePickerControlState extends State { fieldLabelText: fieldLabelText, ); - dialog = Localizations.override( - context: context, - locale: locale, - child: dialog, - ); + // dialog = Localizations.override( + // context: context, + // locale: locale, + // child: dialog, + // ); return dialog; } diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index d90440138..e8ca24b51 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -96,7 +96,7 @@ def __init__( keyboard_type: Optional[KeyboardType] = None, date_picker_mode: Optional[DatePickerMode] = None, date_picker_entry_mode: Optional[DatePickerEntryMode] = None, - locale: Optional[str] = None, + # locale: Optional[str] = None, help_text: Optional[str] = None, cancel_text: Optional[str] = None, confirm_text: Optional[str] = None, @@ -123,7 +123,7 @@ def __init__( self.last_date = last_date self.current_date = current_date self.keyboard_type = keyboard_type - self.locale = locale + # self.locale = locale self.help_text = help_text self.cancel_text = cancel_text self.confirm_text = confirm_text @@ -218,14 +218,14 @@ def current_date(self, value: Optional[Union[datetime, str]]): value = value.isoformat() self._set_attr("currentDate", value) - # locale - @property - def locale(self) -> Optional[str]: - return self._get_attr("locale", def_value=None) + # # locale + # @property + # def locale(self) -> Optional[str]: + # return self._get_attr("locale", def_value=None) - @locale.setter - def locale(self, value: Optional[str]): - self._set_attr("locale", value) + # @locale.setter + # def locale(self, value: Optional[str]): + # self._set_attr("locale", value) # field_hint_text @property From c9ce23276bb1f47cbbeae1a440bc84b66962f4fb Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Fri, 27 Oct 2023 13:06:23 -0700 Subject: [PATCH 19/25] switch calendar and input icons --- package/lib/src/controls/date_picker.dart | 11 ++++ .../flet-core/src/flet_core/date_picker.py | 52 ++++++++++++++----- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index 54c5430e1..e5e9fb91a 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -7,6 +7,7 @@ import '../flet_app_services.dart'; import '../models/control.dart'; import '../protocol/update_control_props_payload.dart'; import 'form_field.dart'; +import '../utils/icons.dart'; class DatePickerControl extends StatefulWidget { final Control? parent; @@ -62,6 +63,10 @@ class _DatePickerControlState extends State { orElse: () => DatePickerEntryMode.calendar); String? fieldHintText = widget.control.attrString("fieldHintText"); String? fieldLabelText = widget.control.attrString("fieldLabelText"); + IconData? switchToCalendarEntryModeIcon = getMaterialIcon( + widget.control.attrString("switchToCalendarEntryModeIcon", "")!); + IconData? switchToInputEntryModeIcon = getMaterialIcon( + widget.control.attrString("switchToInputEntryModeIcon", "")!); //Locale locale; // if (localeString == null) { @@ -110,6 +115,12 @@ class _DatePickerControlState extends State { initialEntryMode: datePickerEntryMode, fieldHintText: fieldHintText, fieldLabelText: fieldLabelText, + switchToCalendarEntryModeIcon: switchToCalendarEntryModeIcon != null + ? Icon(switchToCalendarEntryModeIcon) + : const Icon(Icons.calendar_today), + switchToInputEntryModeIcon: switchToInputEntryModeIcon != null + ? Icon(switchToInputEntryModeIcon) + : const Icon(Icons.edit_outlined), ); // dialog = Localizations.override( diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index e8ca24b51..612dc7428 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -37,25 +37,27 @@ class DatePickerEntryMode(Enum): class DatePicker(Control): """ - A button lets the user select date on datepicker dialog. + A Material-style date picker dialog. - Example: - ``` - import flet as ft - from flet_core.date_picker import DatePickerMode, DatePickerEntryMode + It is added to page.overlay and can be called using its pick_date() method. + Example: + ``` + import datetime + import flet as ft def main(page: ft.Page): def change_date(e): - page.add(ft.Checkbox(label=f"Current date {date_picker.value}")) - date_button.text = f"{date_picker.value}" - page.update() + print(f"Date picker changed, value is {date_picker.value}") + + def date_picker_dismissed(e): + print(f"Date picker dismissed, value is {date_picker.value}") date_picker = ft.DatePicker( on_change=change_date, - date_picker_mode=DatePickerMode.YEAR, - date_picker_entry_mode=DatePickerEntryMode.INPUT, - hint_text="Say hello?", + on_dismiss=date_picker_dismissed, + first_date=datetime.datetime(2023, 10, 1), + last_date=datetime.datetime(2024, 10, 1), ) page.overlay.append(date_picker) @@ -70,11 +72,11 @@ def change_date(e): ft.app(target=main) - ``` + ``` - ----- + ----- - Online docs: https://flet.dev/docs/controls/date_picker + Online docs: https://flet.dev/docs/controls/date_picker """ def __init__( @@ -104,6 +106,8 @@ def __init__( error_invalid_text: Optional[str] = None, field_hint_text: Optional[str] = None, field_label_text: Optional[str] = None, + switch_to_calendar_icon: Optional[str] = None, + switch_to_input_icon: Optional[str] = None, on_change=None, on_dismiss=None, ): @@ -134,6 +138,8 @@ def __init__( self.text_style = text_style self.field_hint_text = field_hint_text self.field_label_text = field_label_text + self.switch_to_calendar_icon = switch_to_calendar_icon + self.switch_to_input_icon = switch_to_input_icon self.on_change = on_change self.on_dismiss = on_dismiss self.open = open @@ -338,6 +344,24 @@ def date_picker_entry_mode(self, value: DatePickerEntryMode): def __set_date_picker_entry_mode(self, value: DatePickerEntryMode): self._set_attr("datePickerEntryMode", value) + # switch_to_calendar_icon + @property + def switch_to_calendar_icon(self): + return self._get_attr("switchToCalendarEntryModeIcon") + + @switch_to_calendar_icon.setter + def switch_to_calendar_icon(self, value): + self._set_attr("switchToCalendarEntryModeIcon", value) + + # switch_to_input_icon + @property + def switch_to_input_icon(self): + return self._get_attr("switchToInputEntryModeIcon") + + @switch_to_input_icon.setter + def switch_to_input_icon(self, value): + self._set_attr("switchToInputEntryModeIcon", value) + # on_change @property def on_change(self): From ec6fdf3abb5d158caadd6ae439cba9d84fddfaca Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Fri, 27 Oct 2023 13:45:25 -0700 Subject: [PATCH 20/25] updated control description --- .../flet-core/src/flet_core/date_picker.py | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 612dc7428..7a9e7f965 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -39,44 +39,46 @@ class DatePicker(Control): """ A Material-style date picker dialog. - It is added to page.overlay and can be called using its pick_date() method. + It is added to [`page.overlay`](page#overlay) and called using its `pick_date()` method. - Example: - ``` - import datetime - import flet as ft + Depending on the `date_picker_mode`, it will show either a Calendar or an Input (TextField) for picking a date. - def main(page: ft.Page): - def change_date(e): - print(f"Date picker changed, value is {date_picker.value}") + Example: + ``` + import datetime + import flet as ft - def date_picker_dismissed(e): - print(f"Date picker dismissed, value is {date_picker.value}") + def main(page: ft.Page): + def change_date(e): + print(f"Date picker changed, value is {date_picker.value}") - date_picker = ft.DatePicker( - on_change=change_date, - on_dismiss=date_picker_dismissed, - first_date=datetime.datetime(2023, 10, 1), - last_date=datetime.datetime(2024, 10, 1), - ) + def date_picker_dismissed(e): + print(f"Date picker dismissed, value is {date_picker.value}") - page.overlay.append(date_picker) + date_picker = ft.DatePicker( + on_change=change_date, + on_dismiss=date_picker_dismissed, + first_date=datetime.datetime(2023, 10, 1), + last_date=datetime.datetime(2024, 10, 1), + ) - date_button = ft.ElevatedButton( - "Pick date", - icon=ft.icons.CALENDAR_MONTH, - on_click=lambda _: date_picker.pick_date(), - ) + page.overlay.append(date_picker) + + date_button = ft.ElevatedButton( + "Pick date", + icon=ft.icons.CALENDAR_MONTH, + on_click=lambda _: date_picker.pick_date(), + ) - page.add(date_button) + page.add(date_button) - ft.app(target=main) - ``` + ft.app(target=main) + ``` - ----- + ----- - Online docs: https://flet.dev/docs/controls/date_picker + Online docs: https://flet.dev/docs/controls/date_picker """ def __init__( From ef79bf9e4ebcd9359833839346034407bff04ac5 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Tue, 31 Oct 2023 09:34:50 -0700 Subject: [PATCH 21/25] refactor --- sdk/python/packages/flet-core/src/flet_core/date_picker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 7a9e7f965..7c118e166 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -14,7 +14,7 @@ from typing_extensions import Literal -DatePickerModeString = Literal["day", "year"] +# DatePickerModeString = Literal["day", "year"] class DatePickerMode(Enum): @@ -22,7 +22,7 @@ class DatePickerMode(Enum): YEAR = "year" -DatePickerEntryModeString = Literal["calendar", "input", "calendarOnly", "inputOnly"] +# DatePickerEntryModeString = Literal["calendar", "input", "calendarOnly", "inputOnly"] class DatePickerEntryMode(Enum): From a22215f8c50b7e42c2d047ca40ccd8da75bd2c31 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Tue, 31 Oct 2023 10:03:12 -0700 Subject: [PATCH 22/25] fixed switchToCalendarEntryModeIcon and switchToInputEntryModeIcon --- package/lib/src/controls/date_picker.dart | 4 ++-- sdk/python/packages/flet-core/src/flet_core/date_picker.py | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index e5e9fb91a..d77fc9920 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -117,10 +117,10 @@ class _DatePickerControlState extends State { fieldLabelText: fieldLabelText, switchToCalendarEntryModeIcon: switchToCalendarEntryModeIcon != null ? Icon(switchToCalendarEntryModeIcon) - : const Icon(Icons.calendar_today), + : null, switchToInputEntryModeIcon: switchToInputEntryModeIcon != null ? Icon(switchToInputEntryModeIcon) - : const Icon(Icons.edit_outlined), + : null, ); // dialog = Localizations.override( diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 7c118e166..9a9525461 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -14,17 +14,11 @@ from typing_extensions import Literal -# DatePickerModeString = Literal["day", "year"] - - class DatePickerMode(Enum): DAY = "day" YEAR = "year" -# DatePickerEntryModeString = Literal["calendar", "input", "calendarOnly", "inputOnly"] - - class DatePickerEntryMode(Enum): CALENDAR = "calendar" INPUT = "input" From 16fbbcbbcf4ec19ee1c208d21ea4232fb478d228 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Tue, 31 Oct 2023 10:22:04 -0700 Subject: [PATCH 23/25] removed comments --- package/lib/src/controls/date_picker.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/package/lib/src/controls/date_picker.dart b/package/lib/src/controls/date_picker.dart index d77fc9920..87201df99 100644 --- a/package/lib/src/controls/date_picker.dart +++ b/package/lib/src/controls/date_picker.dart @@ -1,9 +1,6 @@ import 'package:flutter/material.dart'; -//import 'package:flutter_redux/flutter_redux.dart'; - import '../actions.dart'; import '../flet_app_services.dart'; -//import '../models/app_state.dart'; import '../models/control.dart'; import '../protocol/update_control_props_payload.dart'; import 'form_field.dart'; From 4797b049364d594c2fe780822fce33ee8c9f8528 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Tue, 31 Oct 2023 10:26:02 -0700 Subject: [PATCH 24/25] removed DatePickerState --- sdk/python/packages/flet-core/src/flet_core/date_picker.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index 9a9525461..cf91cd58e 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -26,9 +26,6 @@ class DatePickerEntryMode(Enum): INPUT_ONLY = "inputOnly" -DatePickerState = Literal["pickDate", "initState"] - - class DatePicker(Control): """ A Material-style date picker dialog. From 2a50a1860294e3bd955fc35003cc1b77d8693ec5 Mon Sep 17 00:00:00 2001 From: InesaFitsner Date: Tue, 31 Oct 2023 10:41:33 -0700 Subject: [PATCH 25/25] updated enum properties --- .../flet-core/src/flet_core/date_picker.py | 34 +++++-------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/sdk/python/packages/flet-core/src/flet_core/date_picker.py b/sdk/python/packages/flet-core/src/flet_core/date_picker.py index cf91cd58e..032a433d4 100644 --- a/sdk/python/packages/flet-core/src/flet_core/date_picker.py +++ b/sdk/python/packages/flet-core/src/flet_core/date_picker.py @@ -297,45 +297,29 @@ def keyboard_type(self) -> Optional[KeyboardType]: @keyboard_type.setter def keyboard_type(self, value: Optional[KeyboardType]): self.__keyboard_type = value - if isinstance(value, KeyboardType): - self._set_attr("keyboardType", value.value) - else: - self.__set_keyboard_type(value) - - def __set_keyboard_type(self, value: KeyboardTypeString): - self._set_attr("keyboardType", value) + self._set_attr("keyboardType", value.value if value is not None else None) # date_picker_mode @property - def date_picker_mode(self) -> DatePickerMode: + def date_picker_mode(self) -> Optional[DatePickerMode]: return self.__date_picker_mode @date_picker_mode.setter - def date_picker_mode(self, value: DatePickerMode): + def date_picker_mode(self, value: Optional[DatePickerMode]): self.__date_picker_mode = value - if isinstance(value, DatePickerMode): - self._set_attr("datePickerMode", value.value) - else: - self.__set_date_picker_mode(value) - - def __set_date_picker_mode(self, value: DatePickerMode): - self._set_attr("datePickerMode", value) + self._set_attr("datePickerMode", value.value if value is not None else None) # date_picker_entry_mode @property - def date_picker_entry_mode(self) -> DatePickerEntryMode: + def date_picker_entry_mode(self) -> Optional[DatePickerEntryMode]: return self.__date_picker_entry_mode @date_picker_entry_mode.setter - def date_picker_entry_mode(self, value: DatePickerEntryMode): + def date_picker_entry_mode(self, value: Optional[DatePickerEntryMode]): self.__date_picker_entry_mode = value - if isinstance(value, DatePickerEntryMode): - self._set_attr("datePickerEntryMode", value.value) - else: - self.__set_date_picker_entry_mode(value) - - def __set_date_picker_entry_mode(self, value: DatePickerEntryMode): - self._set_attr("datePickerEntryMode", value) + self._set_attr( + "datePickerEntryMode", value.value if value is not None else None + ) # switch_to_calendar_icon @property