UNPKG

@rdkmaster/jigsaw-labs

Version:

Jigsaw, the next generation component set for RDK

229 lines (228 loc) 8.66 kB
import { ElementRef, EventEmitter, OnDestroy, OnInit, Renderer2 } from "@angular/core"; import { ControlValueAccessor } from "@angular/forms"; import { AbstractJigsawComponent } from "../common"; import { TimeGr, TimeWeekStart } from "../../service/time.service"; import { PopupService } from "../../service/popup.service"; import { Time, WeekTime } from "../../service/time.types"; import { TranslateService } from "@ngx-translate/core"; /** * 时间范围生成函数,用于生成自定义的时间范围 * * $demo = range-time/gr-items */ export declare type TimeShortcutFunction = () => [WeekTime, WeekTime]; /** * 表示一个自定义的时间范围,一般用于配合`JigsawRangeTime.grItems`属性使用,用于设置某个粒度下快速时间范围选择。 */ export declare class Shortcut { /** * 国际化提示信息,将被直接显示在界面上 * $demo = range-time/gr-items */ label: string; /** * 时间范围的起止时间点,可以给出固定值,也可以给一个产生起止时间点的函数 * $demo = range-time/gr-items */ dateRange: [WeekTime, WeekTime] | TimeShortcutFunction; } /** * 一个时间粒度 */ export declare class GrItem { /** * 国际化提示信息,将被直接显示在界面上 */ label: string; /** * 粒度值 * * $demo = range-time/gr-items * $demo = time/gr */ value: TimeGr; /** * 配置当前粒度下,用户能够选择的最大时间跨度。当某些查询请求必须约束用户选择某个范围内的时间时,这个配置项将非常有用。 * 例如查询银行流水时,我们常常被约束最长只能查询3个月的流水等。 * * 支持时间宏。关于时间宏,请参考这里`TimeUnit`的说明。 * * $demo = range-time/gr-items */ span?: string; /** * 给出一组预定义的时间范围,这样用户可以通过这些值快速的设置好待选的时间范围,提高易用性。 * 只在和`JigsawRangeTime`配合使用时才有效 * * 支持时间宏。关于时间宏,请参考这里`TimeUnit`的说明。 * * $demo = range-time/gr-items */ shortcuts?: Shortcut[]; } /** * 用于在界面上提供一个时刻的选择,支持多种时间粒度切换,支持年月日时分秒及其各种组合,如下是一些常见的场景及其建议: * * - 如果需要选择的是一个时间范围,则请使用`JigsawRangeTime`; * - 如果你需要的是一个日历的功能,那请参考[这个demo]($demo=table/calendar),通过表格+渲染器的方式来模拟; * - 时间选择器常常是收纳到下拉框中以解决视图空间,Jigsaw是通过`JigsawComboSelect`来组合使用的, * 参考[这个demo]($demo=time/with-combo-select); * * 时间控件是对表单友好的,你可以给时间控件编写表单校验器,参考[这个demo]($demo=form/template-driven)。 * * $demo = time/full * $demo = time/basic */ export declare class JigsawTime extends AbstractJigsawComponent implements ControlValueAccessor, OnInit, OnDestroy { private _el; private _renderer; private _popService; private _translateService; valid: boolean; /** * 当时间粒度被用户切换之后,Jigsaw会发出此事件。 * * $demo = time/gr * * @type {EventEmitter<TimeGr>} */ grChange: EventEmitter<TimeGr>; /** * @internal */ _$gr: TimeGr; /** * 时间当前的粒度,在双绑模式下改变这值可以让时间控件更换到对应的粒度。 * * $demo = time/gr * * @return {TimeGr | string} */ gr: TimeGr | string; private _value; /** * 当前所选中的时刻,在双绑模式下,更新这个值可以让时间控件选中对应的时刻。 * * 支持时间宏。关于时间宏,请参考这里`TimeUnit`的说明。 * * $demo = time/basic * * @return {WeekTime} */ date: WeekTime; /** * 当时间被用户切换之后,Jigsaw会发出此事件。 * * $demo = time/basic * * @type {EventEmitter<WeekTime>} */ dateChange: EventEmitter<WeekTime>; private _limitEnd; /** * 时间控件允许选择的时间截止时刻,默认是无限制的未来。这个约束对所有的粒度都生效。 * * 支持时间宏。关于时间宏,请参考这里`TimeUnit`的说明。 * * $demo = time/limit-start * $demo = time/limit-end * * @return {Time} */ limitEnd: Time; private _limitStart; /** * 时间控件允许选择的时间开始时刻,默认是无限制的过去。这个约束对所有的粒度都生效。 * * 支持时间宏。关于时间宏,请参考这里`TimeUnit`的说明。 * * $demo = time/limit-start * $demo = time/limit-end * * @return {Time} */ limitStart: Time; /** * 时间刷新的间隔毫秒数,主要针对startDate或endDate设置为now或now-2h等需要不时刷新的场景 */ private _refreshInterval; /** * 刷新时间宏的间隔毫秒数,默认不刷新。 * * 解决的场景是:在界面上弄了个时间选择器,页面打开时默认选中当前时刻,并限制了用户只能选择过去3小时的时间,这很快就可以完成,毫无难度。 * 然而用户使用时是这样的,他打开了页面后,就去处理别的事情去了,几个小时之后再回来想用这个已经打开的页面去查询一些东西, * 结果发现界面上时间怎么选都不对(因为那个时刻初始化了一次之后就再也没有更新,还停留在几个小时之前),只好刷新页面,用户常常抱怨这一点。 * * 这个场景下,只要设置一个大于0的数字给时间控件的这个属性即可解决。 * * $demo = time/refresh-interval * * @return {number} */ refreshInterval: number; private _weekStart; /** * 设置周开始日期,可选值 sun mon tue wed thu fri sat,默认值是sun。 * * $demo = time/week-start */ weekStart: string | TimeWeekStart; /** * 设置时间控件所支持的粒度。如果你的场景只允许用户选择天、周,则设置了这2个粒度之后,用户无法选择其他的粒度。 * * $demo = time/gr-items */ grItems: GrItem[]; /** * 有些时候我们需要提示用户选择那些时间是最佳的,可以通过`recommendedBegin``recommendedEnd`来设置。 * * $demo = time/recommended */ recommendedBegin: Time; /** * 有些时候我们需要提示用户选择那些时间是最佳的,可以通过`recommendedBegin``recommendedEnd`来设置。 * * $demo = time/recommended */ recommendedEnd: Time; /** * 推荐日期提示标签,默认值是`"推荐日期"``"Recommend"` */ recommendedLabel: String; /** * time插件容器(jq对象) */ private _timePicker; private _intervalId; private _langChangeSubscriber; constructor(_el: ElementRef, _renderer: Renderer2, _popService: PopupService, _translateService: TranslateService); ngOnInit(): void; private _defineLocale(); ngOnDestroy(): void; private _destroyPicker(); private _initDatePicker(); private _bindActiveDayClickHandler(picker); private _setDate(value); /** * @internal */ _$changeGranularity(select: GrItem): void; private _checkMacro(); private _handleLimitStartAndEnd(); private _weekHandle(); private _handleValueChange(changeValue, gr, emit?); private _handleValue(value); private _handleWeekSelect(); private _tooltipInfo; private _eventHelper; private _handleRecommended(nativeElement, popService); private static _searchDateForDay(begin, end, sourceNodes, headObj); private static _parseDay(val); private static _parseMonth(val); private static _searchDateForMonth(begin, end, sourceNodes, headNode); private static _getDataPickerNode(granularity, nativeElement, isHead?); private _propagateChange; writeValue(newValue: any): void; registerOnChange(fn: any): void; registerOnTouched(fn: any): void; }