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