• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "frameworks/bridge/declarative_frontend/jsview/js_calendar_picker.h"
17 
18 #include "base/log/ace_scoring_log.h"
19 #include "base/utils/date_util.h"
20 #include "bridge/common/utils/engine_helper.h"
21 #include "bridge/declarative_frontend/engine/functions/js_function.h"
22 #include "bridge/declarative_frontend/jsview/js_interactable_view.h"
23 #include "bridge/declarative_frontend/jsview/js_utils.h"
24 #include "bridge/declarative_frontend/jsview/js_view_common_def.h"
25 #include "bridge/declarative_frontend/jsview/models/calendar_picker_model_impl.h"
26 #include "core/components/calendar/calendar_theme.h"
27 #include "core/components/dialog/dialog_theme.h"
28 #include "core/components_ng/base/view_abstract_model.h"
29 #include "core/components_ng/base/view_stack_processor.h"
30 #include "core/components_ng/pattern/calendar_picker/calendar_picker_model_ng.h"
31 #include "core/pipeline_ng/pipeline_context.h"
32 
33 namespace OHOS::Ace {
34 std::unique_ptr<CalendarPickerModel> CalendarPickerModel::instance_ = nullptr;
35 std::once_flag CalendarPickerModel::onceFlag_;
36 
GetInstance()37 CalendarPickerModel* CalendarPickerModel::GetInstance()
38 {
39     std::call_once(onceFlag_, []() {
40 #ifdef NG_BUILD
41         instance_.reset(new NG::CalendarPickerModelNG());
42 #else
43         if (Container::IsCurrentUseNewPipeline()) {
44             instance_.reset(new NG::CalendarPickerModelNG());
45         } else {
46             instance_.reset(new Framework::CalendarPickerModelImpl());
47         }
48 #endif
49     });
50 
51     return instance_.get();
52 }
53 } // namespace OHOS::Ace
54 
55 namespace OHOS::Ace::Framework {
56 namespace {
ParseFontOfButtonStyle(const JSRef<JSObject> & pickerButtonParamObject,ButtonInfo & buttonInfo)57 void ParseFontOfButtonStyle(const JSRef<JSObject>& pickerButtonParamObject, ButtonInfo& buttonInfo)
58 {
59     CalcDimension fontSize;
60     JSRef<JSVal> sizeProperty = pickerButtonParamObject->GetProperty("fontSize");
61     if (JSViewAbstract::ParseJsDimensionVpNG(sizeProperty, fontSize) && fontSize.Unit() != DimensionUnit::PERCENT &&
62         GreatOrEqual(fontSize.Value(), 0.0)) {
63         if (JSViewAbstract::ParseJsDimensionFp(sizeProperty, fontSize)) {
64             buttonInfo.fontSize = fontSize;
65         }
66     }
67     Color fontColor;
68     if (JSViewAbstract::ParseJsColor(pickerButtonParamObject->GetProperty("fontColor"), fontColor)) {
69         buttonInfo.fontColor = fontColor;
70     }
71     auto fontWeight = pickerButtonParamObject->GetProperty("fontWeight");
72     if (fontWeight->IsString() || fontWeight->IsNumber()) {
73         buttonInfo.fontWeight = ConvertStrToFontWeight(fontWeight->ToString(), FontWeight::MEDIUM);
74     }
75     JSRef<JSVal> style = pickerButtonParamObject->GetProperty("fontStyle");
76     if (style->IsNumber()) {
77         auto value = style->ToNumber<int32_t>();
78         if (value >= 0 && value < static_cast<int32_t>(FontStyle::NONE)) {
79             buttonInfo.fontStyle = static_cast<FontStyle>(value);
80         }
81     }
82     JSRef<JSVal> family = pickerButtonParamObject->GetProperty("fontFamily");
83     std::vector<std::string> fontFamilies;
84     if (JSViewAbstract::ParseJsFontFamilies(family, fontFamilies)) {
85         buttonInfo.fontFamily = fontFamilies;
86     }
87 }
88 
ParseButtonStyle(const JSRef<JSObject> & pickerButtonParamObject)89 ButtonInfo ParseButtonStyle(const JSRef<JSObject>& pickerButtonParamObject)
90 {
91     ButtonInfo buttonInfo;
92     if (pickerButtonParamObject->GetProperty("type")->IsNumber()) {
93         auto buttonTypeIntValue = pickerButtonParamObject->GetProperty("type")->ToNumber<int32_t>();
94         if (buttonTypeIntValue == static_cast<int32_t>(ButtonType::CAPSULE) ||
95             buttonTypeIntValue == static_cast<int32_t>(ButtonType::CIRCLE) ||
96             buttonTypeIntValue == static_cast<int32_t>(ButtonType::ARC) ||
97             buttonTypeIntValue == static_cast<int32_t>(ButtonType::NORMAL) ||
98             buttonTypeIntValue == static_cast<int32_t>(ButtonType::ROUNDED_RECTANGLE)) {
99             buttonInfo.type = static_cast<ButtonType>(buttonTypeIntValue);
100         }
101     }
102     if (pickerButtonParamObject->GetProperty("style")->IsNumber()) {
103         auto styleModeIntValue = pickerButtonParamObject->GetProperty("style")->ToNumber<int32_t>();
104         if (styleModeIntValue >= static_cast<int32_t>(ButtonStyleMode::NORMAL) &&
105             styleModeIntValue <= static_cast<int32_t>(ButtonStyleMode::TEXT)) {
106             buttonInfo.buttonStyle = static_cast<ButtonStyleMode>(styleModeIntValue);
107         }
108     }
109     if (pickerButtonParamObject->GetProperty("role")->IsNumber()) {
110         auto buttonRoleIntValue = pickerButtonParamObject->GetProperty("role")->ToNumber<int32_t>();
111         if (buttonRoleIntValue >= static_cast<int32_t>(ButtonRole::NORMAL) &&
112             buttonRoleIntValue <= static_cast<int32_t>(ButtonRole::ERROR)) {
113             buttonInfo.role = static_cast<ButtonRole>(buttonRoleIntValue);
114         }
115     }
116     ParseFontOfButtonStyle(pickerButtonParamObject, buttonInfo);
117     Color backgroundColor;
118     if (JSViewAbstract::ParseJsColor(pickerButtonParamObject->GetProperty("backgroundColor"), backgroundColor)) {
119         buttonInfo.backgroundColor = backgroundColor;
120     }
121     auto radius = ParseBorderRadiusAttr(pickerButtonParamObject->GetProperty("borderRadius"));
122     if (radius.has_value()) {
123         buttonInfo.borderRadius = radius.value();
124     }
125 
126     auto primaryValue = pickerButtonParamObject->GetProperty("primary");
127     if (primaryValue->IsBoolean()) {
128         buttonInfo.isPrimary = primaryValue->ToBoolean();
129     }
130 
131     return buttonInfo;
132 }
133 
ParseButtonStyles(const JSRef<JSObject> & paramObject)134 std::vector<ButtonInfo> ParseButtonStyles(const JSRef<JSObject>& paramObject)
135 {
136     std::vector<ButtonInfo> buttonInfos;
137     auto acceptButtonStyle = paramObject->GetProperty("acceptButtonStyle");
138     if (acceptButtonStyle->IsObject()) {
139         auto acceptButtonStyleParamObject = JSRef<JSObject>::Cast(acceptButtonStyle);
140         buttonInfos.emplace_back(ParseButtonStyle(acceptButtonStyleParamObject));
141         buttonInfos[0].isAcceptButton = true;
142     } else {
143         ButtonInfo buttonInfo;
144         buttonInfos.emplace_back(buttonInfo);
145     }
146     auto cancelButtonStyle = paramObject->GetProperty("cancelButtonStyle");
147     if (cancelButtonStyle->IsObject()) {
148         auto cancelButtonStyleParamObject = JSRef<JSObject>::Cast(cancelButtonStyle);
149         buttonInfos.emplace_back(ParseButtonStyle(cancelButtonStyleParamObject));
150     }
151 
152     return buttonInfos;
153 }
154 } // namespace
155 
GetMSByDate(const std::string & date)156 double GetMSByDate(const std::string& date)
157 {
158     auto json = JsonUtil::ParseJsonString(date);
159     if (!json || json->IsNull()) {
160         return 0.0f;
161     }
162 
163     std::tm dateTime {};
164     auto year = json->GetValue("year");
165     if (year && year->IsNumber()) {
166         dateTime.tm_year = year->GetInt() - 1900; // local date start from 1900
167     }
168     auto month = json->GetValue("month");
169     if (month && month->IsNumber()) {
170         dateTime.tm_mon = month->GetInt() - 1;
171     }
172     auto day = json->GetValue("day");
173     if (day && day->IsNumber()) {
174         dateTime.tm_mday = day->GetInt();
175     }
176     auto now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
177     auto local = std::localtime(&now);
178     CHECK_NULL_RETURN(local, 0.0f);
179     dateTime.tm_hour = local->tm_hour;
180     dateTime.tm_min = local->tm_min;
181     dateTime.tm_sec = local->tm_sec;
182     return Date::GetMilliSecondsByDateTime(dateTime);
183 }
184 
JSBind(BindingTarget globalObj)185 void JSCalendarPicker::JSBind(BindingTarget globalObj)
186 {
187     JSClass<JSCalendarPicker>::Declare("CalendarPicker");
188     JSClass<JSCalendarPicker>::StaticMethod("create", &JSCalendarPicker::Create, MethodOptions::NONE);
189     JSClass<JSCalendarPicker>::StaticMethod("edgeAlign", &JSCalendarPicker::SetEdgeAlign);
190     JSClass<JSCalendarPicker>::StaticMethod("textStyle", &JSCalendarPicker::SetTextStyle);
191     JSClass<JSCalendarPicker>::StaticMethod("onChange", &JSCalendarPicker::SetOnChange);
192     JSClass<JSCalendarPicker>::StaticMethod("border", &JSCalendarPicker::SetBorder);
193     JSClass<JSCalendarPicker>::StaticMethod("padding", &JSCalendarPicker::JsPadding);
194     JSClass<JSCalendarPicker>::StaticMethod("height", &JSCalendarPicker::JsHeight);
195     JSClass<JSCalendarPicker>::StaticMethod("borderColor", &JSCalendarPicker::JsBorderColor);
196     JSClass<JSCalendarPicker>::StaticMethod("borderRadius", &JSCalendarPicker::JsBorderRadius);
197     JSClass<JSCalendarPicker>::StaticMethod("markToday", &JSCalendarPicker::JsMarkToday);
198     JSClass<JSCalendarPicker>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
199     JSClass<JSCalendarPicker>::StaticMethod("onHover", &JSInteractableView::JsOnHover);
200     JSClass<JSCalendarPicker>::StaticMethod("onKeyEvent", &JSInteractableView::JsOnKey);
201     JSClass<JSCalendarPicker>::StaticMethod("onDeleteEvent", &JSInteractableView::JsOnDelete);
202     JSClass<JSCalendarPicker>::StaticMethod("onAttach", &JSInteractableView::JsOnAttach);
203     JSClass<JSCalendarPicker>::StaticMethod("onAppear", &JSInteractableView::JsOnAppear);
204     JSClass<JSCalendarPicker>::StaticMethod("onDetach", &JSInteractableView::JsOnDetach);
205     JSClass<JSCalendarPicker>::StaticMethod("onDisAppear", &JSInteractableView::JsOnDisAppear);
206     JSClass<JSCalendarPicker>::InheritAndBind<JSViewAbstract>(globalObj);
207 }
208 
SetBorder(const JSCallbackInfo & info)209 void JSCalendarPicker::SetBorder(const JSCallbackInfo& info)
210 {
211     if (!info[0]->IsObject()) {
212         CalendarPickerModel::GetInstance()->ClearBorder();
213         return;
214     }
215     JSRef<JSObject> object = JSRef<JSObject>::Cast(info[0]);
216     auto valueWidth = object->GetProperty("width");
217     CalcDimension value;
218     if (ParseJsDimensionVpNG(valueWidth, value) || valueWidth->IsObject()) {
219         ParseBorderWidth(valueWidth);
220     } else {
221         CalendarPickerModel::GetInstance()->ClearBorderWidth();
222     }
223 
224     // use default value when undefined.
225     ParseCalendarPickerBorderColor(object->GetProperty("color"));
226 
227     auto valueRadius = object->GetProperty("radius");
228     if (!valueRadius->IsUndefined()) {
229         ParseBorderRadius(valueRadius);
230     }
231     // use default value when undefined.
232     ParseBorderStyle(object->GetProperty("style"));
233 
234     info.ReturnSelf();
235 }
236 
ParseCalendarPickerBorderColor(const JSRef<JSVal> & args)237 void JSCalendarPicker::ParseCalendarPickerBorderColor(const JSRef<JSVal>& args)
238 {
239     auto pipelineContext = PipelineContext::GetCurrentContext();
240     CHECK_NULL_VOID(pipelineContext);
241     RefPtr<CalendarTheme> theme = pipelineContext->GetTheme<CalendarTheme>();
242     CHECK_NULL_VOID(theme);
243     if (!args->IsObject() && !args->IsNumber() && !args->IsString()) {
244         ViewAbstractModel::GetInstance()->SetBorderColor(theme->GetEntryBorderColor());
245     } else {
246         JSViewAbstract::ParseBorderColor(args);
247     }
248 }
249 
SetEdgeAlign(const JSCallbackInfo & info)250 void JSCalendarPicker::SetEdgeAlign(const JSCallbackInfo& info)
251 {
252     NG::CalendarEdgeAlign alignType = NG::CalendarEdgeAlign::EDGE_ALIGN_END;
253     DimensionOffset offset;
254     if (info[0]->IsNumber()) {
255         alignType = static_cast<NG::CalendarEdgeAlign>(info[0]->ToNumber<int32_t>());
256     }
257 
258     if (!info[1]->IsObject()) {
259         CalendarPickerModel::GetInstance()->SetEdgeAlign(alignType, offset);
260         return;
261     }
262     auto offsetObj = JSRef<JSObject>::Cast(info[1]);
263     CalcDimension dx;
264     auto dxValue = offsetObj->GetProperty("dx");
265     ParseJsDimensionVp(dxValue, dx);
266     CalcDimension dy;
267     auto dyValue = offsetObj->GetProperty("dy");
268     ParseJsDimensionVp(dyValue, dy);
269     offset = DimensionOffset(dx, dy);
270 
271     CalendarPickerModel::GetInstance()->SetEdgeAlign(alignType, offset);
272 }
273 
SetTextStyle(const JSCallbackInfo & info)274 void JSCalendarPicker::SetTextStyle(const JSCallbackInfo& info)
275 {
276     auto pipeline = PipelineBase::GetCurrentContext();
277     CHECK_NULL_VOID(pipeline);
278     RefPtr<CalendarTheme> calendarTheme = pipeline->GetTheme<CalendarTheme>();
279     CHECK_NULL_VOID(calendarTheme);
280     NG::PickerTextStyle textStyle;
281     textStyle.fontSize = calendarTheme->GetEntryFontSize();
282     textStyle.textColor = calendarTheme->GetEntryFontColor();
283     textStyle.fontWeight = FontWeight::NORMAL;
284     if (!info[0]->IsObject()) {
285         CalendarPickerModel::GetInstance()->SetTextStyle(textStyle);
286         return;
287     }
288     JSCalendarPicker::ParseTextStyle(info[0], textStyle);
289     CalendarPickerModel::GetInstance()->SetTextStyle(textStyle);
290 }
291 
SetOnChange(const JSCallbackInfo & info)292 void JSCalendarPicker::SetOnChange(const JSCallbackInfo& info)
293 {
294     if (!info[0]->IsFunction()) {
295         return;
296     }
297 
298     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
299     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
300     auto onChange = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
301                         const std::string& info) {
302         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
303         ACE_SCORING_EVENT("CalendarPicker.onChange");
304         PipelineContext::SetCallBackNode(node);
305         auto dateObj = JSDate::New(GetMSByDate(info));
306         func->ExecuteJS(1, &dateObj);
307     };
308     CalendarPickerModel::GetInstance()->SetOnChange(std::move(onChange));
309 }
310 
JsPadding(const JSCallbackInfo & info)311 void JSCalendarPicker::JsPadding(const JSCallbackInfo& info)
312 {
313     NG::PaddingProperty padding;
314     if (info[0]->IsObject()) {
315         CommonCalcDimension commonCalcDimension;
316         JSRef<JSObject> paddingObj = JSRef<JSObject>::Cast(info[0]);
317         JSViewAbstract::ParseCommonMarginOrPaddingCorner(paddingObj, commonCalcDimension);
318         if (commonCalcDimension.left.has_value() || commonCalcDimension.right.has_value() ||
319             commonCalcDimension.top.has_value() || commonCalcDimension.bottom.has_value()) {
320             padding = SetPaddings(commonCalcDimension.top, commonCalcDimension.bottom, commonCalcDimension.left,
321                 commonCalcDimension.right);
322             CalendarPickerModel::GetInstance()->SetPadding(padding);
323             return;
324         }
325     }
326 
327     CalcDimension length(-1);
328     if (ParseJsDimensionVpNG(info[0], length) && length.IsNonNegative()) {
329         padding.SetEdges(NG::CalcLength(length));
330         CalendarPickerModel::GetInstance()->SetPadding(padding);
331     } else {
332         CalendarPickerModel::GetInstance()->ClearPadding();
333     }
334 }
335 
JsHeight(const JSCallbackInfo & info)336 void JSCalendarPicker::JsHeight(const JSCallbackInfo& info)
337 {
338     auto jsValue = info[0];
339     CalcDimension value;
340     if (ParseJsDimensionVpNG(jsValue, value) && value.IsValid()) {
341         JSViewAbstract::JsHeight(info);
342     } else {
343         CalendarPickerModel::GetInstance()->ClearHeight();
344     }
345 }
346 
JsBorderColor(const JSCallbackInfo & info)347 void JSCalendarPicker::JsBorderColor(const JSCallbackInfo& info)
348 {
349     Color borderColor;
350     auto jsValue = info[0];
351     if (ParseJsColor(jsValue, borderColor) || jsValue->IsObject()) {
352         JSViewAbstract::JsBorderColor(info);
353     } else {
354         CalendarPickerModel::GetInstance()->ClearBorderColor();
355     }
356 }
357 
JsBorderRadius(const JSCallbackInfo & info)358 void JSCalendarPicker::JsBorderRadius(const JSCallbackInfo& info)
359 {
360     auto jsValue = info[0];
361     CalcDimension value;
362     if (ParseJsDimensionVpNG(jsValue, value) || jsValue->IsObject()) {
363         JSViewAbstract::JsBorderRadius(info);
364     } else {
365         CalendarPickerModel::GetInstance()->ClearBorderRadius();
366     }
367 }
368 
SetPaddings(const std::optional<CalcDimension> & top,const std::optional<CalcDimension> & bottom,const std::optional<CalcDimension> & left,const std::optional<CalcDimension> & right)369 NG::PaddingProperty JSCalendarPicker::SetPaddings(const std::optional<CalcDimension>& top,
370     const std::optional<CalcDimension>& bottom, const std::optional<CalcDimension>& left,
371     const std::optional<CalcDimension>& right)
372 {
373     NG::PaddingProperty paddings;
374     if (top.has_value()) {
375         if (top.value().Unit() == DimensionUnit::CALC) {
376             paddings.top =
377                 NG::CalcLength(top.value().IsNonNegative() ? top.value().CalcValue() : CalcDimension().CalcValue());
378         } else {
379             paddings.top = NG::CalcLength(top.value().IsNonNegative() ? top.value() : CalcDimension());
380         }
381     }
382     if (bottom.has_value()) {
383         if (bottom.value().Unit() == DimensionUnit::CALC) {
384             paddings.bottom = NG::CalcLength(
385                 bottom.value().IsNonNegative() ? bottom.value().CalcValue() : CalcDimension().CalcValue());
386         } else {
387             paddings.bottom = NG::CalcLength(bottom.value().IsNonNegative() ? bottom.value() : CalcDimension());
388         }
389     }
390     if (left.has_value()) {
391         if (left.value().Unit() == DimensionUnit::CALC) {
392             paddings.left =
393                 NG::CalcLength(left.value().IsNonNegative() ? left.value().CalcValue() : CalcDimension().CalcValue());
394         } else {
395             paddings.left = NG::CalcLength(left.value().IsNonNegative() ? left.value() : CalcDimension());
396         }
397     }
398     if (right.has_value()) {
399         if (right.value().Unit() == DimensionUnit::CALC) {
400             paddings.right =
401                 NG::CalcLength(right.value().IsNonNegative() ? right.value().CalcValue() : CalcDimension().CalcValue());
402         } else {
403             paddings.right = NG::CalcLength(right.value().IsNonNegative() ? right.value() : CalcDimension());
404         }
405     }
406 
407     return paddings;
408 }
409 
ParseSelectedDateObject(const JSCallbackInfo & info,const JSRef<JSObject> & selectedObject)410 void JSCalendarPicker::ParseSelectedDateObject(const JSCallbackInfo& info, const JSRef<JSObject>& selectedObject)
411 {
412     JSRef<JSVal> changeEventVal = selectedObject->GetProperty("changeEvent");
413     if (!changeEventVal->IsFunction()) {
414         return;
415     }
416     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(changeEventVal));
417     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
418     auto changeEvent = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
419                            const std::string& info) {
420         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
421         ACE_SCORING_EVENT("DatePicker.SelectedDateTimeChangeEvent");
422         PipelineContext::SetCallBackNode(node);
423         auto dateObj = JSDate::New(GetMSByDate(info));
424         func->ExecuteJS(1, &dateObj);
425     };
426     CalendarPickerModel::GetInstance()->SetChangeEvent(std::move(changeEvent));
427 }
428 
ParseDisabledDateRange(const JSRef<JSVal> & disabledDateRangeVal,NG::CalendarSettingData & settingData)429 void JSCalendarPicker::ParseDisabledDateRange(
430     const JSRef<JSVal>& disabledDateRangeVal, NG::CalendarSettingData& settingData)
431 {
432     if (disabledDateRangeVal->IsUndefined() || disabledDateRangeVal->IsNull() || !disabledDateRangeVal->IsArray()) {
433         return;
434     }
435 
436     JSRef<JSArray> array = JSRef<JSArray>::Cast(disabledDateRangeVal);
437     for (size_t i = 0; i < array->Length(); i++) {
438         JSRef<JSVal> dateRangeValue = array->GetValueAt(i);
439         if (!dateRangeValue->IsObject()) {
440             continue;
441         }
442         auto dateRangeObj = JSRef<JSObject>::Cast(dateRangeValue);
443         auto startValue = dateRangeObj->GetProperty("start");
444         auto endValue = dateRangeObj->GetProperty("end");
445         if (startValue->IsObject() && endValue->IsObject()) {
446             auto startDate = ParseDate(startValue, false);
447             auto endDate = ParseDate(endValue, false);
448             if (startDate.GetYear() == 0 || endDate.GetYear() == 0 || endDate < startDate) {
449                 continue;
450             }
451             std::pair<PickerDate, PickerDate> pickerDateRange;
452             pickerDateRange.first = startDate;
453             pickerDateRange.second = endDate;
454             settingData.disabledDateRange.emplace_back(pickerDateRange);
455         }
456     }
457 }
458 
Create(const JSCallbackInfo & info)459 void JSCalendarPicker::Create(const JSCallbackInfo& info)
460 {
461     NG::CalendarSettingData settingData;
462     RefPtr<CalendarTheme> calendarTheme = GetTheme<CalendarTheme>();
463     CHECK_NULL_VOID(calendarTheme);
464     CalcDimension dayRadius;
465     if (info[0]->IsObject()) {
466         auto obj = JSRef<JSObject>::Cast(info[0]);
467         if (!ParseJsDimensionVpNG(obj->GetProperty("hintRadius"), dayRadius)) {
468             dayRadius = calendarTheme->GetCalendarDayRadius();
469         }
470         auto selected = obj->GetProperty("selected");
471         auto parseSelectedDate = ParseDate(selected);
472         if (selected->IsObject() && parseSelectedDate.GetYear() != 0) {
473             JSRef<JSObject> selectedDateObj = JSRef<JSObject>::Cast(selected);
474             JSRef<JSVal> changeEventVal = selectedDateObj->GetProperty("changeEvent");
475             if (!changeEventVal->IsUndefined() && changeEventVal->IsFunction()) {
476                 ParseSelectedDateObject(info, selectedDateObj);
477                 settingData.selectedDate = ParseDate(selectedDateObj->GetProperty("value"));
478             } else {
479                 settingData.selectedDate = parseSelectedDate;
480             }
481         }
482         auto disabledDateRange = obj->GetProperty("disabledDateRange");
483         ParseDisabledDateRange(disabledDateRange, settingData);
484         PickerDate::SortAndMergeDisabledDateRange(settingData.disabledDateRange);
485         auto startDate = obj->GetProperty("start");
486         auto endDate = obj->GetProperty("end");
487         auto parseStartDate = ParseDate(startDate, false);
488         auto parseEndDate = ParseDate(endDate, false);
489         if (parseEndDate.GetYear() > 0 && parseStartDate.ToDays() > parseEndDate.ToDays()) {
490             parseStartDate = PickerDate();
491             parseEndDate = PickerDate();
492         }
493         settingData.startDate = parseStartDate;
494         settingData.endDate = parseEndDate;
495     } else {
496         dayRadius = calendarTheme->GetCalendarDayRadius();
497     }
498     settingData.dayRadius = dayRadius;
499     CalendarPickerModel::GetInstance()->Create(settingData);
500 }
501 
ParseTextStyle(const JSRef<JSObject> & paramObj,NG::PickerTextStyle & textStyle)502 void JSCalendarPicker::ParseTextStyle(const JSRef<JSObject>& paramObj, NG::PickerTextStyle& textStyle)
503 {
504     auto fontColor = paramObj->GetProperty("color");
505     auto fontStyle = paramObj->GetProperty("font");
506 
507     Color color;
508     if (ParseJsColor(fontColor, color)) {
509         textStyle.textColor = color;
510     }
511 
512     if (!fontStyle->IsObject()) {
513         return;
514     }
515     JSRef<JSObject> fontObj = JSRef<JSObject>::Cast(fontStyle);
516     auto fontSize = fontObj->GetProperty("size");
517     auto fontWeight = fontObj->GetProperty("weight");
518     if (fontSize->IsNull() || fontSize->IsUndefined()) {
519         textStyle.fontSize = Dimension(-1);
520     } else {
521         CalcDimension size;
522         if (!ParseJsDimensionFpNG(fontSize, size) || size.Unit() == DimensionUnit::PERCENT) {
523             textStyle.fontSize = Dimension(-1);
524         } else {
525             textStyle.fontSize = size;
526         }
527     }
528 
529     if (!fontWeight->IsNull() && !fontWeight->IsUndefined()) {
530         std::string weight;
531         if (fontWeight->IsNumber()) {
532             weight = std::to_string(fontWeight->ToNumber<int32_t>());
533         } else {
534             ParseJsString(fontWeight, weight);
535         }
536         textStyle.fontWeight = ConvertStrToFontWeight(weight);
537     }
538 }
539 
ParseDate(const JSRef<JSVal> & dateVal,bool useCurrentDate)540 PickerDate JSCalendarPicker::ParseDate(const JSRef<JSVal>& dateVal, bool useCurrentDate)
541 {
542     auto pickerDate = useCurrentDate ? PickerDate::Current() : PickerDate();
543     if (!dateVal->IsObject()) {
544         return pickerDate;
545     }
546     auto dateObj = JSRef<JSObject>::Cast(dateVal);
547     auto yearFuncJsVal = dateObj->GetProperty("getFullYear");
548     auto monthFuncJsVal = dateObj->GetProperty("getMonth");
549     auto dateFuncJsVal = dateObj->GetProperty("getDate");
550     if (!(yearFuncJsVal->IsFunction() && monthFuncJsVal->IsFunction() && dateFuncJsVal->IsFunction())) {
551         return pickerDate;
552     }
553     auto yearFunc = JSRef<JSFunc>::Cast(yearFuncJsVal);
554     auto monthFunc = JSRef<JSFunc>::Cast(monthFuncJsVal);
555     auto dateFunc = JSRef<JSFunc>::Cast(dateFuncJsVal);
556     JSRef<JSVal> year = yearFunc->Call(dateObj);
557     JSRef<JSVal> month = monthFunc->Call(dateObj);
558     JSRef<JSVal> date = dateFunc->Call(dateObj);
559 
560     if (year->IsNumber() && month->IsNumber() && date->IsNumber()) {
561         pickerDate.SetYear(year->ToNumber<int32_t>());
562         pickerDate.SetMonth(month->ToNumber<int32_t>() + 1); // 0-11 means 1 to 12 months
563         pickerDate.SetDay(date->ToNumber<int32_t>());
564     }
565     return pickerDate;
566 }
567 
JsMarkToday(const JSCallbackInfo & info)568 void JSCalendarPicker::JsMarkToday(const JSCallbackInfo& info)
569 {
570     bool isMarkToday = false;
571     if (info[0]->IsBoolean()) {
572         isMarkToday = info[0]->ToBoolean();
573     }
574     CalendarPickerModel::GetInstance()->SetMarkToday(isMarkToday);
575 }
576 
JSBind(BindingTarget globalObj)577 void JSCalendarPickerDialog::JSBind(BindingTarget globalObj)
578 {
579     JSClass<JSCalendarPickerDialog>::Declare("CalendarPickerDialog");
580     JSClass<JSCalendarPickerDialog>::StaticMethod("show", &JSCalendarPickerDialog::Show);
581     JSClass<JSCalendarPickerDialog>::Bind<>(globalObj);
582 }
583 
Show(const JSCallbackInfo & info)584 void JSCalendarPickerDialog::Show(const JSCallbackInfo& info)
585 {
586     auto scopedDelegate = EngineHelper::GetCurrentDelegateSafely();
587     CHECK_NULL_VOID(scopedDelegate);
588     if (!info[0]->IsObject()) {
589         return;
590     }
591 
592     if (Container::IsCurrentUseNewPipeline()) {
593         auto paramObject = JSRef<JSObject>::Cast(info[0]);
594         auto buttonInfos = ParseButtonStyles(paramObject);
595         auto dialogEvent = ChangeDialogEvent(info);
596         auto dialogCancelEvent = DialogCancelEvent(info);
597         auto dialogLifeCycleEvent = LifeCycleDialogEvent(info);
598         CalendarPickerDialogShow(paramObject, dialogEvent, dialogCancelEvent, dialogLifeCycleEvent, buttonInfos);
599     }
600 }
601 
ChangeDialogEvent(const JSCallbackInfo & info)602 std::map<std::string, NG::DialogEvent> JSCalendarPickerDialog::ChangeDialogEvent(const JSCallbackInfo& info)
603 {
604     std::map<std::string, NG::DialogEvent> dialogEvent;
605     if (!info[0]->IsObject()) {
606         return dialogEvent;
607     }
608     auto paramObject = JSRef<JSObject>::Cast(info[0]);
609     auto onChange = paramObject->GetProperty("onChange");
610     if (!onChange->IsUndefined() && onChange->IsFunction()) {
611         auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(onChange));
612         auto targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
613         auto changeId = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
614                             const std::string& info) {
615             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
616             ACE_SCORING_EVENT("CalendarDialog.onChange");
617             PipelineContext::SetCallBackNode(node);
618             auto dateObj = JSDate::New(GetMSByDate(info));
619             func->ExecuteJS(1, &dateObj);
620         };
621         dialogEvent["changeId"] = changeId;
622     }
623     auto onAccept = paramObject->GetProperty("onAccept");
624     if (!onAccept->IsUndefined() && onAccept->IsFunction()) {
625         auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(onAccept));
626         auto targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
627         auto acceptId = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
628                             const std::string& info) {
629             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
630             ACE_SCORING_EVENT("CalendarDialog.onAccept");
631             PipelineContext::SetCallBackNode(node);
632             auto dateObj = JSDate::New(GetMSByDate(info));
633             func->ExecuteJS(1, &dateObj);
634         };
635         dialogEvent["acceptId"] = acceptId;
636     }
637     return dialogEvent;
638 }
639 
DialogCancelEvent(const JSCallbackInfo & info)640 std::map<std::string, NG::DialogGestureEvent> JSCalendarPickerDialog::DialogCancelEvent(const JSCallbackInfo& info)
641 {
642     std::map<std::string, NG::DialogGestureEvent> dialogCancelEvent;
643     if (!info[0]->IsObject()) {
644         return dialogCancelEvent;
645     }
646     auto paramObject = JSRef<JSObject>::Cast(info[0]);
647     auto onCancel = paramObject->GetProperty("onCancel");
648     if (!onCancel->IsUndefined() && onCancel->IsFunction()) {
649         auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(onCancel));
650         auto targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
651         auto cancelId = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
652                             const GestureEvent& /* info */) {
653             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
654             ACE_SCORING_EVENT("CalendarDialog.onCancel");
655             PipelineContext::SetCallBackNode(node);
656             func->Execute();
657         };
658         dialogCancelEvent["cancelId"] = cancelId;
659     }
660     return dialogCancelEvent;
661 }
662 
AppearDialogEvent(const JSCallbackInfo & info,std::map<std::string,NG::DialogCancelEvent> & dialogLifeCycleEvent)663 void AppearDialogEvent(const JSCallbackInfo& info, std::map<std::string, NG::DialogCancelEvent>& dialogLifeCycleEvent)
664 {
665     if (!info[0]->IsObject()) {
666         return;
667     }
668     auto paramObject = JSRef<JSObject>::Cast(info[0]);
669     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
670     auto onDidAppear = paramObject->GetProperty("onDidAppear");
671     if (!onDidAppear->IsUndefined() && onDidAppear->IsFunction()) {
672         auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(onDidAppear));
673         auto didAppearId = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode]() {
674             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
675             ACE_SCORING_EVENT("CalendarDialog.onDidAppear");
676             PipelineContext::SetCallBackNode(node);
677             func->Execute();
678         };
679         dialogLifeCycleEvent["didAppearId"] = didAppearId;
680     }
681     auto onWillAppear = paramObject->GetProperty("onWillAppear");
682     if (!onWillAppear->IsUndefined() && onWillAppear->IsFunction()) {
683         auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(onWillAppear));
684         auto willAppearId = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode]() {
685             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
686             ACE_SCORING_EVENT("CalendarDialog.onWillAppear");
687             PipelineContext::SetCallBackNode(node);
688             func->Execute();
689         };
690         dialogLifeCycleEvent["willAppearId"] = willAppearId;
691     }
692 }
693 
DisappearDialogEvent(const JSCallbackInfo & info,std::map<std::string,NG::DialogCancelEvent> & dialogLifeCycleEvent)694 void DisappearDialogEvent(
695     const JSCallbackInfo& info, std::map<std::string, NG::DialogCancelEvent>& dialogLifeCycleEvent)
696 {
697     if (!info[0]->IsObject()) {
698         return;
699     }
700     auto paramObject = JSRef<JSObject>::Cast(info[0]);
701     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
702     auto onDidDisappear = paramObject->GetProperty("onDidDisappear");
703     if (!onDidDisappear->IsUndefined() && onDidDisappear->IsFunction()) {
704         auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(onDidDisappear));
705         auto didDisappearId = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode]() {
706             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
707             ACE_SCORING_EVENT("CalendarDialog.onDidDisappear");
708             PipelineContext::SetCallBackNode(node);
709             func->Execute();
710         };
711         dialogLifeCycleEvent["didDisappearId"] = didDisappearId;
712     }
713     auto onWillDisappear = paramObject->GetProperty("onWillDisappear");
714     if (!onWillDisappear->IsUndefined() && onWillDisappear->IsFunction()) {
715         auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(onWillDisappear));
716         auto willDisappearId = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc),
717                                       node = targetNode]() {
718             JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
719             ACE_SCORING_EVENT("CalendarDialog.onWillDisappear");
720             PipelineContext::SetCallBackNode(node);
721             func->Execute();
722         };
723         dialogLifeCycleEvent["willDisappearId"] = willDisappearId;
724     }
725 }
726 
LifeCycleDialogEvent(const JSCallbackInfo & info)727 std::map<std::string, NG::DialogCancelEvent> JSCalendarPickerDialog::LifeCycleDialogEvent(const JSCallbackInfo& info)
728 {
729     std::map<std::string, NG::DialogCancelEvent> dialogLifeCycleEvent;
730     if (!info[0]->IsObject()) {
731         return dialogLifeCycleEvent;
732     }
733     AppearDialogEvent(info, dialogLifeCycleEvent);
734     DisappearDialogEvent(info, dialogLifeCycleEvent);
735     return dialogLifeCycleEvent;
736 }
737 
ParseDate(const JSRef<JSVal> & dateVal,bool useCurrentDate)738 PickerDate JSCalendarPickerDialog::ParseDate(const JSRef<JSVal>& dateVal, bool useCurrentDate)
739 {
740     auto pickerDate = useCurrentDate ? PickerDate::Current() : PickerDate();
741     if (!dateVal->IsObject()) {
742         return pickerDate;
743     }
744     auto dateObj = JSRef<JSObject>::Cast(dateVal);
745 
746     auto yearFuncJsVal = dateObj->GetProperty("getFullYear");
747     auto monthFuncJsVal = dateObj->GetProperty("getMonth");
748     auto dateFuncJsVal = dateObj->GetProperty("getDate");
749     if (!(yearFuncJsVal->IsFunction() && monthFuncJsVal->IsFunction() && dateFuncJsVal->IsFunction())) {
750         return pickerDate;
751     }
752     auto yearFunc = JSRef<JSFunc>::Cast(yearFuncJsVal);
753     auto monthFunc = JSRef<JSFunc>::Cast(monthFuncJsVal);
754     auto dateFunc = JSRef<JSFunc>::Cast(dateFuncJsVal);
755     JSRef<JSVal> year = yearFunc->Call(dateObj);
756     JSRef<JSVal> month = monthFunc->Call(dateObj);
757     JSRef<JSVal> date = dateFunc->Call(dateObj);
758 
759     if (year->IsNumber() && month->IsNumber() && date->IsNumber()) {
760         pickerDate.SetYear(year->ToNumber<int32_t>());
761         pickerDate.SetMonth(month->ToNumber<int32_t>() + 1); // 0-11 means 1 to 12 months
762         pickerDate.SetDay(date->ToNumber<int32_t>());
763     }
764     return pickerDate;
765 }
766 
ParseDisabledDateRange(const JSRef<JSVal> & disabledDateRangeVal,NG::CalendarSettingData & settingData)767 void JSCalendarPickerDialog::ParseDisabledDateRange(
768     const JSRef<JSVal>& disabledDateRangeVal, NG::CalendarSettingData& settingData)
769 {
770     if (disabledDateRangeVal->IsUndefined() || disabledDateRangeVal->IsNull() || !disabledDateRangeVal->IsArray()) {
771         return;
772     }
773 
774     JSRef<JSArray> array = JSRef<JSArray>::Cast(disabledDateRangeVal);
775     for (size_t i = 0; i < array->Length(); i++) {
776         JSRef<JSVal> dateRangeValue = array->GetValueAt(i);
777         auto dateRangeObj = JSRef<JSObject>::Cast(dateRangeValue);
778         auto startValue = dateRangeObj->GetProperty("start");
779         auto endValue = dateRangeObj->GetProperty("end");
780         if (startValue->IsObject() && endValue->IsObject()) {
781             auto startDate = ParseDate(startValue);
782             auto endDate = ParseDate(endValue);
783             if (startDate.GetYear() == 0 || endDate.GetYear() == 0 || endDate < startDate)
784                 continue;
785             std::pair<PickerDate, PickerDate> pickerDateRange;
786             pickerDateRange.first = startDate;
787             pickerDateRange.second = endDate;
788             settingData.disabledDateRange.emplace_back(pickerDateRange);
789         }
790     }
791 }
792 
CalendarPickerDialogShow(const JSRef<JSObject> & paramObj,const std::map<std::string,NG::DialogEvent> & dialogEvent,const std::map<std::string,NG::DialogGestureEvent> & dialogCancelEvent,const std::map<std::string,NG::DialogCancelEvent> & dialogLifeCycleEvent,const std::vector<ButtonInfo> & buttonInfos)793 void JSCalendarPickerDialog::CalendarPickerDialogShow(const JSRef<JSObject>& paramObj,
794     const std::map<std::string, NG::DialogEvent>& dialogEvent,
795     const std::map<std::string, NG::DialogGestureEvent>& dialogCancelEvent,
796     const std::map<std::string, NG::DialogCancelEvent>& dialogLifeCycleEvent,
797     const std::vector<ButtonInfo>& buttonInfos)
798 {
799     auto container = Container::CurrentSafely();
800     CHECK_NULL_VOID(container);
801     auto pipelineContext = AccessibilityManager::DynamicCast<NG::PipelineContext>(container->GetPipelineContext());
802     CHECK_NULL_VOID(pipelineContext);
803     auto executor = pipelineContext->GetTaskExecutor();
804     CHECK_NULL_VOID(executor);
805 
806     auto theme = GetTheme<DialogTheme>();
807     CHECK_NULL_VOID(theme);
808     auto calendarTheme = pipelineContext->GetTheme<CalendarTheme>();
809     NG::CalendarSettingData settingData;
810     auto markToday = paramObj->GetProperty("markToday");
811     bool isMarkToday = false;
812     if (markToday->IsBoolean()) {
813         isMarkToday = markToday->ToBoolean();
814     }
815     settingData.markToday = isMarkToday;
816     auto disabledDateRange = paramObj->GetProperty("disabledDateRange");
817     ParseDisabledDateRange(disabledDateRange, settingData);
818     PickerDate::SortAndMergeDisabledDateRange(settingData.disabledDateRange);
819     auto selectedDate = paramObj->GetProperty("selected");
820     auto parseSelectedDate = ParseDate(selectedDate, true);
821 
822     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_EIGHTEEN)) {
823         auto startDate = paramObj->GetProperty("start");
824         auto endDate = paramObj->GetProperty("end");
825         auto parseStartDate = ParseDate(startDate);
826         auto parseEndDate = ParseDate(endDate);
827         if (parseEndDate.GetYear() > 0 && parseStartDate.ToDays() > parseEndDate.ToDays()) {
828             parseStartDate = PickerDate();
829             parseEndDate = PickerDate();
830         }
831         settingData.startDate = parseStartDate;
832         settingData.endDate = parseEndDate;
833         parseSelectedDate = PickerDate::AdjustDateToRange(parseSelectedDate, parseStartDate, parseEndDate);
834     }
835 
836     if (parseSelectedDate.GetYear() != 0) {
837         settingData.selectedDate = parseSelectedDate;
838     }
839 
840     CalcDimension radius;
841     if (ParseJsDimensionVpNG(paramObj->GetProperty("hintRadius"), radius)) {
842         settingData.dayRadius = radius;
843     }
844 
845     DialogProperties properties;
846     properties.alignment = theme->GetAlignment();
847     if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_TWELVE)) {
848         properties.alignment = DialogAlignment::CENTER;
849     }
850 
851     auto backgroundColorValue = paramObj->GetProperty("backgroundColor");
852     Color backgroundColor;
853     if (JSViewAbstract::ParseJsColor(backgroundColorValue, backgroundColor)) {
854         properties.backgroundColor = backgroundColor;
855     }
856 
857     auto backgroundBlurStyle = paramObj->GetProperty("backgroundBlurStyle");
858     if (backgroundBlurStyle->IsNumber()) {
859         auto blurStyle = backgroundBlurStyle->ToNumber<int32_t>();
860         if (blurStyle >= static_cast<int>(BlurStyle::NO_MATERIAL) &&
861             blurStyle <= static_cast<int>(BlurStyle::COMPONENT_ULTRA_THICK)) {
862             properties.backgroundBlurStyle = blurStyle;
863         }
864     }
865 
866     auto shadowValue = paramObj->GetProperty("shadow");
867     Shadow shadow;
868     if ((shadowValue->IsObject() || shadowValue->IsNumber()) && JSViewAbstract::ParseShadowProps(shadowValue, shadow)) {
869         properties.shadow = shadow;
870     }
871 
872     properties.customStyle = false;
873     if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TWELVE)) {
874         properties.offset = DimensionOffset(Offset(0, -theme->GetMarginBottom().ConvertToPx()));
875         NG::BorderRadiusProperty dialogRadius;
876         dialogRadius.SetRadius(calendarTheme->GetDialogBorderRadius());
877         properties.borderRadius = dialogRadius;
878     }
879     JSViewAbstract::SetDialogHoverModeProperties(paramObj, properties);
880     JSViewAbstract::SetDialogBlurStyleOption(paramObj, properties);
881     JSViewAbstract::SetDialogEffectOption(paramObj, properties);
882 
883     auto context = AccessibilityManager::DynamicCast<NG::PipelineContext>(pipelineContext);
884     auto overlayManager = context ? context->GetOverlayManager() : nullptr;
885     executor->PostTask(
886         [properties, settingData, dialogEvent, dialogCancelEvent, dialogLifeCycleEvent, buttonInfos,
887             weak = WeakPtr<NG::OverlayManager>(overlayManager)] {
888             auto overlayManager = weak.Upgrade();
889             CHECK_NULL_VOID(overlayManager);
890             overlayManager->ShowCalendarDialog(
891                 properties, settingData, dialogEvent, dialogCancelEvent, dialogLifeCycleEvent, buttonInfos);
892         },
893         TaskExecutor::TaskType::UI, "ArkUIDialogShowCalendarPicker",
894         TaskExecutor::GetPriorityTypeWithCheck(PriorityType::VIP));
895 }
896 } // namespace OHOS::Ace::Framework
897