diff --git a/frameworks/core/interfaces/native/implementation/date_picker_dialog_accessor.cpp b/frameworks/core/interfaces/native/implementation/date_picker_dialog_accessor.cpp index fc2b012dc48e71f7d907d87a2ba40c5c2e56dcc0..d58cb9e72c9324501e0028ebe34924bf067e5ff8 100644 --- a/frameworks/core/interfaces/native/implementation/date_picker_dialog_accessor.cpp +++ b/frameworks/core/interfaces/native/implementation/date_picker_dialog_accessor.cpp @@ -26,36 +26,54 @@ namespace OHOS::Ace::NG::GeneratedModifier { namespace DatePickerDialogAccessor { -PickerDialogInfo BuildDatePickerDialogInfo(const Ark_DatePickerDialogOptions& options) +void ParseDate(const Ark_DatePickerDialogOptions& options, PickerDialogInfo& dialogInfo) { - PickerDialogInfo dialogInfo; auto pipeline = PipelineBase::GetCurrentContextSafelyWithCheck(); - CHECK_NULL_RETURN(pipeline, dialogInfo); + CHECK_NULL_VOID(pipeline); auto pickerTheme = pipeline->GetTheme(); - CHECK_NULL_RETURN(pickerTheme, dialogInfo); + CHECK_NULL_VOID(pickerTheme); // parse start and end date auto parseStartDate = pickerTheme->GetDefaultStartDate(); auto parseEndDate = pickerTheme->GetDefaultEndDate(); auto start = Converter::OptConvert(options.start); if (start) { + dialogInfo.isStartDate = true; parseStartDate = start.value(); } auto end = Converter::OptConvert(options.end); if (end) { + dialogInfo.isEndDate = true; parseEndDate = end.value(); } + if (parseStartDate.GetYear() <= 0) { + parseStartDate = pickerTheme->GetDefaultStartDate(); + } + if (parseEndDate.GetYear() <= 0) { + parseEndDate = pickerTheme->GetDefaultEndDate(); + } if (parseStartDate.ToDays() > parseEndDate.ToDays()) { parseStartDate = pickerTheme->GetDefaultStartDate(); parseEndDate = pickerTheme->GetDefaultEndDate(); } dialogInfo.parseStartDate = parseStartDate; dialogInfo.parseEndDate = parseEndDate; - // parse selected date + dialogInfo.parseSelectedDate = PickerDate(); auto selectedDate = Converter::OptConvert(options.selected); if (selectedDate) { dialogInfo.isSelectedDate = true; dialogInfo.parseSelectedDate = selectedDate.value(); } + dialogInfo.pickerTime = PickerTime(); + auto selectedTime = Converter::OptConvert(options.selected); + if (selectedTime) { + dialogInfo.pickerTime = selectedTime.value(); + } +} + +PickerDialogInfo BuildDatePickerDialogInfo(const Ark_DatePickerDialogOptions& options) +{ + PickerDialogInfo dialogInfo; + ParseDate(options, dialogInfo); auto alignment = Converter::OptConvert(options.alignment); if (alignment) { dialogInfo.alignment = alignment.value(); @@ -79,36 +97,19 @@ PickerDialogInfo BuildDatePickerDialogInfo(const Ark_DatePickerDialogOptions& op return dialogInfo; } -void ParseDateInfo(const Ark_DatePickerDialogOptions& options, DatePickerSettingData& settingData) -{ - auto start = Converter::OptConvert(options.start); - if (start) { - settingData.datePickerProperty["start"] = *start; - } - auto end = Converter::OptConvert(options.end); - if (end) { - settingData.datePickerProperty["end"] = *end; - } - auto selectedDate = Converter::OptConvert(options.selected); - auto selectedTime = Converter::OptConvert(options.selected); - if (selectedDate) { - settingData.datePickerProperty["selected"] = *selectedDate; - if (selectedTime) { - settingData.timePickerProperty["selected"] = *selectedTime; - } - } -} - DatePickerSettingData BuildSettingData(const Ark_DatePickerDialogOptions& options) { - DatePickerSettingData settingData; + DatePickerSettingData settingData = { .isLunar = false, .lunarswitch = false, .showTime = false, + .isEnableHapticFeedback = true, .useMilitary = false, .mode = DatePickerMode::DATE }; + settingData.isLunar = Converter::OptConvert(options.lunar).value_or(settingData.isLunar); settingData.lunarswitch = Converter::OptConvert(options.lunarSwitch).value_or(settingData.lunarswitch); - auto checkboxSettingData = Converter::OptConvert(options.lunarSwitchStyle); - if (checkboxSettingData) { - settingData.checkboxSettingData = *checkboxSettingData; + if (settingData.lunarswitch) { + auto checkboxSettingData = Converter::OptConvert(options.lunarSwitchStyle); + if (checkboxSettingData) { + settingData.checkboxSettingData = *checkboxSettingData; + } } - ParseDateInfo(options, settingData); settingData.showTime = Converter::OptConvert(options.showTime).value_or(settingData.showTime); settingData.useMilitary = Converter::OptConvert(options.useMilitaryTime).value_or(settingData.useMilitary); auto dateTimeOptions = Converter::OptConvert(options.dateTimeOptions); @@ -171,6 +172,41 @@ PickerDialogEvent BuildPickerDialogEvents(const Ark_DatePickerDialogOptions& opt } return dialogEvent; } +std::string ConvertDateString(const std::string& info) +{ + std::unique_ptr datePtr = JsonUtil::ParseJsonString(info); + CHECK_NULL_RETURN(datePtr, info); + int32_t year = 0; + auto yearPtr = datePtr->GetValue("year"); + if (yearPtr && yearPtr->IsNumber()) { + year = yearPtr->GetInt(); + } + int32_t month = 0; + auto monthPtr = datePtr->GetValue("month"); + if (monthPtr && monthPtr->IsNumber()) { + // 0-11 means 1 to 12 months + month = monthPtr->GetInt() + 1; + } + int32_t day = 0; + auto dayPtr = datePtr->GetValue("day"); + if (dayPtr && dayPtr->IsNumber()) { + day = dayPtr->GetInt(); + } + int32_t hour = 0; + auto hourPtr = datePtr->GetValue("hour"); + if (hourPtr && hourPtr->IsNumber()) { + hour = hourPtr->GetInt(); + } + int32_t minute = 0; + auto minutePtr = datePtr->GetValue("minute"); + if (minutePtr && minutePtr->IsNumber()) { + minute = minutePtr->GetInt(); + } + PickerDateTime dateTime; + dateTime.SetDate(PickerDate(year, month, day)); + dateTime.SetTime(PickerTime(hour, minute, 0)); + return dateTime.ToString(true); +} PickerDialogInteractiveEvent BuildSelectInteractiveEvents(const Ark_DatePickerDialogOptions& arkOptions) { @@ -182,28 +218,12 @@ PickerDialogInteractiveEvent BuildSelectInteractiveEvents(const Ark_DatePickerDi arkCallback.Invoke(); }; } - // onAccept - auto acceptCallbackOpt = Converter::OptConvert(arkOptions.onAccept); - if (acceptCallbackOpt) { - events.acceptEvent = [arkCallback = CallbackHelper(*acceptCallbackOpt)](const std::string& info) -> void { - auto result = Converter::ArkValue(info); - arkCallback.Invoke(result); - }; - } - // onChange - auto changeCallbackOpt = Converter::OptConvert(arkOptions.onChange); - if (changeCallbackOpt) { - events.changeEvent = [arkCallback = CallbackHelper(*changeCallbackOpt)](const std::string& info) -> void { - auto result = Converter::ArkValue(info); - arkCallback.Invoke(result); - }; - } // onDateAccept auto dateAcceptCallbackOpt = Converter::OptConvert(arkOptions.onDateAccept); if (dateAcceptCallbackOpt) { events.dateAcceptEvent = [arkCallback = CallbackHelper(*dateAcceptCallbackOpt)](const std::string& info) -> void { - auto result = Converter::ArkValue(info); + auto result = Converter::ArkValue(ConvertDateString(info)); arkCallback.Invoke(result); }; } @@ -212,7 +232,7 @@ PickerDialogInteractiveEvent BuildSelectInteractiveEvents(const Ark_DatePickerDi if (dateChangeCallbackOpt) { events.dateChangeEvent = [arkCallback = CallbackHelper(*dateChangeCallbackOpt)](const std::string& info) -> void { - auto result = Converter::ArkValue(info); + auto result = Converter::ArkValue(ConvertDateString(info)); arkCallback.Invoke(result); }; }