snail.vue 2.0.28 → 2.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
1
  import * as snail_core from 'snail.core';
2
- import { DateFormat, DateValue, TimeValue, IScope, RunResult, IAsyncScope } from 'snail.core';
3
- import * as snail_view from 'snail.view';
4
- import { ScrollbarOptions, ScrollStatus, CSSClassOptions, BaseStyle, HeightStyle, FlexBoxStyle, WidthStyle, BorderStyle, PaddingStyle, MarginStyle } from 'snail.view';
2
+ import { DateFormat, DateValue, TimeValue, IAsyncScope, IScope, RunResult } from 'snail.core';
5
3
  import * as vue from 'vue';
6
4
  import { Component, ShallowRef, Ref, WatchSource, App } from 'vue';
5
+ import * as snail_view from 'snail.view';
6
+ import { ScrollbarOptions, ScrollStatus, CSSClassOptions, BaseStyle, HeightStyle, FlexBoxStyle, WidthStyle, BorderStyle, PaddingStyle, MarginStyle } from 'snail.view';
7
7
 
8
8
  /**
9
9
  * loading提示框的配置选项
@@ -212,6 +212,12 @@ type DatePickerOptions = {
212
212
  * - 默认 “yyyy-MM-dd"
213
213
  */
214
214
  format?: DateFormat;
215
+ /**
216
+ * 渲染模式
217
+ * - default 默认模式,文本框+图标,文本框填充满+边框
218
+ * - simple 简单模式,有值时才显示文本框,且无边框+不填充满
219
+ */
220
+ mode?: "default" | "simple";
215
221
  /**
216
222
  * 日期最小值
217
223
  * - 选择年月日时,早于此值的年月日不可选
@@ -249,6 +255,12 @@ type TimePickerOptions = {
249
255
  * 时间格式
250
256
  */
251
257
  format?: "HH:mm:ss" | "HH:mm";
258
+ /**
259
+ * 渲染模式
260
+ * - default 默认模式,文本框+图标,文本框填充满+边框
261
+ * - simple 简单模式,有值时才显示文本框,且无边框+不填充满
262
+ */
263
+ mode?: "default" | "simple";
252
264
  /**
253
265
  * 最小时间
254
266
  * - 传入值格式为 "时:分:秒"
@@ -313,6 +325,188 @@ type TimePickerMinuteItem = Required<Pick<TimeValue, "minute" | "hour"> & Disabl
313
325
  */
314
326
  type TimePickerSecondItem = Required<TimeValue & DisabledOptions>;
315
327
 
328
+ /**
329
+ * 组件配置选项
330
+ */
331
+ type ComponentOptions = {
332
+ /**
333
+ * 组件名称;
334
+ * - 确保组件已注册,否则会加载不出来
335
+ */
336
+ name?: string;
337
+ /**
338
+ * Vue组件对象
339
+ * - name未传入时生效
340
+ * - 推荐外部使用 shallowRef 包裹对象,避免响应式的性能问题
341
+ */
342
+ component?: Component;
343
+ /**
344
+ * 组件js文件url地址
345
+ * - 支持#号锚点钻取
346
+ * - name、component未传入时生效
347
+ */
348
+ url?: string;
349
+ };
350
+ /**
351
+ * 提取组件的props类型
352
+ * - 有效的 Props 类型:extends Record<string, any>
353
+ * - 有效类型则返回 Props 自身;否则无效,为undefined
354
+ */
355
+ type PropsType<Props> = Props extends Record<string, any> ? Props : undefined;
356
+ /**
357
+ * 事件发射器类型
358
+ * - 将【组件中组件】转换为vue的 defineEmits 类型
359
+ * - 用于将组件的事件发射器包裹传递到其他组件、class中使用
360
+ */
361
+ type EmitterType<Events extends Record<string, any[]>> = {
362
+ <K extends keyof Events>(event: K, ...payload: Events[K]): any;
363
+ };
364
+ /**
365
+ * 提取【组件插槽】类型
366
+ */
367
+ type SlotsType<Slots extends Record<string, any>> = {
368
+ [key in keyof Slots]: (props: Slots[key]) => any;
369
+ };
370
+ /**
371
+ * 提取【组件事件】类型
372
+ * - 将【组件事件】中的key首字母小写,追加上on前缀;key对应的value为监听函数参数
373
+ * - T的类型约束:Record<string, unknown[]>
374
+ */
375
+ type EventsType<Events> = Events extends Record<string, unknown[]> ? ({
376
+ [key in keyof Events as `on${Capitalize<string & key>}`]?: (...args: Events[key]) => void;
377
+ }) : never;
378
+ /**
379
+ * 组件绑定 配置选项
380
+ * - Props、Events、Model 为可选泛型,分别约束 props、events、model 属性
381
+ * - 若泛型类型无效,则对应属性类型强制为undefined;详细参照对应属性说明
382
+ */
383
+ type ComponentBindOptions<Props = void, Model = void> = {
384
+ /**
385
+ * 传递给组件的属性值,执行 v-bind 绑定
386
+ * - key为属性名称,遵循vue解析规则;若绑定事件,则key为 on事件名称 ,事件名称首字母大写
387
+ * - 通过泛型类型 Props 约束,有效类型:Props extends Record<string, any>
388
+ * @see EventsType<Events> 获取组件事件类型
389
+ */
390
+ props?: PropsType<Props>;
391
+ /**
392
+ * 传递给组件的双向绑定数据,执行 v-model 绑定
393
+ * - 使用 ShallowRef/Ref 包裹;推荐 ShallowRef,仅和组件进行.value值交互,避免深层双向影响性能
394
+ * - 通过泛型类型 Model 约束,有效类型: 非void、never、null、undefined等无效类型
395
+ */
396
+ model?: Model extends (void | never | null | undefined) ? undefined : (ShallowRef<Model> | Ref<Model>);
397
+ };
398
+
399
+ /**
400
+ * 公共通用数据结构:
401
+ * 1、在弹窗、模态弹窗、跟随弹窗的效果下复用
402
+ */
403
+
404
+ /**
405
+ * 弹窗配置选项
406
+ * - 约束弹出组件信息
407
+ * - 弹出组件时传递的参数信息
408
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
409
+ */
410
+ type PopupOptions<Props = void, Model = void> = ComponentOptions & ComponentBindOptions<Props, Model> & {
411
+ /**
412
+ * 弹窗动画名
413
+ * - 不传则默认“fade”
414
+ * - 动画规则:打开弹窗时,为 [transition]-in ;关闭弹窗时,为[transition]-out
415
+ * - - 传入 "scale",则打开弹窗为 "scale-in";关闭弹窗时为 "scale-out"
416
+ */
417
+ transition?: string;
418
+ /**
419
+ * 动画持续时间
420
+ * - 配合 transition 使用;单位ms,默认500ms
421
+ * - 外部传入自定义动画时,传入动画持续时间,否则可能导致关闭时动画失效
422
+ */
423
+ transitionDuration?: number;
424
+ /**
425
+ * 自定义class
426
+ * - 绑定到内容组件根元素上
427
+ * - 可以直接在props中指定,无需特殊设置
428
+ class?: string | string[];
429
+ */
430
+ /**
431
+ * 自定义style
432
+ * - 绑定到内容组件根元素上
433
+ * - 可以直接在props中指定,无需特殊设置
434
+ style?: AllStyle;
435
+ */
436
+ /**
437
+ * 弹窗的z-index值
438
+ * - 无特殊情况,建议不指定,内部会自动生成,确保弹窗正确性
439
+ */
440
+ zIndex?: number;
441
+ };
442
+ /**
443
+ * 弹出组件句柄
444
+ */
445
+ type PopupHandle<T> = {
446
+ /**
447
+ * 组件是否在【弹出窗口】中
448
+ * - popup : 普通弹出弹窗
449
+ * - dialog : 模态对话弹窗
450
+ * - follow : 跟随效果弹窗
451
+ */
452
+ inPopup: Readonly<"popup" | "dialog" | "follow">;
453
+ /**
454
+ * 关闭弹窗
455
+ * @param data 关闭时传递数据
456
+ */
457
+ closePopup(data?: T): void;
458
+ };
459
+ /**
460
+ * 弹窗状态:响应式
461
+ * - open 打开
462
+ * - active 激活,针对Dialog弹窗生效
463
+ * - unactive 非激活,针对Dialog弹窗生效
464
+ * - closed 关闭
465
+ */
466
+ type PopupStatus = ShallowRef<"open" | "active" | "unactive" | "closed">;
467
+ /**
468
+ * 弹窗状态 配置选项
469
+ */
470
+ type PopupStatusOptions = {
471
+ /**
472
+ * 弹窗状态:响应式
473
+ */
474
+ popupStatus: PopupStatus;
475
+ };
476
+ /**
477
+ * 弹窗对象描述器
478
+ * - 给弹窗容器使用,传递过去作为props使用
479
+ */
480
+ type PopupDescriptor<Options extends PopupOptions, ExtOptions> = PopupStatusOptions & {
481
+ /**
482
+ * 弹窗Id
483
+ * - 自动分配,全局唯一
484
+ */
485
+ popupId: string;
486
+ /**
487
+ * 弹窗配置选项
488
+ * - 由外部传递过来的业务数据配置信息
489
+ * - 约束具体弹窗的业务组件和业务组件所需props等数据
490
+ */
491
+ options: Options;
492
+ /**
493
+ * 弹窗扩展配置选项
494
+ * - 由 popup、follow等方法内部组件:如关闭弹窗方法、钩子函数等
495
+ * - 配合业务组件使用的一些配置数据
496
+ */
497
+ extOptions: ExtOptions;
498
+ /**
499
+ * 实际分配的zIndex值
500
+ */
501
+ zIndex: number;
502
+ /**
503
+ * 弹窗动画名
504
+ * - 约束打开、关闭动画;基于 PopupOptions.transition 构建出来的
505
+ * - 具体使用方,将此值绑定的根元素上
506
+ */
507
+ popupTransition: ShallowRef<string>;
508
+ };
509
+
316
510
  /**
317
511
  * 头部配置选项
318
512
  * - title 将作为头部标题,无则不展示标题区域
@@ -470,1826 +664,1852 @@ type WrapperOptions = {
470
664
  type WrapperEvents = FooterEvents;
471
665
 
472
666
  /**
473
- * 树形 数据相关的基础实体结构
474
- * 1、封装一些基础实体;如树形节点数据结构
475
- * 2、配合树形组件使用;如select的多级筛选,树组件等
476
- * 3、封装树的基础共性操作,如显隐判断、搜索查询等
477
- */
478
- /**
479
- * 树节点
480
- * - 仅提供树节点基础属性;可以基于 Extend 为 TreeNode 扩展节点属性
667
+ * 模态弹窗数据结构
481
668
  */
482
- type TreeNode<T, Extend extends Record<string, any> | void = void> = {
483
- /**
484
- * 展示文本
485
- */
486
- text: string;
487
- /**
488
- * 附带数据
489
- */
490
- data?: T;
491
- /**
492
- * 子选择项 数据源
493
- */
494
- children?: TreeNode<T, Extend>[];
495
- } & (Extend extends void ? {} : Extend);
669
+
496
670
  /**
497
- * 树节点 扩展
498
- * - 配合 树上下文 使用
671
+ * 模态弹窗 配置选项
672
+ * - 继承 ComponentOptions ,动态加载组件
673
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
499
674
  */
500
- type TreeNodeExtend = {
675
+ type DialogOptions<Props = void, Model = void> = PopupOptions<Props, Model> & {
501
676
  /**
502
- * 节点Id,确保唯一
503
- * - 不传入则内部自动 newId()
677
+ * 包裹器配置
678
+ * - 若传入配置,则启用弹窗包裹;弹窗打开时使用`Wrapper`包裹弹窗内容组件
504
679
  */
505
- readonly id?: string;
680
+ wrapper?: Pick<WrapperOptions, "header" | "content" | "footer">;
506
681
  /**
507
- * 是否可点击
508
- * - true 此节点可点击,点击时触发 click 事件
509
- * - false 此节点不可点击
682
+ * 禁用【遮罩层】
683
+ * - 目前没实现,先忽略
684
+ maskDisabled?: boolean;
510
685
  */
511
- clickable?: boolean;
512
686
  /**
513
- * 是否可搜索
514
- * - 为true时,此节点可搜索
687
+ * 点击【遮罩层】时是否关闭弹窗
688
+ * - 针对无遮罩层的弹窗,则点击非【弹窗组件】区域时是否关闭
515
689
  */
516
- searchable?: boolean;
690
+ closeOnMask?: boolean;
517
691
  /**
518
- * 是否隐藏
519
- * - true 隐藏 节点 和 子节点
520
- * - 隐藏组件,不参与点击、搜索等
692
+ * 按下【ESC】健时是否关闭弹窗
521
693
  */
522
- hidden?: boolean;
694
+ closeOnEscape?: boolean;
523
695
  /**
524
- * 是否固定
525
- * - true 固定 节点;则节点不参与 搜索、移动等动态操作
696
+ * 模态弹窗的自定义class
697
+ * - 绑定到模态弹窗的根元素上
526
698
  */
527
- fixed?: boolean;
699
+ rootClass?: string | string[];
528
700
  };
529
701
  /**
530
- * 树的基础上下文对象
702
+ * 弹窗组件句柄
703
+ * - 用于在弹窗内容组件中进行模式判断和关闭
531
704
  */
532
- interface ITreeBaseContext<T> {
533
- /**
534
- * 执行搜索
535
- * @param text 搜索文本
536
- */
537
- doSearch(text: string): void;
705
+ type DialogHandle<T> = PopupHandle<T> & {
538
706
  /**
539
- * 是否是【已激活】节点
540
- * @param node 要判断的节点
541
- * @returns true 是已激活节点,false
707
+ * 注册监听【弹窗关闭】事件方法
708
+ * - 仅支持注册一次,多次注册以最后一次的为准
709
+ * @param fn 关闭时执行的钩子函数,支持异步;;调用后若返回false时将阻止弹窗关闭
542
710
  */
543
- isActived(node: TreeNode<T>): boolean;
711
+ onBeforeClose(fn: (data?: T) => false | undefined | Promise<false | undefined>): void;
712
+ };
713
+ /**
714
+ * 弹窗包裹器操作句柄
715
+ */
716
+ type DialogWrapperHandle<T> = {
544
717
  /**
545
- * 是否是【补丁】节点
546
- * - 子节点搜索命中时,父级路径上节点没命中,则作父级路径节点作为路径修补节点存在,避免命中子节点展示不出来
547
- * @param node 要判断的节点
548
- * @returns true 是补丁节点,false 不是补丁节点
718
+ * 注册【构建数据】事件方法
719
+ * - 仅在Dialog为使用了wrapper模式时生效,用于在【确认】按钮点击时,构建实际内容组件中的数据
720
+ * - 仅支持注册一次,多次注册以最后一次的为准
721
+ * @param fn 取数据时执行的钩子函数,支持异步;若需要阻止弹窗关闭则`fn`方法直接报错即可
549
722
  */
550
- isPatched(node: TreeNode<T>): boolean;
723
+ onBuildData(fn: () => T | Promise<T>): void;
724
+ };
725
+
726
+ /**
727
+ * 确认弹窗配置选项
728
+ * - title 弹窗标题,默认“提示”
729
+ * - message 确认提示信息;默认“请确认?”;支持html格式内容
730
+ */
731
+ type ConfirmOptions = TitleOptions & MessageOptions & ConfirmAreaOptions & {};
732
+
733
+ /**
734
+ * 图标配置选项
735
+ * - title 作为鼠标移入图标时的提示
736
+ */
737
+ type IconOptions = TitleOptions & {
551
738
  /**
552
- * 是否显示【树节点】
553
- * @param node 要判断的节点
554
- * @param needPatched 是否需要【补丁】节点。true时(补丁节点始终显示);false时(根据hidden和搜索结果判断)
555
- * @returns 能显示返回true;否则返回false
739
+ * 是否为自定义图标
740
+ * - 为true时,外部通过插槽自己绘制图标
741
+ * - false时,使用`type`值绘制对应的内置图标
742
+ * - 默认false
556
743
  */
557
- isShow(node: TreeNode<T, TreeNodeExtend>, needPatched: boolean): boolean;
744
+ custom?: boolean;
558
745
  /**
559
- * 是否显示指定【树节点】的子节点
560
- * - 不会判断node节点自身是否可显示
561
- * @param node 要判断的节点
562
- * @param needPatched 是否需要【补丁】节点。true时(补丁节点始终显示);false时(根据hidden和搜索结果判断)
563
- * @returns 能显示返回true;否则返回false
746
+ * 内置的图标类型
747
+ * - `custom`为false时生效
564
748
  */
565
- isShowChildren(node: TreeNode<T, TreeNodeExtend>, needPatched: boolean): boolean;
749
+ type?: IconType;
566
750
  /**
567
- * 获取指定【树节点】的路径
568
- * @param node 树节点
569
- * @returns 从【顶级节点】->【指定节点】的全路径数据
751
+ * 是否是按钮图标
752
+ * - true时,鼠标移入时 cursor:pointer;
570
753
  */
571
- getPath(node: TreeNode<T, TreeNodeExtend>): TreeNode<T, TreeNodeExtend>[];
754
+ button?: boolean;
572
755
  /**
573
- * 获取指定【树节点】的唯一Key值
574
- * - 相同节点确保唯一,且不变;用于唯一标记此节点
575
- * @param node
576
- * @returns 返回节点唯一Key值
756
+ * 图标大小
757
+ * - 可指定对象,如 { width: 24, height: 24 },则图标大小为 24 * 24
758
+ * - 可指定数字,如 24,则图标大小为 24 * 24
759
+ * - 默认 24
577
760
  */
578
- getKey(node: TreeNode<T>): string;
579
- }
580
- /**
581
- * 树搜索结果
582
- */
583
- type TreeSearchResult<T> = {
761
+ size?: number | {
762
+ width?: number;
763
+ height?: number;
764
+ };
584
765
  /**
585
- * 匹配上的节点集合
766
+ * 图标颜色
586
767
  */
587
- matched: TreeNode<T>[];
768
+ color?: string;
588
769
  /**
589
- * 未匹配上的节点集合
770
+ * 鼠标移入时的图标颜色
590
771
  */
591
- failed: TreeNode<T>[];
772
+ hoverColor?: string;
592
773
  /**
593
- * 搜索时的【补丁】节点集合
594
- * - 子节点搜索命中时,父级路径上节点没命中,则作父级路径节点作为路径修补节点存在,避免命中子节点展示不出来
595
- * - 仅在有搜索条件时成立,补丁节点同时在【failed】节点集合中
774
+ * 旋转角度
775
+ * - 默认0
776
+ * - 通过:transform: rotate(1.06); 实现
596
777
  */
597
- patched: TreeNode<T>[];
598
- };
599
-
600
- /**
601
- * 搜索组件配置选项
602
- */
603
- type SearchOptions = ReadonlyOptions & PlaceholderOptions & {
778
+ rotate?: number;
604
779
  /**
605
- * 启用【自动完成】
606
- * - true 时,只要文本变化了,就触发 search 事件
607
- * - false 时,只有点击【搜索】按钮,才触发 search 事件
780
+ * 图标透明度
781
+ * - 不传入,默认1
608
782
  */
609
- autoComplete?: boolean;
610
- };
611
- /**
612
- * 搜索组件事件
613
- */
614
- type SearchEvents = {
783
+ opacity?: number;
615
784
  /**
616
- * 事件:执行搜索
617
- * @param value 为搜索文本
785
+ * 图标边样式
618
786
  */
619
- search: [value: string];
620
- };
621
-
622
- /**
623
- * 树组件 相关实体
624
- * - 基于 snail.core中的TreeNode做扩展
625
- */
626
-
627
- /**
628
- * 树组件 配置选项
629
- */
630
- type TreeOptions<T> = {
787
+ border?: string;
631
788
  /**
632
- * 树节点 集合
789
+ * 图标圆角样式
633
790
  */
634
- nodes: TreeNodeModel<T>[];
791
+ radius?: string;
635
792
  /**
636
- * 树节点搜索配置
637
- * - 不配置则不启用【搜索】功能
793
+ * 图标背景样式
638
794
  */
639
- search?: SearchOptions;
795
+ background?: string;
640
796
  /**
641
- * 树节点的配置选项
797
+ * 图形伸展
798
+ * - svg.viewBox 属性
799
+ * - 为空则默认“0 0 1024 1024”
642
800
  */
643
- nodeOptions?: TreeNodeRenderOptions;
801
+ viewBox?: string;
644
802
  };
645
803
  /**
646
- * 树组件事件
804
+ * 图标类型
805
+ * - 状态类:
806
+ * - - success 成功图标,对勾
807
+ * - - error 错误
808
+ * - - warn 警告图标
809
+ * - 操作类:
810
+ * - - close 关闭 用作数据删除,弹窗关闭
811
+ * - - trash 垃圾桶图标,常用于【删除】操作
812
+ * - - download 下载
813
+ * - - print 打印
814
+ * - - edit 编辑
815
+ * - - pause 暂停,两道竖线
816
+ * - 指向类:
817
+ * - - arrow 向右箭头
818
+ * - - datepicker 日期选择器
819
+ * - - timepicker 时间选择器
820
+ * - 其他类:
821
+ * - - plus 加号
822
+ * - - subtract 减号
823
+ * - - more 更多,默认垂直三个点
824
+ * - - grip 紧握图标,垂直方向,一般用于拖动句柄
647
825
  */
648
- type TreeEvents<T> = TreeNodeEvents<T> & {
649
- /**
650
- * 搜索完成后
651
- * @param text 搜索文本
652
- */
653
- searched: [text: string];
654
- };
826
+ type IconType = "success" | "error" | "warn" | "close" | "trash" | "download" | "print" | "edit" | "pause" | "arrow" | "datepicker" | "timepicker" | "plus" | "subtract" | "more" | "grip";
827
+
655
828
  /**
656
- * 树节点 组件配置选项
829
+ * Toast配置选项
657
830
  */
658
- type TreeNodeOptions<T> = {
659
- /**
660
- * 要渲染的树节点
661
- */
662
- node: TreeNodeModel<T>;
831
+ type ToastOptions = {
663
832
  /**
664
- * 父节点
833
+ * 提示类型,基于类型展示图标
665
834
  */
666
- parent?: TreeNodeModel<T>;
835
+ type?: IconType;
667
836
  /**
668
- * 树节点所处层级
669
- * - 用于控制缩进
837
+ * 提示消息;支持html格式
670
838
  */
671
- level: number;
839
+ message: string;
672
840
  /**
673
- * 树节点的配置选项
841
+ * 提示显示时间
842
+ * - 单位毫秒,默认1500ms
674
843
  */
675
- options?: TreeNodeRenderOptions;
844
+ duration?: number;
676
845
  /**
677
- * 树组件的上下文对象
846
+ * 关闭按钮是否禁用
678
847
  */
679
- context: ITreeBaseContext<T>;
848
+ closeDisabled?: boolean;
680
849
  };
850
+
681
851
  /**
682
- * 树节点事件
852
+ * 跟随效果 弹窗
683
853
  */
684
- type TreeNodeEvents<T> = {
685
- /**
686
- * 树节点 点击事件
687
- * @param node 点击的树节点
688
- * @param parents node的父节点路径,从【顶级父节点】->【直属父节点】
689
- */
690
- click: [node: TreeNodeModel<T>, parents?: TreeNodeModel<T>[]];
691
- };
854
+
692
855
  /**
693
- * 树节点数据结构
694
- * - 简化外部使用 树节点 时需要频繁写 TreeNode<T, TreeNodeExtend>;
695
- * - 避免和 Vue 组件“tree-node.vue”命名重复
696
- * - 推荐使用时,将此对象做响应式,否则 .hidden 等 更新时,无法实时反应到树上
856
+ * 跟随弹窗 配置选项
857
+ * - 传入的组件,根据配置跟随 target 位置和大小;
858
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
697
859
  */
698
- type TreeNodeModel<T> = TreeNode<T, TreeNodeExtend>;
860
+ type FollowOptions<Props = void, Model = void> = PopupOptions<Props, Model> & FollowPositionOptions;
699
861
  /**
700
- * 树节点 渲染配置选项
862
+ * 跟随位置 配置选项
863
+ * - 基于此计算出最终的跟随效果
701
864
  */
702
- type TreeNodeRenderOptions = {
865
+ type FollowPositionOptions = {
703
866
  /**
704
- * 节点展开层级
705
- * - 不传入则默认展开所有
706
- * - 否则展开传入的层级;从2开始;第一级始终展开;如2则1、2层级展开
707
- * -
867
+ * 启用【宽度】跟随
868
+ * - 为true则和 target 宽度保持一致
869
+ * - false时,宽度由 弹出组件 自己维护
870
+ * - 不管是true、还是false,若宽度超过浏览器最大宽度,会进行强制干预
708
871
  */
709
- expandLevel?: number;
872
+ followWidth?: boolean;
710
873
  /**
711
- * 是否禁用【折叠】子节点操作
712
- * - true 时禁用 折叠操作
874
+ * 启用【高度】跟随
875
+ * - true则和 target 高度保持一致
876
+ * - false时,高度由 弹出组件 自己维护
877
+ * - 不管是true、还是false,若高度超过浏览器最大高度,会进行强制干预
713
878
  */
714
- foldDisabled?: boolean;
879
+ followHeight?: boolean;
715
880
  /**
716
- * 重写树节点
717
- * - true 时,插槽作为完整树节点对象;
718
- * - false 时,插槽仅作为扩展元素,如自定义操作等
881
+ * x轴方向上的跟随策略
882
+ * - 支持传入一个或者多个,依次尝试选举最优位置(全宽度展示,否则取最大宽度位置)
883
+ * - 不传入则按照默认策略;["start","end","after","before","center","ratio"]
884
+ * - 可选策略值如下:
885
+ * - - start : 起点跟随,和 target 起始位置(left)一致
886
+ * - - end : 终点跟随,和 target 结束位置(right)一致
887
+ * - - center : 中心跟随,和 target 中心位置一致
888
+ * - - before : 之前跟随,组件在 target 左侧展示
889
+ * - - after : 之后跟随,组件在 target 右侧展示
890
+ * - - ratio : 比例跟随,按比例(target中心点/窗口宽度)锚定位置,动态计算left值。
719
891
  */
720
- rewrite?: boolean;
721
- };
722
- /**
723
- * 树节点 插槽配置选项
724
- */
725
- type TreeNodeSlotOptions<Node> = {
892
+ followX?: FollowStrategy | FollowStrategy[];
726
893
  /**
727
- * 当前节点
894
+ * y轴方向上的跟随策略
895
+ * - 支持传入一个或者多个,依次尝试选举最优位置(全高度展示,否则取最大高度位置)
896
+ * - 不传入则按照默认策略;["after","before","start","end","center","ratio"]
897
+ * - 可选策略值如下:
898
+ * - - start : 起点跟随,和 target 起始位置(top)一致
899
+ * - - end : 终点跟随,和 target 结束位置(bottom)一致
900
+ * - - center : 中心跟随,和 target 中心位置一致
901
+ * - - before : 之前跟随,组件在 target 顶部展示
902
+ * - - after : 之后跟随,组件在 target 底部展示
903
+ * - - ratio : 比例跟随,按比例(target中心点/窗口高度)锚定位置,动态计算top值。
728
904
  */
729
- node: Node;
905
+ followY?: FollowStrategy | FollowStrategy[];
730
906
  /**
731
- * 父节点
907
+ * x轴方向上 target 之间的留白空间
908
+ * - 默认0; followX 为 center、ratio 时间距失效
909
+ * - 增加间距,提升展示效果
910
+ * -
732
911
  */
733
- parent?: Node;
912
+ spaceX?: number;
734
913
  /**
735
- * 所处层级
914
+ * y轴方向上 target 之间的留白空间
915
+ * - 默认0;followY 为 center、ratio 时间距失效
916
+ * - 增加间距,提升展示效果
736
917
  */
737
- level: number;
918
+ spaceY?: number;
738
919
  /**
739
- * 点击节点
920
+ * 和 浏览器客户 端之间的留白空间
921
+ * - 弹出组件 和浏览器客户端窗口之间的【留白空间】
922
+ * - 仅在 弹出组件 计算出来位置紧贴浏览器窗口时生效
923
+ * - 若强制指定了 start、end,则对应的起始、结束位置不受此值影响
740
924
  */
741
- click(): void;
925
+ spaceClient?: number;
742
926
  /**
743
- * 切换【子节点】折叠窗台
927
+ * 点击【遮罩层】时是否关闭弹窗
928
+ * - 则点击非【跟随组件】区域时是否关闭
744
929
  */
745
- toggle(): void;
746
- };
747
-
748
- /**
749
- * Table配置选项
750
- */
751
- type TableOptions = Pick<ScrollOptions, "scroll" | "barSize"> & {
930
+ closeOnMask?: boolean;
752
931
  /**
753
- * 是否启用表格边框
932
+ * 按下【ESC】健时是否关闭弹窗
754
933
  */
755
- border?: boolean;
934
+ closeOnEscape?: boolean;
756
935
  /**
757
- * 表头样式
758
- * - 约束高度和背景颜色
759
- * - 后期再增加其他的
936
+ * window窗口【resize】时是否关闭弹窗
760
937
  */
761
- headerStyle?: BaseStyle & HeightStyle;
938
+ closeOnResize?: boolean;
762
939
  /**
763
- * 表尾部样式
764
- * - 约束高度和背景颜色
765
- * - 后期再增加其他的
940
+ * target改变时是否关闭弹窗
941
+ * - target尺寸、位置变化
942
+ * - target点击时
766
943
  */
767
- footerStyle?: BaseStyle & HeightStyle;
944
+ closeOnTarget?: boolean;
768
945
  };
769
946
  /**
770
- * Table 行配置选项
947
+ * 跟随策略
948
+ * - 详细值定义,参照 FollowOptions.followX 和 FollowOptions.followY
771
949
  */
772
- type TableRowOptions = HeightStyle & {};
950
+ type FollowStrategy = "start" | "center" | "end" | "before" | "after" | "ratio";
773
951
  /**
774
- * Table 列配置选项
775
- * - border 样式需要配合TableOptions.border使用,否则会导致边框线重叠
952
+ * 跟随弹窗 句柄
953
+ * - 用于在 弹窗组件 内部进行模式判断和关闭跟随弹窗
776
954
  */
777
- type TableColOptions = BaseStyle & FlexBoxStyle & WidthStyle & BorderStyle & PaddingStyle;
778
-
955
+ type FollowHandle<T> = PopupHandle<T> & {};
779
956
  /**
780
- * 排序组件 配置选项
781
- * - 整理部分SortableJs中的配置,不分逻辑不开放
957
+ * 跟随弹窗 扩展配置
782
958
  */
783
- type SortOptions<T> = {
784
- /**
785
- * 变化器
786
- * - 在此元素值发生变化时,重新刷新排序面板
787
- * - 如在增加元素时,改变此值实现 新元素 可拖拽排序
788
- */
789
- changer: T;
790
- /**
791
- * 拖动哪个元素
792
- * - 传入类样式选择器;如 .table-row
793
- */
794
- draggable: string;
795
- /**
796
- * 哪个元素启动拖拽
797
- * - 传入类样式选择器;如 .sort-handle
798
- * - 不传入则默认 draggable
799
- * - 若自定义,则传入 draggable 下的dom元素作为启动拖拽的句柄
800
- */
801
- handle?: string;
802
- /**
803
- * 拖动的元素上增加的类样式
804
- * - 执行拖拽时随着鼠标移动元素,脱离文档流了
805
- * - 可自定义一些样式实现拖动元素的高度、宽度自定义等
806
- * - 默认:snail-sort-drag
807
- */
808
- dragClass?: string;
959
+ type FollowExtend = PopupStatusOptions & {
809
960
  /**
810
- * 幽灵元素类样式名称
811
- * - 拖动时在面板上占位的元素
812
- * - 默认:snail-sort-ghost
961
+ * 跟随的目标元素
813
962
  */
814
- ghostClass?: string;
963
+ target: Element;
815
964
  /**
816
- * 过滤器,不需要进行拖动的元素
817
- * - 传入类样式选择器;如 .sort-handle
818
- * - 实现特定子元素不触发拖动排序功能
965
+ * x轴方向的跟随策略:响应式
966
+ * - 基于外部传入的跟随策略,计算选举出来的最优策略值
819
967
  */
820
- filter?: string;
968
+ followX: ShallowRef<FollowStrategy>;
821
969
  /**
822
- * 排序组
823
- * - 组相同时,可跨组拖拽排序
824
- * - 不传入,则内部生成guid
825
- * - 为
970
+ * y轴方向的跟随策略:响应式
971
+ * - 基于外部传入的跟随策略,计算选举出来的最优策略值
826
972
  */
827
- group?: string | SortGroupOptions;
973
+ followY: ShallowRef<FollowStrategy>;
828
974
  /**
829
- * 动画时间
830
- * - 单位ms;默认150ms
975
+ * Follow弹窗是否【钉住】了
976
+ * - 为true时,closeOnMask、closeOnEscape失效
977
+ * - 满足 子弹窗 点击等操作时,不自动销毁父级弹窗
831
978
  */
832
- animation?: number;
979
+ pinned: ShallowRef<boolean>;
980
+ };
981
+ /**
982
+ * 跟随策略 配置选项
983
+ */
984
+ type FollowStrategyOptions = {
833
985
  /**
834
- * 禁用排序效果
835
- * - 为true时,此容器内元素不能拖动,此不构建sortable实例
986
+ * x轴的跟随策略
836
987
  */
837
- disabled?: boolean;
988
+ followX?: FollowStrategy;
838
989
  /**
839
- * 在当前容器内是否禁用拖拽排序
840
- * - 为true时,此容器内部不能拖拽,但可拖动到其他同名group内
841
- * - 初期想用sort,但作Vue组件属性时,bool类型不传值会自动默认false,和初衷不符
990
+ * x轴的跟随策略
842
991
  */
843
- sortDisabled?: boolean;
992
+ followY?: FollowStrategy;
844
993
  };
845
994
  /**
846
- * 排序组件的Group属性配置选项
995
+ * 跟随选举结果
847
996
  */
848
- type SortGroupOptions = {
997
+ type FollowElectResult = {
849
998
  /**
850
- * 排序组名称;
851
- * - 不传入时自动生成
999
+ * 跟随策略
852
1000
  */
853
- name: string;
1001
+ strategy: FollowStrategy;
854
1002
  /**
855
- * 定义从这个列表容器移动出去的设置
856
- * - true:列表容器内的列表单元可以被移出;
857
- * - false:列表容器内的列表单元不可以被移出;
858
- * - "clone":列表单元移出,移动的为该元素的副本;
859
- * - function:用来进行pull的函数判断,可以进行复杂逻辑,在函数中return false/true来判断是否移出;
1003
+ * 开始位置:x/top
860
1004
  */
861
- pull: true | false | "clone" | SortGroupHook;
1005
+ start: number;
862
1006
  /**
863
- * 用来定义往这个列表容器放置列表单元的的设置
864
- * - true:列表容器可以从其他列表容器内放入列表单元;
865
- * - false:与true相反;
866
- * - string|string[]:代表的是group配置项里定义的name值。如['foo','bar']
867
- * - function:用来进行put的函数判断,可以进行复杂逻辑,在函数中return false/true来判断是否放入;
1007
+ * 调整后的尺寸(width/height)
1008
+ * - 为undefined表示无需调整尺寸
868
1009
  */
869
- put: true | false | string | string[] | SortGroupHook;
1010
+ size?: number;
870
1011
  };
1012
+
871
1013
  /**
872
- * 排序组件的Group属性钩子
873
- * - 用于pull和put中使用,返回false时不执行pull、put操作
874
- * - @param item 移动的元素
875
- * - @param to 目标容器dom元素
876
- * - @param from 来源容器dom元素
877
- */
878
- type SortGroupHook = (item: HTMLElement, to: HTMLElement, from: HTMLElement) => void;
879
- /**
880
- * 排序组件 事件
1014
+ * 弹窗管理器
881
1015
  */
882
- type SortEvents = {
883
- /**
884
- * 开始拖拽
885
- */
886
- start: [evt: SortEvent];
1016
+ interface IPopupManager {
887
1017
  /**
888
- * 移动中
1018
+ * 弹出
1019
+ * - 弹窗位置位置、大小、动画效果等由组件自己完成
1020
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
1021
+ * @param options 弹窗配置选项
1022
+ * @returns 弹窗打开结果,外部可手动关闭弹窗
889
1023
  */
890
- move: [evt: SortEvent, originalEvent: SortEvent];
1024
+ popup<T, Props = void, Model = void>(options: PopupOptions<Props, Model>): IAsyncScope<T>;
891
1025
  /**
892
- * 移动到新容器时
1026
+ * 对话框
1027
+ * - 支持指定模态和非模态对话框
1028
+ * - 默认垂直水平居中展示
1029
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
1030
+ * @param options 弹窗配置选项
1031
+ * @returns 弹窗打开结果,外部可手动关闭弹窗
893
1032
  */
894
- add: [evt: SortEvent];
1033
+ dialog<T, Props = void, Model = void>(options: DialogOptions<Props, Model>): IAsyncScope<T>;
895
1034
  /**
896
- * 从当前容器移除时
1035
+ * 跟随弹窗
1036
+ * - 跟随指定的target对象,可跟随位置、大小
1037
+ * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
1038
+ * @param target 跟随的目标元素
1039
+ * @param options 跟随配置选项
1040
+ * @returns 弹窗异步作用域,外部可手动关闭弹窗
897
1041
  */
898
- remove: [evt: SortEvent];
1042
+ follow<T, Props = void, Model = void>(target: HTMLElement, options: FollowOptions<Props, Model>): IAsyncScope<T>;
899
1043
  /**
900
- * 结束拖拽
1044
+ * 打开【确认】弹窗
1045
+ * @param title 弹窗标题
1046
+ * @param message 确认提示信息,支持html片段
1047
+ * @param options 确认弹窗其他配置信息
1048
+ * @returns 弹窗打开结果,外部可手动关闭弹窗
901
1049
  */
902
- end: [evt: SortEvent];
1050
+ confirm(title: string, message: string, options?: Omit<ConfirmOptions, "title" | "message">): IAsyncScope<boolean>;
903
1051
  /**
904
- * 元素排序顺序变化
905
- * @param oldIndex 旧位置索引值
906
- * @param newIndex 新顺序索引值
1052
+ * Toast 提示框
1053
+ * @param type 提示类型:成功、失败、、、
1054
+ * @param message 提示消息
1055
+ * @param options 提示框配置选项
1056
+ * @returns 弹窗打开结果,外部可手动关闭弹窗
907
1057
  */
908
- update: [oldIndex: number, newIndex: number];
909
- };
1058
+ toast(type: IconType, message: string, options?: Omit<ToastOptions, "type" | "message">): IScope;
1059
+ }
1060
+
910
1061
  /**
911
- * 排序事件对象
1062
+ * 使用【弹窗管理器】
1063
+ * @returns 全新的【弹窗管理器】实例+作用域对象
912
1064
  */
913
- type SortEvent = {
1065
+ declare function usePopup(): IPopupManager & IScope;
1066
+
1067
+ /**
1068
+ * 选择器 相关数据实体
1069
+ */
1070
+
1071
+ /**
1072
+ * 接口:选择器管理器
1073
+ */
1074
+ interface IPickerManager {
914
1075
  /**
915
- * 目标容器
1076
+ * 显示【日期】选择器
1077
+ * @param target 哪个元素触发,基于此元素计算位置
1078
+ * @param options 日期选择器配置选项
1079
+ * @param popupOptions 弹窗配置选项;内部根据情况选择属性使用
1080
+ * @returns 异步任务,可销毁日期选择器;可接收日期选择器的选择值
1081
+ */
1082
+ showDate(target: HTMLElement, options?: DatePickerOptions, popupOptions?: PickerPopupOptions): IAsyncScope<string>;
1083
+ /**
1084
+ * 显示【时间】选择控件
1085
+ * @param target 哪个元素触发,基于此元素计算位置
1086
+ * @param options 时间选择控件配置选项
1087
+ * @param popupOptions 弹窗配置选项;内部根据情况选择属性使用
1088
+ * @returns 异步任务,可销毁时间选择控件;可接收时间选择控件的选择值
916
1089
  */
917
- to: HTMLElement;
1090
+ showTime(target: HTMLElement, options?: TimePickerOptions, popupOptions?: PickerPopupOptions): IAsyncScope<string>;
1091
+ }
1092
+ /**
1093
+ * 选择器弹窗配置选项
1094
+ * - 放开一些属性,方便用户做一些自定义
1095
+ */
1096
+ type PickerPopupOptions = {
918
1097
  /**
919
- * 来源容器
1098
+ * 弹窗模式
1099
+ * - follow 【默认值】跟随弹窗,跟随制定的target
1100
+ * - dialog 模态弹窗
920
1101
  */
921
- from: HTMLElement;
1102
+ mode?: "dialog" | "follow";
922
1103
  /**
923
- * 被移动的元素
924
- * - 在`group.pull`配置为 clone 时,此值为原始元素,复制元素放到原来位置了
1104
+ * 跟随效果
1105
+ * - mode `follow` 生效
925
1106
  */
926
- item: HTMLElement;
1107
+ follow?: FollowPositionOptions;
927
1108
  /**
928
- * 副本的元素
929
- * - 在`group.pull`配置为 clone
1109
+ * 弹窗配置
1110
+ * - mode `dialog` 生效
930
1111
  */
931
- clone: HTMLElement;
1112
+ dialog?: Pick<DialogOptions, "closeOnEscape" | "closeOnMask" | "rootClass">;
1113
+ } /** & FollowPositionOptions */;
1114
+ /**
1115
+ * 选择器扩展
1116
+ */
1117
+ type PickerExtend = {
932
1118
  /**
933
- * 容器中的原序号
1119
+ * 弹窗管理器
1120
+ * - 方便下级再弹窗,公用一个管理器,方便生命周期管理
934
1121
  */
935
- oldIndex: number | undefined;
1122
+ popup: IPopupManager;
936
1123
  /**
937
- * 容器中的新序号
1124
+ * 选择器对象,方便内部在弹出选择
1125
+ * - 如日期选择器中,在选择时间
938
1126
  */
939
- newIndex: number | undefined;
1127
+ picker: IPickerManager;
940
1128
  };
941
1129
 
942
1130
  /**
943
- * 组件配置选项
1131
+ * 树形 数据相关的基础实体结构
1132
+ * 1、封装一些基础实体;如树形节点数据结构
1133
+ * 2、配合树形组件使用;如select的多级筛选,树组件等
1134
+ * 3、封装树的基础共性操作,如显隐判断、搜索查询等
944
1135
  */
945
- type ComponentOptions = {
1136
+ /**
1137
+ * 树节点
1138
+ * - 仅提供树节点基础属性;可以基于 Extend 为 TreeNode 扩展节点属性
1139
+ */
1140
+ type TreeNode<T, Extend extends Record<string, any> | void = void> = {
946
1141
  /**
947
- * 组件名称;
948
- * - 确保组件已注册,否则会加载不出来
1142
+ * 展示文本
949
1143
  */
950
- name?: string;
1144
+ text: string;
951
1145
  /**
952
- * Vue组件对象
953
- * - name未传入时生效
954
- * - 推荐外部使用 shallowRef 包裹对象,避免响应式的性能问题
1146
+ * 附带数据
955
1147
  */
956
- component?: Component;
1148
+ data?: T;
957
1149
  /**
958
- * 组件js文件url地址
959
- * - 支持#号锚点钻取
960
- * - name、component未传入时生效
1150
+ * 子选择项 数据源
961
1151
  */
962
- url?: string;
963
- };
964
- /**
965
- * 提取组件的props类型
966
- * - 有效的 Props 类型:extends Record<string, any>
967
- * - 有效类型则返回 Props 自身;否则无效,为undefined
968
- */
969
- type PropsType<Props> = Props extends Record<string, any> ? Props : undefined;
970
- /**
971
- * 事件发射器类型
972
- * - 将【组件中组件】转换为vue的 defineEmits 类型
973
- * - 用于将组件的事件发射器包裹传递到其他组件、class中使用
974
- */
975
- type EmitterType<Events extends Record<string, any[]>> = {
976
- <K extends keyof Events>(event: K, ...payload: Events[K]): any;
977
- };
978
- /**
979
- * 提取【组件插槽】类型
980
- */
981
- type SlotsType<Slots extends Record<string, any>> = {
982
- [key in keyof Slots]: (props: Slots[key]) => any;
983
- };
984
- /**
985
- * 提取【组件事件】类型
986
- * - 将【组件事件】中的key首字母小写,追加上on前缀;key对应的value为监听函数参数
987
- * - T的类型约束:Record<string, unknown[]>
988
- */
989
- type EventsType<Events> = Events extends Record<string, unknown[]> ? ({
990
- [key in keyof Events as `on${Capitalize<string & key>}`]?: (...args: Events[key]) => void;
991
- }) : never;
1152
+ children?: TreeNode<T, Extend>[];
1153
+ } & (Extend extends void ? {} : Extend);
992
1154
  /**
993
- * 组件绑定 配置选项
994
- * - Props、Events、Model 为可选泛型,分别约束 props、events、model 属性
995
- * - 若泛型类型无效,则对应属性类型强制为undefined;详细参照对应属性说明
1155
+ * 树节点 扩展
1156
+ * - 配合 树上下文 使用
996
1157
  */
997
- type ComponentBindOptions<Props = void, Model = void> = {
1158
+ type TreeNodeExtend = {
998
1159
  /**
999
- * 传递给组件的属性值,执行 v-bind 绑定
1000
- * - key为属性名称,遵循vue解析规则;若绑定事件,则key为 on事件名称 ,事件名称首字母大写
1001
- * - 通过泛型类型 Props 约束,有效类型:Props extends Record<string, any>
1002
- * @see EventsType<Events> 获取组件事件类型
1160
+ * 节点Id,确保唯一
1161
+ * - 不传入则内部自动 newId()
1003
1162
  */
1004
- props?: PropsType<Props>;
1163
+ readonly id?: string;
1005
1164
  /**
1006
- * 传递给组件的双向绑定数据,执行 v-model 绑定
1007
- * - 使用 ShallowRef/Ref 包裹;推荐 ShallowRef,仅和组件进行.value值交互,避免深层双向影响性能
1008
- * - 通过泛型类型 Model 约束,有效类型: 非void、never、null、undefined等无效类型
1165
+ * 是否可点击
1166
+ * - true 此节点可点击,点击时触发 click 事件
1167
+ * - false 此节点不可点击
1009
1168
  */
1010
- model?: Model extends (void | never | null | undefined) ? undefined : (ShallowRef<Model> | Ref<Model>);
1169
+ clickable?: boolean;
1170
+ /**
1171
+ * 是否可搜索
1172
+ * - 为true时,此节点可搜索
1173
+ */
1174
+ searchable?: boolean;
1175
+ /**
1176
+ * 是否隐藏
1177
+ * - true 隐藏 节点 和 子节点
1178
+ * - 隐藏组件,不参与点击、搜索等
1179
+ */
1180
+ hidden?: boolean;
1181
+ /**
1182
+ * 是否固定
1183
+ * - true 固定 节点;则节点不参与 搜索、移动等动态操作
1184
+ */
1185
+ fixed?: boolean;
1011
1186
  };
1012
-
1013
- /**
1014
- * 布局组件 数据结构
1015
- */
1016
-
1017
1187
  /**
1018
- * 布局组件 配置选项
1188
+ * 树的基础上下文对象
1019
1189
  */
1020
- type LayoutOptions = {
1190
+ interface ITreeBaseContext<T> {
1021
1191
  /**
1022
- * 布局方向
1023
- * - horizontal 水平布局:左中右
1024
- * - vertical 垂直布局:上中下
1025
- * - 默认为 `horizontal`
1192
+ * 执行搜索
1193
+ * @param text 搜索文本
1026
1194
  */
1027
- direction?: "horizontal" | "vertical";
1195
+ doSearch(text: string): void;
1028
1196
  /**
1029
- * 主内容区域配置
1030
- * - 对应插槽名:main;主要内容显示区域,处于布局中的【中】区域
1031
- * - 配置主内容区域的滚动条配置
1197
+ * 是否是【已激活】节点
1198
+ * @param node 要判断的节点
1199
+ * @returns true 是已激活节点,false 否
1032
1200
  */
1033
- main?: Pick<LayoutAraeOptions<void>, "scroll" | "class">;
1201
+ isActived(node: TreeNode<T>): boolean;
1034
1202
  /**
1035
- * 【左侧】区域配置
1036
- * - 对应插槽名`left` ;`mode` 为 `horizontal` 时生效
1037
- * - 配置滚动条和宽度;宽度不配置时,默认 `fit-content`
1038
- * -
1203
+ * 是否是【补丁】节点
1204
+ * - 子节点搜索命中时,父级路径上节点没命中,则作父级路径节点作为路径修补节点存在,避免命中子节点展示不出来
1205
+ * @param node 要判断的节点
1206
+ * @returns true 是补丁节点,false 不是补丁节点
1039
1207
  */
1040
- left?: LayoutAraeOptions<WidthStyle>;
1208
+ isPatched(node: TreeNode<T>): boolean;
1041
1209
  /**
1042
- * 【右测】区域配置
1043
- * - 对应插槽名`right` ;`mode` 为 `horizontal` 时生效
1044
- * - 配置滚动条和宽度;宽度不配置时,默认 `fit-content`
1210
+ * 是否显示【树节点】
1211
+ * @param node 要判断的节点
1212
+ * @param needPatched 是否需要【补丁】节点。true时(补丁节点始终显示);false时(根据hidden和搜索结果判断)
1213
+ * @returns 能显示返回true;否则返回false
1045
1214
  */
1046
- right?: LayoutAraeOptions<WidthStyle>;
1215
+ isShow(node: TreeNode<T, TreeNodeExtend>, needPatched: boolean): boolean;
1047
1216
  /**
1048
- * 【顶部】区域配置
1049
- * - 对应插槽名`top`;`mode` 为 `vertical` 时生效
1050
- * - 配置滚动条和高度;高度不配置时,默认 `fit-content`
1051
- * -
1217
+ * 是否显示指定【树节点】的子节点
1218
+ * - 不会判断node节点自身是否可显示
1219
+ * @param node 要判断的节点
1220
+ * @param needPatched 是否需要【补丁】节点。true时(补丁节点始终显示);false时(根据hidden和搜索结果判断)
1221
+ * @returns 能显示返回true;否则返回false
1052
1222
  */
1053
- top?: LayoutAraeOptions<HeightStyle>;
1223
+ isShowChildren(node: TreeNode<T, TreeNodeExtend>, needPatched: boolean): boolean;
1054
1224
  /**
1055
- * 【底部】区域配置
1056
- * - 对应插槽名`bottom`;`mode` 为 `vertical` 时生效
1057
- * - 配置滚动条和高度;高度不配置时,默认 `fit-content`
1225
+ * 获取指定【树节点】的路径
1226
+ * @param node 树节点
1227
+ * @returns 从【顶级节点】->【指定节点】的全路径数据
1058
1228
  */
1059
- bottom?: LayoutAraeOptions<HeightStyle>;
1060
- };
1061
- /**
1062
- * 布局组件子区域 配置选项
1063
- */
1064
- type LayoutAraeOptions<Style extends WidthStyle | HeightStyle | void> = Style & CSSClassOptions & {
1229
+ getPath(node: TreeNode<T, TreeNodeExtend>): TreeNode<T, TreeNodeExtend>[];
1065
1230
  /**
1066
- * 滚动视图配置
1067
- * - 视图属性:滚动条大小、显示时机
1068
- * - 滚动事件:滚动条显隐、滚动到顶部、底部、、、
1069
- * - 不传入则当前区域`overflow:hidden`溢出隐藏
1231
+ * 获取指定【树节点】的唯一Key值
1232
+ * - 相同节点确保唯一,且不变;用于唯一标记此节点
1233
+ * @param node
1234
+ * @returns 返回节点唯一Key值
1070
1235
  */
1071
- scroll?: ScrollOptions & EventsType<ScrollEvents>;
1072
- };
1236
+ getKey(node: TreeNode<T>): string;
1237
+ }
1073
1238
  /**
1074
- * 布局组件的子区域项目 描述
1239
+ * 树搜索结果
1075
1240
  */
1076
- type LayoutAreaItem = {
1241
+ type TreeSearchResult<T> = {
1077
1242
  /**
1078
- * 是否可滚动
1243
+ * 匹配上的节点集合
1079
1244
  */
1080
- scrollable: boolean;
1245
+ matched: TreeNode<T>[];
1081
1246
  /**
1082
- * 内容区域元素的类样式名
1247
+ * 未匹配上的节点集合
1083
1248
  */
1084
- class: string[];
1249
+ failed: TreeNode<T>[];
1085
1250
  /**
1086
- * css样式
1251
+ * 搜索时的【补丁】节点集合
1252
+ * - 子节点搜索命中时,父级路径上节点没命中,则作父级路径节点作为路径修补节点存在,避免命中子节点展示不出来
1253
+ * - 仅在有搜索条件时成立,补丁节点同时在【failed】节点集合中
1087
1254
  */
1088
- style: Record<string, string>;
1255
+ patched: TreeNode<T>[];
1089
1256
  };
1090
1257
 
1091
1258
  /**
1092
- * 动画组件配置选项
1093
- * - 实现组件入/退场的动画效果
1259
+ * 搜索组件配置选项
1094
1260
  */
1095
- type MotionOptions = {
1261
+ type SearchOptions = ReadonlyOptions & PlaceholderOptions & {
1096
1262
  /**
1097
- * 是否是多元素模式
1098
- * - true时,则使用 TransitionGroup 组件实现多元素间动画控制
1099
- * - false时,则使用 Transition 组件实现单元素动画控制
1100
- */
1101
- multiple?: boolean;
1102
- /**
1103
- * 动画效果
1104
- * - 为Object时,显式指定 `enter`和`leave`样式,此时应使用`animation`实现动画样式
1105
- * - - 可访问`MOTION`使用内置动画效果
1106
- * - 为string时,为动画的根样式,实现动画效果时:
1107
- * - - 入场动画:`${effect}.enter-active` `${effect}.enter-from` `${effect}.enter-to`
1108
- * - - 退场动画:`${effect}.leave-active` `${effect}.leave-from` `${effect}.leave-to`
1109
- * - 为空时,使用`MOTION.fade`值;
1110
- */
1111
- effect?: MotionEffectOptions | string;
1112
- /**
1113
- * 动画持续时间,单位ms,默认200ms
1114
- * - `>0`时生效,否则禁用动画
1115
- */
1116
- duration?: number;
1117
- /**
1118
- * 动画模式
1119
- * - default(默认) 入场和退场动画同时执行
1120
- * - in-out 入场动画先执行,退场动画后执行
1121
- * - out-in 退场动画先执行,入场动画后执行
1122
- * - 在多个元素之间切换时生效,一个元素的显隐切换无效果
1263
+ * 启用【自动完成】
1264
+ * - true 时,只要文本变化了,就触发 search 事件
1265
+ * - false 时,只有点击【搜索】按钮,才触发 search 事件
1123
1266
  */
1124
- mode?: "in-out" | "out-in" | "default";
1267
+ autoComplete?: boolean;
1125
1268
  };
1126
1269
  /**
1127
- * 动画效果配置选项
1270
+ * 搜索组件事件
1128
1271
  */
1129
- type MotionEffectOptions = {
1130
- /**
1131
- * 入场进入时的动画效果
1132
- * - 用于初始化入场动画;最终映射成 Transition 组件的 `enter-active-class` 属性
1133
- */
1134
- enter?: string;
1272
+ type SearchEvents = {
1135
1273
  /**
1136
- * 退场离开时的动画效果
1137
- * - 用于初始化退场动画;最终映射成 Transition 组件的 `leave-active-class` 属性
1274
+ * 事件:执行搜索
1275
+ * @param value 为搜索文本
1138
1276
  */
1139
- leave?: string;
1277
+ search: [value: string];
1140
1278
  };
1141
1279
 
1142
1280
  /**
1143
- * 折叠面板配置选项
1144
- * - title 折叠面板标题
1145
- * - disabled 禁用折叠效果,始终展开
1281
+ * 树组件 相关实体
1282
+ * - 基于 snail.core中的TreeNode做扩展
1146
1283
  */
1147
- type FoldOptions = DisabledOptions & TitleOptions & {
1284
+
1285
+ /**
1286
+ * 树组件 配置选项
1287
+ */
1288
+ type TreeOptions<T> = {
1148
1289
  /**
1149
- * 副标题
1150
- * - 跟随在title后
1290
+ * 树节点 集合
1151
1291
  */
1152
- subtitle?: string;
1292
+ nodes: TreeNodeModel<T>[];
1153
1293
  /**
1154
- * 面板头部区域配置
1155
- * - 如指定特定的css式
1294
+ * 树节点搜索配置
1295
+ * - 不配置则不启用【搜索】功能
1156
1296
  */
1157
- header?: CSSClassOptions;
1297
+ search?: SearchOptions;
1158
1298
  /**
1159
- * 面板内容区域配置
1160
- * - 如指定特定的css样式
1299
+ * 树节点的配置选项
1161
1300
  */
1162
- body?: CSSClassOptions;
1301
+ nodeOptions?: TreeNodeRenderOptions;
1163
1302
  };
1164
1303
  /**
1165
- * 折叠状态
1166
- * - expand : 展开状态
1167
- * - fold : 折叠状态
1304
+ * 树组件事件
1168
1305
  */
1169
- type FoldStatus = "expand" | "fold";
1306
+ type TreeEvents<T> = TreeNodeEvents<T> & {
1307
+ /**
1308
+ * 搜索完成后
1309
+ * @param text 搜索文本
1310
+ */
1311
+ searched: [text: string];
1312
+ };
1170
1313
  /**
1171
- * 折叠面板组件插槽句柄
1172
- * - 将折叠面板状态和操作共享给插槽中自定义组件使用
1314
+ * 树节点 组件配置选项
1173
1315
  */
1174
- type FoldSlotHandle = {
1316
+ type TreeNodeOptions<T> = {
1175
1317
  /**
1176
- * 获取折叠面板状态
1177
- * @returns
1318
+ * 要渲染的树节点
1178
1319
  */
1179
- getStatus(): FoldStatus;
1320
+ node: TreeNodeModel<T>;
1180
1321
  /**
1181
- * 设置折叠面板状态
1182
- * @param status 新的状态
1322
+ * 父节点
1183
1323
  */
1184
- setStatus(status: FoldStatus): void;
1324
+ parent?: TreeNodeModel<T>;
1185
1325
  /**
1186
- * 切换面板状态
1187
- * @returns 新的状态
1326
+ * 树节点所处层级
1327
+ * - 用于控制缩进
1188
1328
  */
1189
- toggle(): FoldStatus;
1329
+ level: number;
1330
+ /**
1331
+ * 树节点的配置选项
1332
+ */
1333
+ options?: TreeNodeRenderOptions;
1334
+ /**
1335
+ * 树组件的上下文对象
1336
+ */
1337
+ context: ITreeBaseContext<T>;
1190
1338
  };
1191
1339
  /**
1192
- * 折叠面板事件
1340
+ * 树节点事件
1193
1341
  */
1194
- type FoldEvents = {
1342
+ type TreeNodeEvents<T> = {
1195
1343
  /**
1196
- * 折叠状态发生改变时
1197
- * @param status 折叠状态
1344
+ * 树节点 点击事件
1345
+ * @param node 点击的树节点
1346
+ * @param parents node的父节点路径,从【顶级父节点】->【直属父节点】
1198
1347
  */
1199
- change: [status: FoldStatus];
1348
+ click: [node: TreeNodeModel<T>, parents?: TreeNodeModel<T>[]];
1200
1349
  };
1201
-
1202
1350
  /**
1203
- * 弹性布局组件配置选项
1351
+ * 树节点数据结构
1352
+ * - 简化外部使用 树节点 时需要频繁写 TreeNode<T, TreeNodeExtend>;
1353
+ * - 避免和 Vue 组件“tree-node.vue”命名重复
1354
+ * - 推荐使用时,将此对象做响应式,否则 .hidden 等 更新时,无法实时反应到树上
1204
1355
  */
1205
- type FlexOptions = {
1206
- /**
1207
- * 主轴方向
1208
- * - css属性:flex-direction
1209
- * - 取值范围:
1210
- * - - row(默认值) 水平主轴,起点在左端
1211
- * - - row-reverse 水平主轴,起点在右端
1212
- * - - column 垂直主轴,起点在上沿
1213
- * - - column-reverse 垂直主轴,起点在下沿
1214
- */
1215
- direction?: "row" | "column" | "row-reverse" | "column-reverse";
1216
- /**
1217
- * 是否换行
1218
- * - css属性:flex-wrap
1219
- * - 取值范围:
1220
- * - - nowrap(默认值) 不换行,所有 flex 项都排在一行
1221
- * - - wrap 换行,第一行在上方
1222
- * - - wrap-reverse 换行,第一行在下方
1223
- */
1224
- wrap?: "nowrap" | "wrap" | "wrap-reverse";
1356
+ type TreeNodeModel<T> = TreeNode<T, TreeNodeExtend>;
1357
+ /**
1358
+ * 树节点 渲染配置选项
1359
+ */
1360
+ type TreeNodeRenderOptions = {
1225
1361
  /**
1226
- * 行与列之间的间隙(网格间距)
1227
- * - css属性:gap
1228
- * - row-gapcolumn-gap的缩写
1229
- * - 举例:gap: "10px 20px" 表示行间距为10px,列间距为20px;gap: "10px" 表示行间距和列间距都为10px
1362
+ * 节点展开层级
1363
+ * - 不传入则默认展开所有
1364
+ * - 否则展开传入的层级;从2开始;第一级始终展开;如2则12层级展开
1365
+ * -
1230
1366
  */
1231
- gap?: string;
1367
+ expandLevel?: number;
1232
1368
  /**
1233
- * 主轴对齐方式
1234
- * - css属性:justify-content
1235
- * - 取值范围:
1236
- * - - start(默认值) 主轴起点对齐
1237
- * - - end 主轴终点对齐
1238
- * - - center 主轴居中对齐
1239
- * - - between 主轴两端对齐,项目之间间隔平均分布
1240
- * - - around 主轴每个项目两侧间隔平均分布
1241
- * - - evenly 主轴每个项目之间间隔平均分布
1369
+ * 是否禁用【折叠】子节点操作
1370
+ * - true 时禁用 折叠操作
1242
1371
  */
1243
- main?: "start" | "end" | "center" | "between" | "around" | "evenly";
1372
+ foldDisabled?: boolean;
1244
1373
  /**
1245
- * 交叉轴对齐方式
1246
- * - css属性:align-items
1247
- * - 取值范围:
1248
- * - - stretch(默认值) 交叉轴拉伸对齐(如果项目未设置高度或设为 auto,将占满整个交叉轴)
1249
- * - - start 交叉轴起点对齐
1250
- * - - end 交叉轴终点对齐
1251
- * - - center 交叉轴居中对齐
1252
- * - - baseline 交叉轴第一行文字基线对齐
1374
+ * 重写树节点
1375
+ * - true 时,插槽作为完整树节点对象;
1376
+ * - false 时,插槽仅作为扩展元素,如自定义操作等
1253
1377
  */
1254
- cross?: "start" | "end" | "center" | "stretch" | "baseline";
1378
+ rewrite?: boolean;
1379
+ };
1380
+ /**
1381
+ * 树节点 插槽配置选项
1382
+ */
1383
+ type TreeNodeSlotOptions<Node> = {
1255
1384
  /**
1256
- * 多行时的交叉轴对齐方式
1257
- * - css属性:align-content
1258
- * - 取值范围:
1259
- * - - stretch(默认值) 交叉轴拉伸对齐(如果项目未设置高度或设为 auto,将占满整个交叉轴)
1260
- * - - start 交叉轴起点对齐
1261
- * - - end 交叉轴终点对齐
1262
- * - - center 交叉轴居中对齐
1263
- * - - between 交叉轴两端对齐,行之间间隔平均分布
1264
- * - - around 交叉轴每行两侧间隔平均分布
1265
- * - - evenly 交叉轴每行之间间隔平均分布
1385
+ * 当前节点
1266
1386
  */
1267
- content?: "start" | "end" | "center" | "stretch" | "between" | "around" | "evenly";
1387
+ node: Node;
1268
1388
  /**
1269
- * 启用子项修复
1270
- * - 在`justify-content`启用`space-`相关属性时,子项之间会有间隔,当子项数量较少时,可能出现空间过大的问题,特别时多行的最后一样时
1271
- * - 启动后,会基于子项数量补全最后一行缺失的子项数量,来修复空间过大的问题
1272
- * - 推荐仅在所有子项主轴方向尺寸一样时,否则修复可能不准确
1389
+ * 父节点
1273
1390
  */
1274
- repairItem?: boolean;
1391
+ parent?: Node;
1275
1392
  /**
1276
- * flex容器的子项数量
1277
- * - 配合 `repairSpace` 构建修复空间的子项数量
1278
- * - 当 `repairSpace` 启用时,自动监听子项数量变化来动态调整修复空间的子项数量;不启用时忽略
1393
+ * 所处层级
1279
1394
  */
1280
- itemCount?: number;
1395
+ level: number;
1281
1396
  /**
1282
- * flex容器的子项标签名
1283
- * - 配合 `repairSpace` 构建修复空间的子项元素标签名
1284
- * - 默认值为`div`,即子项元素为`<div>`标签
1285
- * - 可配置为其他标签名,如`span`,则子项元素为`<span>`标签
1397
+ * 点击节点
1286
1398
  */
1287
- itemTag?: string;
1399
+ click(): void;
1288
1400
  /**
1289
- * flex容器的子项类样式名
1290
- * - 配合 `repairSpace` 构建修复空间的子项元素类样式名
1291
- * - 推荐设置为一个固定值的类样式名,如`flex-item`,来方便用户通过该类样式名来设置子项元素的样式
1292
- * - 构建的子项,会自动追加一个 "repair-item”的类样式名,来方便用户通过该类样式名来设置修复空间子项元素的样式
1401
+ * 切换【子节点】折叠窗台
1293
1402
  */
1294
- itemClass?: string;
1403
+ toggle(): void;
1295
1404
  };
1296
1405
 
1297
1406
  /**
1298
- * 弹性容器组件 配置选项
1407
+ * Table配置选项
1299
1408
  */
1300
- type ElasticOptions = ScrollOptions & {
1409
+ type TableOptions = Pick<ScrollOptions, "scroll" | "barSize"> & {
1301
1410
  /**
1302
- * 滚动条弹簧效果
1303
- * - x 仅在x轴方向上启用弹簧效果
1304
- * - y 仅在y轴方向上启用弹簧效果
1305
- * - both :同时启用x轴和y轴的弹簧效果
1411
+ * 是否启用表格边框
1306
1412
  */
1307
- spring?: "x" | "y" | "both";
1413
+ border?: boolean;
1308
1414
  /**
1309
- * 是否启用【下拉刷新】功能
1310
- * - `spring` 为 `y/both`时生效
1311
- * - 满足下拉刷新条件后,触发`refresh`事件,处理完成后调用resolve函数,通知完成刷新数据操作
1415
+ * 表头样式
1416
+ * - 约束高度和背景颜色
1417
+ * - 后期再增加其他的
1312
1418
  */
1313
- downRefresh?: boolean;
1419
+ headerStyle?: BaseStyle & HeightStyle;
1314
1420
  /**
1315
- * 是否启用【上拉加载】功能
1316
- * - `spring` 为 `y/both`时生效
1317
- * - 满足上拉加载条件后,触发`more`事件,处理完成后调用resolve函数,通知完成加载数据操作
1421
+ * 表尾部样式
1422
+ * - 约束高度和背景颜色
1423
+ * - 后期再增加其他的
1318
1424
  */
1319
- upMore?: boolean;
1425
+ footerStyle?: BaseStyle & HeightStyle;
1320
1426
  };
1321
1427
  /**
1322
- * 弹性容器组件 事件监听
1428
+ * Table 行配置选项
1323
1429
  */
1324
- type ElasticEvents = ScrollEvents & {
1325
- /**
1326
- * 刷新数据
1327
- * - 配合 `downRefresh`实现下拉刷新功能
1328
- * @param resolve 处理完成后调用resolve函数,通知完成刷新数据操作
1329
- */
1330
- refresh: [resolve: () => void];
1331
- /**
1332
- * 加载更多
1333
- * - 配合 `upMore`实现上拉加载功能
1334
- * @param resolve 处理完成后调用resolve函数,通知完成加载数据操作
1335
- */
1336
- more: [resolve: () => void];
1337
- };
1430
+ type TableRowOptions = HeightStyle & {};
1338
1431
  /**
1339
- * 弹性组件 对外暴露属性接口
1432
+ * Table 列配置选项
1433
+ * - border 样式需要配合TableOptions.border使用,否则会导致边框线重叠
1340
1434
  */
1341
- type ElasticExpose = {
1435
+ type TableColOptions = BaseStyle & FlexBoxStyle & WidthStyle & BorderStyle & PaddingStyle;
1436
+
1437
+ /**
1438
+ * 排序组件 配置选项
1439
+ * - 整理部分SortableJs中的配置,不分逻辑不开放
1440
+ */
1441
+ type SortOptions<T> = {
1342
1442
  /**
1343
- * 加载刷新数据
1344
- * - 触发下拉刷新数据
1345
- * @returns 异步任务对象,外部感知任务执行完成
1443
+ * 变化器
1444
+ * - 在此元素值发生变化时,重新刷新排序面板
1445
+ * - 如在增加元素时,改变此值实现 新元素 可拖拽排序
1346
1446
  */
1347
- loadRefresh(): Promise<void>;
1447
+ changer: T;
1348
1448
  /**
1349
- * 加载更多数据
1350
- * - 触发上拉加载更多数据
1351
- * @returns 异步任务对象,外部感知任务执行完成
1449
+ * 拖动哪个元素
1450
+ * - 传入类样式选择器;如 .table-row
1352
1451
  */
1353
- loadMore(): Promise<void>;
1354
- };
1355
- /**
1356
- * 弹性组件的弹簧状态信息
1357
- */
1358
- type ElasticSpringStatus = {
1359
- x: number | undefined;
1452
+ draggable: string;
1360
1453
  /**
1361
- * y轴方向的橡皮筋效果偏移量
1454
+ * 哪个元素启动拖拽
1455
+ * - 传入类样式选择器;如 .sort-handle
1456
+ * - 不传入则默认 draggable
1457
+ * - 若自定义,则传入 draggable 下的dom元素作为启动拖拽的句柄
1362
1458
  */
1363
- y: number | undefined;
1364
- };
1365
-
1366
- /**
1367
- * 选项菜单 基础配置选项
1368
- */
1369
- type SelectBaseOptions<T> = {
1459
+ handle?: string;
1370
1460
  /**
1371
- * 【选择项】集合
1461
+ * 拖动的元素上增加的类样式
1462
+ * - 执行拖拽时随着鼠标移动元素,脱离文档流了
1463
+ * - 可自定义一些样式实现拖动元素的高度、宽度自定义等
1464
+ * - 默认:snail-sort-drag
1372
1465
  */
1373
- items: SelectItem<T>[];
1466
+ dragClass?: string;
1374
1467
  /**
1375
- * 搜索功能配置
1376
- * - 不配置则不启用【搜索】功能
1468
+ * 幽灵元素类样式名称
1469
+ * - 拖动时在面板上占位的元素
1470
+ * - 默认:snail-sort-ghost
1377
1471
  */
1378
- search?: SearchOptions;
1472
+ ghostClass?: string;
1379
1473
  /**
1380
- * 是否【多选模式】
1381
- * - 为true时,多选,【选择项】后面出【选择】框;底部出【全选】和【清空已选】
1382
- * - items为多级时,不支持【多选模式】;传入会报错
1474
+ * 过滤器,不需要进行拖动的元素
1475
+ * - 传入类样式选择器;如 .sort-handle
1476
+ * - 实现特定子元素不触发拖动排序功能
1383
1477
  */
1384
- multiple?: boolean;
1478
+ filter?: string;
1385
1479
  /**
1386
- * 是否显示【路径】
1387
- * - 为true时,显示选项的父级文本路径,用“ / ”分割
1388
- * - 仅针对【单选模式】生效
1480
+ * 排序组
1481
+ * - 组相同时,可跨组拖拽排序
1482
+ * - 不传入,则内部生成guid
1483
+ * - 为
1389
1484
  */
1390
- showPath?: boolean;
1485
+ group?: string | SortGroupOptions;
1391
1486
  /**
1392
- * 是否显示【清空已选】按钮
1393
- * - true:则在弹窗的底部显示【清空已选】按钮,点击时清空所有已选选项
1394
- * - 若存在多级选项,仅在第一级弹窗中显示
1487
+ * 动画时间
1488
+ * - 单位ms;默认150ms
1395
1489
  */
1396
- showClear?: boolean;
1490
+ animation?: number;
1397
1491
  /**
1398
- * 选择项 follow弹窗样式
1399
- * - 支持指定弹窗高度,如最大高度,不指定则默认尽可能展示全
1492
+ * 禁用排序效果
1493
+ * - 为true时,此容器内元素不能拖动,此不构建sortable实例
1400
1494
  */
1401
- popupStyle?: HeightStyle;
1402
- };
1403
- /**
1404
- * 选项菜单 基础事件
1405
- */
1406
- type SelectBaseEvents<T> = {
1495
+ disabled?: boolean;
1407
1496
  /**
1408
- * 选中的【选择项】改变时
1409
- * - @param values 已选的【选择项】,未选中则为空数组:单选时,为【选择项】路径(父->子);其他情况为已选的【选择项】
1497
+ * 在当前容器内是否禁用拖拽排序
1498
+ * - 为true时,此容器内部不能拖拽,但可拖动到其他同名group内
1499
+ * - 初期想用sort,但作Vue组件属性时,bool类型不传值会自动默认false,和初衷不符
1410
1500
  */
1411
- change: [values: SelectItem<T>[]];
1501
+ sortDisabled?: boolean;
1412
1502
  };
1413
1503
  /**
1414
- * 选项菜单组件的【选择项】
1504
+ * 排序组件的Group属性配置选项
1415
1505
  */
1416
- type SelectItem<T> = TreeNode<T, TreeNodeExtend & {
1506
+ type SortGroupOptions = {
1417
1507
  /**
1418
- * 节点类型
1419
- * - group 分组选择项;可包含子节点
1420
- * - item 选择项;默认值;不可包含子节点,即使传入也会忽略
1421
- */
1422
- type?: "group" | "item";
1423
- }>;
1424
- /**
1425
- * 选项菜单组件 配置选项
1426
- * - value 已选的【选择项】;单选时,为【选择项】路径(父->子);其他情况为已选的【选择项】
1427
- */
1428
- type SelectOptions<T> = ReadonlyOptions & PlaceholderOptions & SelectBaseOptions<T> & ValueOptions<SelectItem<T>[]> & {
1429
- /** 父类<see cref="SelectBaseOptions"/>已有属性:
1430
- * items 【选择项】集合
1431
- * search 启用 【搜索】功能
1432
- * searchPlaceholder 搜索框提示语
1433
- * multiple 是否【多选模式】
1434
- * showPath 显示选项路径
1435
- * popupStyle 弹出的选项选择窗体样式
1508
+ * 排序组名称;
1509
+ * - 不传入时自动生成
1436
1510
  */
1511
+ name: string;
1437
1512
  /**
1438
- * 选项分隔符
1439
- * - 单选有多级时的分割路径;默认为 /
1440
- * - 多选时分割多个选项;默认为 、
1513
+ * 定义从这个列表容器移动出去的设置
1514
+ * - true:列表容器内的列表单元可以被移出;
1515
+ * - false:列表容器内的列表单元不可以被移出;
1516
+ * - "clone":列表单元移出,移动的为该元素的副本;
1517
+ * - function:用来进行pull的函数判断,可以进行复杂逻辑,在函数中return false/true来判断是否移出;
1441
1518
  */
1442
- separator?: string;
1519
+ pull: true | false | "clone" | SortGroupHook;
1520
+ /**
1521
+ * 用来定义往这个列表容器放置列表单元的的设置
1522
+ * - true:列表容器可以从其他列表容器内放入列表单元;
1523
+ * - false:与true相反;
1524
+ * - string|string[]:代表的是group配置项里定义的name值。如['foo','bar']
1525
+ * - function:用来进行put的函数判断,可以进行复杂逻辑,在函数中return false/true来判断是否放入;
1526
+ */
1527
+ put: true | false | string | string[] | SortGroupHook;
1443
1528
  };
1444
1529
  /**
1445
- * 选项菜单 组件 事件
1530
+ * 排序组件的Group属性钩子
1531
+ * - 用于pull和put中使用,返回false时不执行pull、put操作
1532
+ * - @param item 移动的元素
1533
+ * - @param to 目标容器dom元素
1534
+ * - @param from 来源容器dom元素
1446
1535
  */
1447
- type SelectEvents<T> = SelectBaseEvents<T> & {};
1536
+ type SortGroupHook = (item: HTMLElement, to: HTMLElement, from: HTMLElement) => void;
1448
1537
  /**
1449
- * 选项菜单 组件的Slot配置选项
1538
+ * 排序组件 事件
1450
1539
  */
1451
- type SelectSlotOptions = {
1540
+ type SortEvents = {
1452
1541
  /**
1453
- * 清空已选【选择项】
1454
- * @param closeFollow 是否关闭【选择项】Follow弹窗
1455
- * @param stopPropagation 是否停止事件冒泡
1542
+ * 开始拖拽
1456
1543
  */
1457
- clear(closeFollow: boolean, stopPropagation: boolean): void;
1458
- };
1459
- /**
1460
- * 【选项菜单】 组件上下文
1461
- */
1462
- interface ISelectContext<T> extends ITreeBaseContext<T> {
1544
+ start: [evt: SortEvent];
1463
1545
  /**
1464
- * 指定节点是否选中了
1465
- * @param multiple 是否是【多选模式】
1466
- * @param item 要判断的节点
1467
- * @returns true 选中,false 未选中
1546
+ * 移动中
1468
1547
  */
1469
- selected(multiple: boolean, item: SelectItem<T>): boolean;
1548
+ move: [evt: SortEvent, originalEvent: SortEvent];
1470
1549
  /**
1471
- * 获取已选【选择项】的展示文本
1472
- * @param multiple 是否是【多选模式】
1473
- * @param showPath 是否显示路径
1474
- * @returns 已选【选择项】的展示文本
1550
+ * 移动到新容器时
1475
1551
  */
1476
- selectedText(multiple: boolean, showPath: boolean): string;
1477
- }
1478
- /**
1479
- * 【选项菜单】 弹窗组件配置选项
1480
- */
1481
- type SelectPopupOptions<T> = SelectBaseOptions<T> & {
1482
- /** 父类<see cref="SelectBaseOptions"/>已有属性:
1483
- * items 选择项 集合
1484
- * search 启用 【搜索】功能
1485
- * searchPlaceholder 搜索框提示语
1486
- * multiple 是否【多选模式】
1552
+ add: [evt: SortEvent];
1553
+ /**
1554
+ * 从当前容器移除时
1487
1555
  */
1556
+ remove: [evt: SortEvent];
1488
1557
  /**
1489
- * 树形上下文
1558
+ * 结束拖拽
1490
1559
  */
1491
- context: ISelectContext<T>;
1560
+ end: [evt: SortEvent];
1492
1561
  /**
1493
- * 第几级 选项弹窗
1494
- * - 从1开始
1562
+ * 元素排序顺序变化
1563
+ * @param oldIndex 旧位置索引值
1564
+ * @param newIndex 新顺序索引值
1495
1565
  */
1496
- level: number;
1566
+ update: [oldIndex: number, newIndex: number];
1497
1567
  };
1498
1568
  /**
1499
- * 【选项菜单】 弹窗组件事件
1569
+ * 排序事件对象
1500
1570
  */
1501
- type SelectPopupEvents<T> = {
1571
+ type SortEvent = {
1502
1572
  /**
1503
- * 清空选项
1573
+ * 目标容器
1504
1574
  */
1505
- clear: [];
1575
+ to: HTMLElement;
1506
1576
  /**
1507
- * 选项点击事件
1508
- * @param path 选中的【选择项】路径;父->子
1577
+ * 来源容器
1509
1578
  */
1510
- click: [path: SelectItem<T>[]];
1511
- };
1512
- /**
1513
- * 【选项菜单】 弹窗组件扩展
1514
- */
1515
- type SelectPopupExtend = {
1579
+ from: HTMLElement;
1516
1580
  /**
1517
- * 子选项弹窗的销毁定时器
1518
- * - 父级弹窗可根据需要销毁定时器,取消子选择弹窗销毁
1519
- * - 鼠标离开弹窗时,做延迟销毁;避免回到 此弹窗 的父【选择项】时,又重新打开此弹窗
1581
+ * 被移动的元素
1582
+ * - 在`group.pull`配置为 clone 时,此值为原始元素,复制元素放到原来位置了
1520
1583
  */
1521
- childDestroyTimer: ShallowRef<IScope>;
1584
+ item: HTMLElement;
1522
1585
  /**
1523
- * 父级弹窗的pin状态
1524
- * - 可在子弹窗中设置为true,这样父级弹窗就不会自动关闭了
1586
+ * 副本的元素
1587
+ * - 在`group.pull`配置为 clone 时
1525
1588
  */
1526
- parentPinned: ShallowRef<boolean>;
1589
+ clone: HTMLElement;
1590
+ /**
1591
+ * 容器中的原序号
1592
+ */
1593
+ oldIndex: number | undefined;
1594
+ /**
1595
+ * 容器中的新序号
1596
+ */
1597
+ newIndex: number | undefined;
1527
1598
  };
1599
+
1528
1600
  /**
1529
- * 【选项菜单】节点 组件配置选项
1601
+ * 布局组件 数据结构
1530
1602
  */
1531
- type SelectNodeOptions<T> = {
1603
+
1604
+ /**
1605
+ * 布局组件 配置选项
1606
+ */
1607
+ type LayoutOptions = {
1532
1608
  /**
1533
- * 是否为【多选模式】
1609
+ * 布局方向
1610
+ * - horizontal 水平布局:左中右
1611
+ * - vertical 垂直布局:上中下
1612
+ * - 默认为 `horizontal`
1534
1613
  */
1535
- multiple: boolean;
1614
+ direction?: "horizontal" | "vertical";
1536
1615
  /**
1537
- * 要展示的节点
1616
+ * 主内容区域配置
1617
+ * - 对应插槽名:main;主要内容显示区域,处于布局中的【中】区域
1618
+ * - 配置主内容区域的滚动条配置
1538
1619
  */
1539
- item: SelectItem<T>;
1620
+ main?: Pick<LayoutAraeOptions<void>, "scroll" | "class">;
1540
1621
  /**
1541
- * 树形上下文
1622
+ * 【左侧】区域配置
1623
+ * - 对应插槽名`left` ;`mode` 为 `horizontal` 时生效
1624
+ * - 配置滚动条和宽度;宽度不配置时,默认 `fit-content`
1625
+ * -
1542
1626
  */
1543
- context: ISelectContext<T>;
1627
+ left?: LayoutAraeOptions<WidthStyle>;
1544
1628
  /**
1545
- * 是否显示子节点
1629
+ * 【右测】区域配置
1630
+ * - 对应插槽名`right` ;`mode` 为 `horizontal` 时生效
1631
+ * - 配置滚动条和宽度;宽度不配置时,默认 `fit-content`
1546
1632
  */
1547
- showChildren: boolean;
1548
- };
1549
- /**
1550
- * 【选项菜单】节点 组件事件
1551
- */
1552
- type SelectNodeEvents<T> = {
1633
+ right?: LayoutAraeOptions<WidthStyle>;
1553
1634
  /**
1554
- * 鼠标进入事件
1555
- * @param el 【选择项】节点dom元素
1556
- * @param item 【选择项】
1557
- * @param parent 父节点
1635
+ * 【顶部】区域配置
1636
+ * - 对应插槽名`top`;`mode` 为 `vertical` 时生效
1637
+ * - 配置滚动条和高度;高度不配置时,默认 `fit-content`
1638
+ * -
1558
1639
  */
1559
- enter: [el: HTMLDivElement, item: SelectItem<T>, parent?: SelectItem<T>];
1640
+ top?: LayoutAraeOptions<HeightStyle>;
1560
1641
  /**
1561
- * 点击事件
1562
- * @param item 【选择项】
1563
- * @param parent 父节点
1642
+ * 【底部】区域配置
1643
+ * - 对应插槽名`bottom`;`mode` 为 `vertical` 时生效
1644
+ * - 配置滚动条和高度;高度不配置时,默认 `fit-content`
1564
1645
  */
1565
- click: [item: SelectItem<T>, parent?: SelectItem<T>];
1646
+ bottom?: LayoutAraeOptions<HeightStyle>;
1566
1647
  };
1567
-
1568
- /**
1569
- * 基础事件实体
1570
- * 1、把一些常用事件,封装为原子结构,方便复用
1571
- * 2、不强制必须复用,根据自身情况
1572
- */
1573
1648
  /**
1574
- * 事件:点击
1649
+ * 布局组件子区域 配置选项
1575
1650
  */
1576
- type ClickEvents = {
1651
+ type LayoutAraeOptions<Style extends WidthStyle | HeightStyle | void> = Style & CSSClassOptions & {
1577
1652
  /**
1578
- * 单击事件
1653
+ * 滚动视图配置
1654
+ * - 视图属性:滚动条大小、显示时机
1655
+ * - 滚动事件:滚动条显隐、滚动到顶部、底部、、、
1656
+ * - 不传入则当前区域`overflow:hidden`溢出隐藏
1579
1657
  */
1580
- click: [];
1658
+ scroll?: ScrollOptions & EventsType<ScrollEvents>;
1581
1659
  };
1582
1660
  /**
1583
- * 事件:值改变
1584
- * - 描述值的改变过程,新值是什么,改变前的旧值是什么
1661
+ * 布局组件的子区域项目 描述
1585
1662
  */
1586
- type ChangeEvents<T> = {
1663
+ type LayoutAreaItem = {
1587
1664
  /**
1588
- * 值改变;约束新旧值
1589
- * @param newValue 新值
1590
- * @param oldValue 旧值
1665
+ * 是否可滚动
1591
1666
  */
1592
- change: [newValue: T, oldValue?: T];
1593
- };
1594
- /**
1595
- * 事件:移动
1596
- * - 可描述数据索引位置变化
1597
- * - 可用于数组元素拖动排序,调整位置等逻辑
1598
- */
1599
- type MoveEvents = {
1667
+ scrollable: boolean;
1600
1668
  /**
1601
- * 移动事件
1602
- * @param fromIndex 从哪个索引位置开始移动
1603
- * @param toIndex 移动到的索引位置
1669
+ * 内容区域元素的类样式名
1604
1670
  */
1605
- move: [fromIndex: number, toIndex: number];
1606
- };
1607
- /**
1608
- * 事件:删除数据
1609
- * - 描述要删除的具体数据
1610
- */
1611
- type DeleteEvents<T> = {
1671
+ class: string[];
1612
1672
  /**
1613
- * 删除事件
1614
- * @param value 要删除的数据
1673
+ * css样式
1615
1674
  */
1616
- delete: [value?: T];
1675
+ style: Record<string, string>;
1617
1676
  };
1677
+
1618
1678
  /**
1619
- * 事件:关闭
1679
+ * 动画组件配置选项
1680
+ * - 实现组件入/退场的动画效果
1620
1681
  */
1621
- type CloseEvents = {
1682
+ type MotionOptions = {
1622
1683
  /**
1623
- * 关闭事件
1684
+ * 是否是多元素模式
1685
+ * - 为true时,则使用 TransitionGroup 组件实现多元素间动画控制
1686
+ * - 为false时,则使用 Transition 组件实现单元素动画控制
1624
1687
  */
1625
- close: [];
1626
- };
1627
-
1628
- /**
1629
- * 数值控件的数据结构
1630
- */
1631
-
1632
- /**
1633
- * 数值组件的基础配置选项
1634
- */
1635
- type NumberBaseOptions = {
1688
+ multiple?: boolean;
1636
1689
  /**
1637
- * 最小值
1690
+ * 动画效果
1691
+ * - 为Object时,显式指定 `enter`和`leave`样式,此时应使用`animation`实现动画样式
1692
+ * - - 可访问`MOTION`使用内置动画效果
1693
+ * - 为string时,为动画的根样式,实现动画效果时:
1694
+ * - - 入场动画:`${effect}.enter-active` `${effect}.enter-from` `${effect}.enter-to`
1695
+ * - - 退场动画:`${effect}.leave-active` `${effect}.leave-from` `${effect}.leave-to`
1696
+ * - 为空时,使用`MOTION.fade`值;
1638
1697
  */
1639
- minValue?: number;
1698
+ effect?: MotionEffectOptions | string;
1640
1699
  /**
1641
- * 最大值
1700
+ * 动画持续时间,单位ms,默认200ms
1701
+ * - `>0`时生效,否则禁用动画
1642
1702
  */
1643
- maxValue?: number;
1703
+ duration?: number;
1644
1704
  /**
1645
- * 值超过阈值(最大值、最小值)时的处理模式
1646
- * - 默认值为 `keep`;可选取值范围:
1647
- * - - `keep` 保持原样值显示,不做任何处理
1648
- * - - `clamp` 截断超出阈值值,低于最小值时直接取最小值,超过最大值时,强制值为最大值
1649
- * - 值超过阈值时,会自动触发事件,事件名`NumberEvents`的`belowMin`和`exceedMax`
1705
+ * 动画模式
1706
+ * - default(默认) 入场和退场动画同时执行
1707
+ * - in-out 入场动画先执行,退场动画后执行
1708
+ * - out-in 退场动画先执行,入场动画后执行
1709
+ * - 在多个元素之间切换时生效,一个元素的显隐切换无效果
1650
1710
  */
1651
- clamp?: "keep" | "clamp";
1711
+ mode?: "in-out" | "out-in" | "default";
1712
+ };
1713
+ /**
1714
+ * 动画效果配置选项
1715
+ */
1716
+ type MotionEffectOptions = {
1652
1717
  /**
1653
- * 精度,保留几位小数
1654
- * - 要求0、正整数,输入小数则强制整数
1655
- * - 负数、不传入则不处理
1718
+ * 入场进入时的动画效果
1719
+ * - 用于初始化入场动画;最终映射成 Transition 组件的 `enter-active-class` 属性
1656
1720
  */
1657
- precision?: number;
1721
+ enter?: string;
1658
1722
  /**
1659
- * 对数值进行千分位格式处理
1660
- * - 默认值为 `disabled`;可选值范围:
1661
- * - `disabled` 禁用千分位功能
1662
- * - `inline` 内联千分位功能
1663
- * - `below` 下拉千分位功能
1723
+ * 退场离开时的动画效果
1724
+ * - 用于初始化退场动画;最终映射成 Transition 组件的 `leave-active-class` 属性
1664
1725
  */
1665
- thousands?: "disabled" | "inline" | "below";
1726
+ leave?: string;
1727
+ };
1728
+
1729
+ /**
1730
+ * 折叠面板配置选项
1731
+ * - title 折叠面板标题
1732
+ * - disabled 禁用折叠效果,始终展开
1733
+ */
1734
+ type FoldOptions = DisabledOptions & TitleOptions & {
1666
1735
  /**
1667
- * 是否启用数值大写格式化处理
1668
- * - 为true时,转成中文大写值
1669
- * - 单位自动为“元”,不支持美元等
1670
- * - 如金额时,自动转为壹仟壹佰壹拾壹元叁角叁分
1671
- * - 小数点后面只处理两位(角分);剩余不处理
1736
+ * 副标题
1737
+ * - 跟随在title后
1672
1738
  */
1673
- upper?: boolean;
1739
+ subtitle?: string;
1674
1740
  /**
1675
- * 格式化时的放大系数
1676
- * - 用于在格式化千分位、大写时,对实际值进行系数放大,value*formatMultiplier
1677
- * - 仅接收正整数,取值规则为10^n,默认1
1678
- * - 千分位格式化时,仅`thousands`为`below`时才进行放到系数处理
1679
- * - 使用示例例:金额是为万元单位时,这里的放大系数就为 “10000”
1741
+ * 面板头部区域配置
1742
+ * - 如指定特定的css式
1680
1743
  */
1681
- formatMultiplier?: number;
1744
+ header?: CSSClassOptions;
1682
1745
  /**
1683
- * 前缀字符串
1684
- * - 如金额时,可配置前缀 ¥
1746
+ * 面板内容区域配置
1747
+ * - 如指定特定的css样式
1685
1748
  */
1686
- prefix?: string;
1749
+ body?: CSSClassOptions;
1750
+ };
1751
+ /**
1752
+ * 折叠状态
1753
+ * - expand : 展开状态
1754
+ * - fold : 折叠状态
1755
+ */
1756
+ type FoldStatus = "expand" | "fold";
1757
+ /**
1758
+ * 折叠面板组件插槽句柄
1759
+ * - 将折叠面板状态和操作共享给插槽中自定义组件使用
1760
+ */
1761
+ type FoldSlotHandle = {
1687
1762
  /**
1688
- * 后缀字符串
1689
- * - 如金额时,可配置后缀 元/美元、、
1763
+ * 获取折叠面板状态
1764
+ * @returns
1690
1765
  */
1691
- suffix?: string;
1766
+ getStatus(): FoldStatus;
1692
1767
  /**
1693
- * 数值控制器
1694
- * - 便捷加减调整数值的控制按钮
1695
- * - 默认值`disabled`;可选值范围:
1696
- * - - `disabled` 时禁用
1697
- * - - `default` 默认模式,左侧 — 右侧 +
1698
- * - - `right` 右侧模式,+ - 都在右侧
1768
+ * 设置折叠面板状态
1769
+ * @param status 新的状态
1699
1770
  */
1700
- controls?: "disabled" | "default" | "right";
1771
+ setStatus(status: FoldStatus): void;
1701
1772
  /**
1702
- * 数值步长值
1703
- * - `controls` 未禁用时生效
1704
- * - 每次+、- 的步长值
1773
+ * 切换面板状态
1774
+ * @returns 新的状态
1705
1775
  */
1706
- step?: number;
1776
+ toggle(): FoldStatus;
1707
1777
  };
1708
1778
  /**
1709
- * 数值组件的配置选项
1779
+ * 折叠面板事件
1710
1780
  */
1711
- type NumberOptions = PlaceholderOptions & ReadonlyOptions & NumberBaseOptions;
1781
+ type FoldEvents = {
1782
+ /**
1783
+ * 折叠状态发生改变时
1784
+ * @param status 折叠状态
1785
+ */
1786
+ change: [status: FoldStatus];
1787
+ };
1788
+
1712
1789
  /**
1713
- * 接口:数值格式化器
1790
+ * 弹性布局组件配置选项
1714
1791
  */
1715
- interface INumberFormatter extends Required<Readonly<Pick<NumberBaseOptions, "minValue" | "maxValue" | "precision" | "thousands" | "upper">>> {
1792
+ type FlexOptions = {
1716
1793
  /**
1717
- * 格式化输入文本
1718
- * @param text 输入文本
1719
- * @param isEnd 是否是输入结束,true时,已经输入结束将进行数值精度处理
1720
- * @returns 数值格式化结果
1794
+ * 主轴方向
1795
+ * - css属性:flex-direction
1796
+ * - 取值范围:
1797
+ * - - row(默认值) 水平主轴,起点在左端
1798
+ * - - row-reverse 水平主轴,起点在右端
1799
+ * - - column 垂直主轴,起点在上沿
1800
+ * - - column-reverse 垂直主轴,起点在下沿
1721
1801
  */
1722
- format(text: string, isEnd: boolean): NumberFormatResult;
1802
+ direction?: "row" | "column" | "row-reverse" | "column-reverse";
1723
1803
  /**
1724
- * 进行阈值检测,检测是否超过设定的最大值、最小值
1725
- * @param number 要检测的数值
1726
- * @returns 检测结果,`number` 新的值,`belowMin`是否低于最小值,`exceedMax`是否超过最大值
1804
+ * 是否换行
1805
+ * - css属性:flex-wrap
1806
+ * - 取值范围:
1807
+ * - - nowrap(默认值) 不换行,所有 flex 项都排在一行
1808
+ * - - wrap 换行,第一行在上方
1809
+ * - - wrap-reverse 换行,第一行在下方
1727
1810
  */
1728
- checkThreshold(number: any): {
1729
- number: number;
1730
- belowMin: boolean;
1731
- exceedMax: boolean;
1732
- };
1811
+ wrap?: "nowrap" | "wrap" | "wrap-reverse";
1733
1812
  /**
1734
- * 对数值文本转大写
1735
- * @param result
1736
- * @returns 大写文本值
1813
+ * 行与列之间的间隙(网格间距)
1814
+ * - css属性:gap
1815
+ * - row-gap、column-gap的缩写
1816
+ * - 举例:gap: "10px 20px" 表示行间距为10px,列间距为20px;gap: "10px" 表示行间距和列间距都为10px
1737
1817
  */
1738
- buildUpper(result: NumberFormatResult): string;
1818
+ gap?: string;
1739
1819
  /**
1740
- * 对数值文本进行千分位格式化
1741
- * @param result
1742
- * @returns 格式化后的文本值
1820
+ * 主轴对齐方式
1821
+ * - css属性:justify-content
1822
+ * - 取值范围:
1823
+ * - - start(默认值) 主轴起点对齐
1824
+ * - - end 主轴终点对齐
1825
+ * - - center 主轴居中对齐
1826
+ * - - between 主轴两端对齐,项目之间间隔平均分布
1827
+ * - - around 主轴每个项目两侧间隔平均分布
1828
+ * - - evenly 主轴每个项目之间间隔平均分布
1743
1829
  */
1744
- buildThousands(result: NumberFormatResult): string;
1830
+ main?: "start" | "end" | "center" | "between" | "around" | "evenly";
1745
1831
  /**
1746
- * 基于步长计算值
1747
- * @param number 要重新计算的数值
1748
- * @param isPlus true为+,false为-
1749
- * @returns 新的数值
1832
+ * 交叉轴对齐方式
1833
+ * - css属性:align-items
1834
+ * - 取值范围:
1835
+ * - - stretch(默认值) 交叉轴拉伸对齐(如果项目未设置高度或设为 auto,将占满整个交叉轴)
1836
+ * - - start 交叉轴起点对齐
1837
+ * - - end 交叉轴终点对齐
1838
+ * - - center 交叉轴居中对齐
1839
+ * - - baseline 交叉轴第一行文字基线对齐
1750
1840
  */
1751
- calcByStep(number: number, isPlus: boolean): number;
1752
- }
1753
- /**
1754
- * 数值格式化结果
1755
- */
1756
- type NumberFormatResult = {
1841
+ cross?: "start" | "end" | "center" | "stretch" | "baseline";
1757
1842
  /**
1758
- * 输入是否是有效输入
1759
- * - `- 0 1 2 3 4 5 6 7 8 9 0 .`算是合法输入
1843
+ * 多行时的交叉轴对齐方式
1844
+ * - css属性:align-content
1845
+ * - 取值范围:
1846
+ * - - stretch(默认值) 交叉轴拉伸对齐(如果项目未设置高度或设为 auto,将占满整个交叉轴)
1847
+ * - - start 交叉轴起点对齐
1848
+ * - - end 交叉轴终点对齐
1849
+ * - - center 交叉轴居中对齐
1850
+ * - - between 交叉轴两端对齐,行之间间隔平均分布
1851
+ * - - around 交叉轴每行两侧间隔平均分布
1852
+ * - - evenly 交叉轴每行之间间隔平均分布
1760
1853
  */
1761
- readonly valid: boolean;
1854
+ content?: "start" | "end" | "center" | "stretch" | "between" | "around" | "evenly";
1762
1855
  /**
1763
- * 有效的数值
1764
- * - undefined时,输入无法转换成有效的数值
1856
+ * 启用子项修复
1857
+ * - 在`justify-content`启用`space-`相关属性时,子项之间会有间隔,当子项数量较少时,可能出现空间过大的问题,特别时多行的最后一样时
1858
+ * - 启动后,会基于子项数量补全最后一行缺失的子项数量,来修复空间过大的问题
1859
+ * - 推荐仅在所有子项主轴方向尺寸一样时,否则修复可能不准确
1765
1860
  */
1766
- readonly number: number | undefined;
1861
+ repairItem?: boolean;
1767
1862
  /**
1768
- * 数值的显示文本
1769
- * - 无千分位等处理的数值显示文本
1770
- * - 若需要在行内显示 千分位 格式文本,需要单独处理
1863
+ * flex容器的子项数量
1864
+ * - 配合 `repairSpace` 构建修复空间的子项数量
1865
+ * - `repairSpace` 启用时,自动监听子项数量变化来动态调整修复空间的子项数量;不启用时忽略
1771
1866
  */
1772
- readonly text: string;
1867
+ itemCount?: number;
1773
1868
  /**
1774
- * 格式化数值时发生的错误
1775
- * - 输入数值有效,但是格式化时发生错误了
1869
+ * flex容器的子项标签名
1870
+ * - 配合 `repairSpace` 构建修复空间的子项元素标签名
1871
+ * - 默认值为`div`,即子项元素为`<div>`标签
1872
+ * - 可配置为其他标签名,如`span`,则子项元素为`<span>`标签
1776
1873
  */
1777
- readonly error?: string;
1874
+ itemTag?: string;
1778
1875
  /**
1779
- * 是否是负数
1780
- * - true 时说明以`-`开始;false时为正数
1781
- * - 若为true,但`integerPart`为undefined,则说明仅输入了`-`
1876
+ * flex容器的子项类样式名
1877
+ * - 配合 `repairSpace` 构建修复空间的子项元素类样式名
1878
+ * - 推荐设置为一个固定值的类样式名,如`flex-item`,来方便用户通过该类样式名来设置子项元素的样式
1879
+ * - 构建的子项,会自动追加一个 "repair-item”的类样式名,来方便用户通过该类样式名来设置修复空间子项元素的样式
1782
1880
  */
1783
- readonly isNegative?: boolean;
1881
+ itemClass?: string;
1882
+ };
1883
+
1884
+ /**
1885
+ * 弹性容器组件 配置选项
1886
+ */
1887
+ type ElasticOptions = ScrollOptions & {
1784
1888
  /**
1785
- * 是否是小数
1786
- * - true 时说明有小数点“.”;false 时为整数
1787
- * - 若为true,但`decimalPart`为undefined,则说明是以`.`结尾,还没输入具体的小数部分
1889
+ * 滚动条弹簧效果
1890
+ * - x 仅在x轴方向上启用弹簧效果
1891
+ * - y 仅在y轴方向上启用弹簧效果
1892
+ * - both :同时启用x轴和y轴的弹簧效果
1788
1893
  */
1789
- readonly isDecimal?: boolean;
1894
+ spring?: "x" | "y" | "both";
1790
1895
  /**
1791
- * 数值输入的整数部分
1792
- * - 取整数部分绝对值,如-1.2,仅为1
1896
+ * 是否启用【下拉刷新】功能
1897
+ * - `spring` 为 `y/both`时生效
1898
+ * - 满足下拉刷新条件后,触发`refresh`事件,处理完成后调用resolve函数,通知完成刷新数据操作
1793
1899
  */
1794
- readonly integerPart?: string;
1900
+ downRefresh?: boolean;
1795
1901
  /**
1796
- * 小数部分
1902
+ * 是否启用【上拉加载】功能
1903
+ * - `spring` 为 `y/both`时生效
1904
+ * - 满足上拉加载条件后,触发`more`事件,处理完成后调用resolve函数,通知完成加载数据操作
1797
1905
  */
1798
- readonly decimalPart?: string;
1906
+ upMore?: boolean;
1907
+ };
1908
+ /**
1909
+ * 弹性容器组件 事件监听
1910
+ */
1911
+ type ElasticEvents = ScrollEvents & {
1799
1912
  /**
1800
- * 进行系数放大后的整数部分
1913
+ * 刷新数据
1914
+ * - 配合 `downRefresh`实现下拉刷新功能
1915
+ * @param resolve 处理完成后调用resolve函数,通知完成刷新数据操作
1801
1916
  */
1802
- readonly integerPartAfterMultiplier?: string;
1917
+ refresh: [resolve: () => void];
1803
1918
  /**
1804
- * 进行系数放大后的小数部分
1919
+ * 加载更多
1920
+ * - 配合 `upMore`实现上拉加载功能
1921
+ * @param resolve 处理完成后调用resolve函数,通知完成加载数据操作
1805
1922
  */
1806
- readonly decimalPartAfterMultiplier?: string;
1923
+ more: [resolve: () => void];
1807
1924
  };
1808
1925
  /**
1809
- * 数值组件的事件选项
1926
+ * 弹性组件 对外暴露属性接口
1810
1927
  */
1811
- type NumberEvents = ChangeEvents<number> & {
1928
+ type ElasticExpose = {
1812
1929
  /**
1813
- * 数值发生错误时
1814
- * - 若超过最大的精度范围
1815
- * - 其他未知异常等
1816
- * @param reason 错误原因
1930
+ * 加载刷新数据
1931
+ * - 触发下拉刷新数据
1932
+ * @returns 异步任务对象,外部感知任务执行完成
1817
1933
  */
1818
- error: [reason: string];
1934
+ loadRefresh(): Promise<void>;
1819
1935
  /**
1820
- * 小于最小值
1821
- * @param value 当前值
1822
- * @param minValue 最小值
1936
+ * 加载更多数据
1937
+ * - 触发上拉加载更多数据
1938
+ * @returns 异步任务对象,外部感知任务执行完成
1823
1939
  */
1824
- belowMin: [value: number, minValue: number];
1940
+ loadMore(): Promise<void>;
1941
+ };
1942
+ /**
1943
+ * 弹性组件的弹簧状态信息
1944
+ */
1945
+ type ElasticSpringStatus = {
1946
+ x: number | undefined;
1825
1947
  /**
1826
- * 超过最大值
1827
- * @param value 当前值
1828
- * @param maxValue 最大值
1948
+ * y轴方向的橡皮筋效果偏移量
1829
1949
  */
1830
- exceedMax: [value: number, maxValue: number];
1950
+ y: number | undefined;
1831
1951
  };
1832
1952
 
1833
1953
  /**
1834
- * 图标配置选项
1835
- * - title 作为鼠标移入图标时的提示
1954
+ * 选项菜单 基础配置选项
1836
1955
  */
1837
- type IconOptions = TitleOptions & {
1956
+ type SelectBaseOptions<T> = {
1838
1957
  /**
1839
- * 是否为自定义图标
1840
- * - 为true时,外部通过插槽自己绘制图标
1841
- * - 为false时,使用`type`值绘制对应的内置图标
1842
- * - 默认false
1958
+ * 【选择项】集合
1843
1959
  */
1844
- custom?: boolean;
1960
+ items: SelectItem<T>[];
1845
1961
  /**
1846
- * 内置的图标类型
1847
- * - `custom`为false时生效
1962
+ * 搜索功能配置
1963
+ * - 不配置则不启用【搜索】功能
1848
1964
  */
1849
- type?: IconType;
1965
+ search?: SearchOptions;
1850
1966
  /**
1851
- * 是否是按钮图标
1852
- * - true时,鼠标移入时 cursor:pointer;
1967
+ * 是否【多选模式】
1968
+ * - true时,多选,【选择项】后面出【选择】框;底部出【全选】和【清空已选】
1969
+ * - items为多级时,不支持【多选模式】;传入会报错
1853
1970
  */
1854
- button?: boolean;
1971
+ multiple?: boolean;
1855
1972
  /**
1856
- * 图标大小
1857
- * - 可指定对象,如 { width: 24, height: 24 },则图标大小为 24 * 24
1858
- * - 可指定数字,如 24,则图标大小为 24 * 24
1859
- * - 默认 24
1973
+ * 是否显示【路径】
1974
+ * - 为true时,显示选项的父级文本路径,用“ / ”分割
1975
+ * - 仅针对【单选模式】生效
1860
1976
  */
1861
- size?: number | {
1862
- width?: number;
1863
- height?: number;
1864
- };
1977
+ showPath?: boolean;
1865
1978
  /**
1866
- * 图标颜色
1979
+ * 是否显示【清空已选】按钮
1980
+ * - true:则在弹窗的底部显示【清空已选】按钮,点击时清空所有已选选项
1981
+ * - 若存在多级选项,仅在第一级弹窗中显示
1867
1982
  */
1868
- color?: string;
1983
+ showClear?: boolean;
1869
1984
  /**
1870
- * 鼠标移入时的图标颜色
1985
+ * 选择项 follow弹窗样式
1986
+ * - 支持指定弹窗高度,如最大高度,不指定则默认尽可能展示全
1871
1987
  */
1872
- hoverColor?: string;
1988
+ popupStyle?: HeightStyle;
1989
+ };
1990
+ /**
1991
+ * 选项菜单 基础事件
1992
+ */
1993
+ type SelectBaseEvents<T> = {
1873
1994
  /**
1874
- * 旋转角度
1875
- * - 默认0
1876
- * - 通过:transform: rotate(1.06); 实现
1995
+ * 选中的【选择项】改变时
1996
+ * - @param values 已选的【选择项】,未选中则为空数组:单选时,为【选择项】路径(父->子);其他情况为已选的【选择项】
1877
1997
  */
1878
- rotate?: number;
1998
+ change: [values: SelectItem<T>[]];
1999
+ };
2000
+ /**
2001
+ * 选项菜单组件的【选择项】
2002
+ */
2003
+ type SelectItem<T> = TreeNode<T, TreeNodeExtend & {
1879
2004
  /**
1880
- * 图标透明度
1881
- * - 不传入,默认1
2005
+ * 节点类型
2006
+ * - group 分组选择项;可包含子节点
2007
+ * - item 选择项;默认值;不可包含子节点,即使传入也会忽略
2008
+ */
2009
+ type?: "group" | "item";
2010
+ }>;
2011
+ /**
2012
+ * 选项菜单组件 配置选项
2013
+ * - value 已选的【选择项】;单选时,为【选择项】路径(父->子);其他情况为已选的【选择项】
2014
+ */
2015
+ type SelectOptions<T> = ReadonlyOptions & PlaceholderOptions & SelectBaseOptions<T> & ValueOptions<SelectItem<T>[]> & {
2016
+ /** 父类<see cref="SelectBaseOptions"/>已有属性:
2017
+ * items 【选择项】集合
2018
+ * search 启用 【搜索】功能
2019
+ * searchPlaceholder 搜索框提示语
2020
+ * multiple 是否【多选模式】
2021
+ * showPath 显示选项路径
2022
+ * popupStyle 弹出的选项选择窗体样式
1882
2023
  */
1883
- opacity?: number;
1884
2024
  /**
1885
- * 图标边样式
2025
+ * 选项分隔符
2026
+ * - 单选有多级时的分割路径;默认为 /
2027
+ * - 多选时分割多个选项;默认为 、
1886
2028
  */
1887
- border?: string;
2029
+ separator?: string;
2030
+ };
2031
+ /**
2032
+ * 选项菜单 组件 事件
2033
+ */
2034
+ type SelectEvents<T> = SelectBaseEvents<T> & {};
2035
+ /**
2036
+ * 选项菜单 组件的Slot配置选项
2037
+ */
2038
+ type SelectSlotOptions = {
1888
2039
  /**
1889
- * 图标圆角样式
2040
+ * 清空已选【选择项】
2041
+ * @param closeFollow 是否关闭【选择项】Follow弹窗
2042
+ * @param stopPropagation 是否停止事件冒泡
1890
2043
  */
1891
- radius?: string;
2044
+ clear(closeFollow: boolean, stopPropagation: boolean): void;
2045
+ };
2046
+ /**
2047
+ * 【选项菜单】 组件上下文
2048
+ */
2049
+ interface ISelectContext<T> extends ITreeBaseContext<T> {
1892
2050
  /**
1893
- * 图标背景样式
2051
+ * 指定节点是否选中了
2052
+ * @param multiple 是否是【多选模式】
2053
+ * @param item 要判断的节点
2054
+ * @returns true 选中,false 未选中
1894
2055
  */
1895
- background?: string;
2056
+ selected(multiple: boolean, item: SelectItem<T>): boolean;
1896
2057
  /**
1897
- * 图形伸展
1898
- * - svg.viewBox 属性
1899
- * - 为空则默认“0 0 1024 1024”
2058
+ * 获取已选【选择项】的展示文本
2059
+ * @param multiple 是否是【多选模式】
2060
+ * @param showPath 是否显示路径
2061
+ * @returns 已选【选择项】的展示文本
1900
2062
  */
1901
- viewBox?: string;
1902
- };
1903
- /**
1904
- * 图标类型
1905
- * - 状态类:
1906
- * - - success 成功图标,对勾
1907
- * - - error 错误
1908
- * - - warn 警告图标
1909
- * - 操作类:
1910
- * - - close 关闭 用作数据删除,弹窗关闭
1911
- * - - trash 垃圾桶图标,常用于【删除】操作
1912
- * - - download 下载
1913
- * - - print 打印
1914
- * - - edit 编辑
1915
- * - - pause 暂停,两道竖线
1916
- * - 指向类:
1917
- * - - arrow 向右箭头
1918
- * - - datepicker 日期选择器
1919
- * - - timepicker 时间选择器
1920
- * - 其他类:
1921
- * - - plus 加号
1922
- * - - subtract 减号
1923
- * - - more 更多,默认垂直三个点
1924
- * - - grip 紧握图标,垂直方向,一般用于拖动句柄
2063
+ selectedText(multiple: boolean, showPath: boolean): string;
2064
+ }
2065
+ /**
2066
+ * 【选项菜单】 弹窗组件配置选项
1925
2067
  */
1926
- type IconType = "success" | "error" | "warn" | "close" | "trash" | "download" | "print" | "edit" | "pause" | "arrow" | "datepicker" | "timepicker" | "plus" | "subtract" | "more" | "grip";
1927
-
2068
+ type SelectPopupOptions<T> = SelectBaseOptions<T> & {
2069
+ /** 父类<see cref="SelectBaseOptions"/>已有属性:
2070
+ * items 选择项 集合
2071
+ * search 启用 【搜索】功能
2072
+ * searchPlaceholder 搜索框提示语
2073
+ * multiple 是否【多选模式】
2074
+ */
2075
+ /**
2076
+ * 树形上下文
2077
+ */
2078
+ context: ISelectContext<T>;
2079
+ /**
2080
+ * 第几级 选项弹窗
2081
+ * - 从1开始
2082
+ */
2083
+ level: number;
2084
+ };
1928
2085
  /**
1929
- * 检查选项 数据结构
2086
+ * 【选项菜单】 弹窗组件事件
1930
2087
  */
1931
-
2088
+ type SelectPopupEvents<T> = {
2089
+ /**
2090
+ * 清空选项
2091
+ */
2092
+ clear: [];
2093
+ /**
2094
+ * 选项点击事件
2095
+ * @param path 选中的【选择项】路径;父->子
2096
+ */
2097
+ click: [path: SelectItem<T>[]];
2098
+ };
1932
2099
  /**
1933
- * 选择 组件配置选项
2100
+ * 【选项菜单】 弹窗组件扩展
1934
2101
  */
1935
- type ChooseOptions<T> = ReadonlyOptions & {
2102
+ type SelectPopupExtend = {
1936
2103
  /**
1937
- * 是否为多选模式
1938
- * - true 多选模式,可以选中items中多个选项
1939
- * - false 单选模式,只能选中items中的一个选项
2104
+ * 子选项弹窗的销毁定时器
2105
+ * - 父级弹窗可根据需要销毁定时器,取消子选择弹窗销毁
2106
+ * - 鼠标离开弹窗时,做延迟销毁;避免回到 此弹窗 的父【选择项】时,又重新打开此弹窗
1940
2107
  */
1941
- multi?: boolean;
2108
+ childDestroyTimer: ShallowRef<IScope>;
1942
2109
  /**
1943
- * 选项类型
1944
- * - radio: 单选框样式
1945
- * - checkbox: 多选框样式
2110
+ * 父级弹窗的pin状态
2111
+ * - 可在子弹窗中设置为true,这样父级弹窗就不会自动关闭了
1946
2112
  */
1947
- type: "radio" | "checkbox";
2113
+ parentPinned: ShallowRef<boolean>;
2114
+ };
2115
+ /**
2116
+ * 【选项菜单】节点 组件配置选项
2117
+ */
2118
+ type SelectNodeOptions<T> = {
1948
2119
  /**
1949
- * 显示模式
1950
- * - native 原生默认,浏览器自己渲染;不同浏览器效果不一致
1951
- * - beautiful 美化模式,不同浏览器下效果通义
2120
+ * 是否为【多选模式】
1952
2121
  */
1953
- mode?: "native" | "beautiful";
2122
+ multiple: boolean;
1954
2123
  /**
1955
- * 选项布局
1956
- * - 默认值:horizontal
1957
- * - 可选值:
1958
- * - - horizontal 水平布局;所有选项一行
1959
- * - - vertical 垂直布局;每个选项一行
2124
+ * 要展示的节点
1960
2125
  */
1961
- layout?: "horizontal" | "vertical";
2126
+ item: SelectItem<T>;
1962
2127
  /**
1963
- * 待选项目
1964
- * text 可不传入
2128
+ * 树形上下文
1965
2129
  */
1966
- items: ChooseItem<T>[];
2130
+ context: ISelectContext<T>;
1967
2131
  /**
1968
- * 选项自定义样式
1969
- * - 可指定选项宽度、高度、外边距
2132
+ * 是否显示子节点
1970
2133
  */
1971
- itemStyle?: WidthStyle & HeightStyle & MarginStyle;
2134
+ showChildren: boolean;
1972
2135
  };
1973
2136
  /**
1974
- * 选择项
2137
+ * 【选项菜单】节点 组件事件
1975
2138
  */
1976
- type ChooseItem<T> = {
2139
+ type SelectNodeEvents<T> = {
1977
2140
  /**
1978
- * 选项文本
2141
+ * 鼠标进入事件
2142
+ * @param el 【选择项】节点dom元素
2143
+ * @param item 【选择项】
2144
+ * @param parent 父节点
1979
2145
  */
1980
- text?: string;
2146
+ enter: [el: HTMLDivElement, item: SelectItem<T>, parent?: SelectItem<T>];
1981
2147
  /**
1982
- * 选项值
2148
+ * 点击事件
2149
+ * @param item 【选择项】
2150
+ * @param parent 父节点
1983
2151
  */
1984
- value: T;
2152
+ click: [item: SelectItem<T>, parent?: SelectItem<T>];
2153
+ };
2154
+
2155
+ /**
2156
+ * 基础事件实体
2157
+ * 1、把一些常用事件,封装为原子结构,方便复用
2158
+ * 2、不强制必须复用,根据自身情况
2159
+ */
2160
+ /**
2161
+ * 事件:点击
2162
+ */
2163
+ type ClickEvents = {
1985
2164
  /**
1986
- * 选项描述信息,一般作为解释使用
2165
+ * 单击事件
2166
+ * @param evt 事件对象
1987
2167
  */
1988
- description?: string;
2168
+ click: [evt?: MouseEvent | TouchEvent | PointerEvent];
1989
2169
  };
1990
2170
  /**
1991
- * 选择 组件事件
2171
+ * 事件:值改变
2172
+ * - 描述值的改变过程,新值是什么,改变前的旧值是什么
1992
2173
  */
1993
- type ChooseEvents<T> = {
2174
+ type ChangeEvents<T> = {
1994
2175
  /**
1995
- * 值改变 事件
1996
- * - values 为当前选中值;单选时为单个值,多选时为值数组
2176
+ * 值改变;约束新旧值
2177
+ * @param newValue 新值
2178
+ * @param oldValue 旧值
1997
2179
  */
1998
- change: [values: T | T[]];
2180
+ change: [newValue: T, oldValue?: T];
1999
2181
  };
2000
-
2001
2182
  /**
2002
- * 按钮配置选项
2183
+ * 事件:移动
2184
+ * - 可描述数据索引位置变化
2185
+ * - 可用于数组元素拖动排序,调整位置等逻辑
2003
2186
  */
2004
- type ButtonOptions = TitleOptions & {
2187
+ type MoveEvents = {
2005
2188
  /**
2006
- * 按钮尺寸
2007
- * - max : 120 X 40
2008
- * - middle : 90 X 32
2009
- * - normal : 54 X 28
2010
- * - small : 30 X 20
2189
+ * 移动事件
2190
+ * @param fromIndex 从哪个索引位置开始移动
2191
+ * @param toIndex 移动到的索引位置
2011
2192
  */
2012
- size: "max" | "middle" | "normal" | "small";
2193
+ move: [fromIndex: number, toIndex: number];
2194
+ };
2195
+ /**
2196
+ * 事件:删除数据
2197
+ * - 描述要删除的具体数据
2198
+ */
2199
+ type DeleteEvents<T> = {
2013
2200
  /**
2014
- * 按钮类型
2015
- * - primary: 主按钮:蓝色背景
2016
- * - default: 默认按钮:白色背景
2017
- * - link :链接式按钮:蓝色字体颜色,无边框
2201
+ * 删除事件
2202
+ * @param value 要删除的数据
2018
2203
  */
2019
- type: "primary" | "default" | "link";
2204
+ delete: [value?: T];
2205
+ };
2206
+ /**
2207
+ * 事件:关闭
2208
+ */
2209
+ type CloseEvents = {
2210
+ /**
2211
+ * 关闭事件
2212
+ */
2213
+ close: [];
2020
2214
  };
2021
2215
 
2022
2216
  /**
2023
- * 公共通用数据结构:
2024
- * 1、在弹窗、模态弹窗、跟随弹窗的效果下复用
2217
+ * 数值控件的数据结构
2025
2218
  */
2026
2219
 
2027
2220
  /**
2028
- * 弹窗配置选项
2029
- * - 约束弹出组件信息
2030
- * - 弹出组件时传递的参数信息
2031
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2221
+ * 数值组件的基础配置选项
2032
2222
  */
2033
- type PopupOptions<Props = void, Model = void> = ComponentOptions & ComponentBindOptions<Props, Model> & {
2223
+ type NumberBaseOptions = {
2034
2224
  /**
2035
- * 弹窗动画名
2036
- * - 不传则默认“fade”
2037
- * - 动画规则:打开弹窗时,为 [transition]-in ;关闭弹窗时,为[transition]-out
2038
- * - - 传入 "scale",则打开弹窗为 "scale-in";关闭弹窗时为 "scale-out"
2225
+ * 最小值
2039
2226
  */
2040
- transition?: string;
2227
+ minValue?: number;
2041
2228
  /**
2042
- * 动画持续时间
2043
- * - 配合 transition 使用;单位ms,默认500ms
2044
- * - 外部传入自定义动画时,传入动画持续时间,否则可能导致关闭时动画失效
2229
+ * 最大值
2045
2230
  */
2046
- transitionDuration?: number;
2231
+ maxValue?: number;
2047
2232
  /**
2048
- * 自定义class
2049
- * - 绑定到内容组件根元素上
2050
- * - 可以直接在props中指定,无需特殊设置
2051
- class?: string | string[];
2233
+ * 值超过阈值(最大值、最小值)时的处理模式
2234
+ * - 默认值为 `keep`;可选取值范围:
2235
+ * - - `keep` 保持原样值显示,不做任何处理
2236
+ * - - `clamp` 截断超出阈值值,低于最小值时直接取最小值,超过最大值时,强制值为最大值
2237
+ * - 值超过阈值时,会自动触发事件,事件名`NumberEvents`的`belowMin`和`exceedMax`
2052
2238
  */
2239
+ clamp?: "keep" | "clamp";
2053
2240
  /**
2054
- * 自定义style
2055
- * - 绑定到内容组件根元素上
2056
- * - 可以直接在props中指定,无需特殊设置
2057
- style?: AllStyle;
2241
+ * 精度,保留几位小数
2242
+ * - 要求0、正整数,输入小数则强制整数
2243
+ * - 负数、不传入则不处理
2058
2244
  */
2245
+ precision?: number;
2059
2246
  /**
2060
- * 弹窗的z-index值
2061
- * - 无特殊情况,建议不指定,内部会自动生成,确保弹窗正确性
2247
+ * 对数值进行千分位格式处理
2248
+ * - 默认值为 `disabled`;可选值范围:
2249
+ * - `disabled` 禁用千分位功能
2250
+ * - `inline` 内联千分位功能
2251
+ * - `below` 下拉千分位功能
2062
2252
  */
2063
- zIndex?: number;
2064
- };
2065
- /**
2066
- * 弹出组件句柄
2067
- */
2068
- type PopupHandle<T> = {
2253
+ thousands?: "disabled" | "inline" | "below";
2069
2254
  /**
2070
- * 组件是否在【弹出窗口】中
2071
- * - popup : 普通弹出弹窗
2072
- * - dialog : 模态对话弹窗
2073
- * - follow : 跟随效果弹窗
2255
+ * 是否启用数值大写格式化处理
2256
+ * - 为true时,转成中文大写值
2257
+ * - 单位自动为“元”,不支持美元等
2258
+ * - 如金额时,自动转为壹仟壹佰壹拾壹元叁角叁分
2259
+ * - 小数点后面只处理两位(角分);剩余不处理
2260
+ */
2261
+ upper?: boolean;
2262
+ /**
2263
+ * 格式化时的放大系数
2264
+ * - 用于在格式化千分位、大写时,对实际值进行系数放大,value*formatMultiplier
2265
+ * - 仅接收正整数,取值规则为10^n,默认1
2266
+ * - 千分位格式化时,仅`thousands`为`below`时才进行放到系数处理
2267
+ * - 使用示例例:金额是为万元单位时,这里的放大系数就为 “10000”
2268
+ */
2269
+ formatMultiplier?: number;
2270
+ /**
2271
+ * 前缀字符串
2272
+ * - 如金额时,可配置前缀 ¥
2273
+ */
2274
+ prefix?: string;
2275
+ /**
2276
+ * 后缀字符串
2277
+ * - 如金额时,可配置后缀 元/美元、、
2278
+ */
2279
+ suffix?: string;
2280
+ /**
2281
+ * 数值控制器
2282
+ * - 便捷加减调整数值的控制按钮
2283
+ * - 默认值`disabled`;可选值范围:
2284
+ * - - `disabled` 时禁用
2285
+ * - - `default` 默认模式,左侧 — 右侧 +
2286
+ * - - `right` 右侧模式,+ - 都在右侧
2074
2287
  */
2075
- inPopup: Readonly<"popup" | "dialog" | "follow">;
2288
+ controls?: "disabled" | "default" | "right";
2076
2289
  /**
2077
- * 关闭弹窗
2078
- * @param data 关闭时传递数据
2290
+ * 数值步长值
2291
+ * - `controls` 未禁用时生效
2292
+ * - 每次+、- 的步长值
2079
2293
  */
2080
- closePopup(data?: T): void;
2294
+ step?: number;
2081
2295
  };
2082
2296
  /**
2083
- * 弹窗状态:响应式
2084
- * - open 打开
2085
- * - active 激活,针对Dialog弹窗生效
2086
- * - unactive 非激活,针对Dialog弹窗生效
2087
- * - closed 关闭
2088
- */
2089
- type PopupStatus = ShallowRef<"open" | "active" | "unactive" | "closed">;
2090
- /**
2091
- * 弹窗状态 配置选项
2297
+ * 数值组件的配置选项
2092
2298
  */
2093
- type PopupStatusOptions = {
2094
- /**
2095
- * 弹窗状态:响应式
2096
- */
2097
- popupStatus: PopupStatus;
2098
- };
2299
+ type NumberOptions = PlaceholderOptions & ReadonlyOptions & NumberBaseOptions;
2099
2300
  /**
2100
- * 弹窗对象描述器
2101
- * - 给弹窗容器使用,传递过去作为props使用
2301
+ * 接口:数值格式化器
2102
2302
  */
2103
- type PopupDescriptor<Options extends PopupOptions, ExtOptions> = PopupStatusOptions & {
2303
+ interface INumberFormatter extends Required<Readonly<Pick<NumberBaseOptions, "minValue" | "maxValue" | "precision" | "thousands" | "upper">>> {
2104
2304
  /**
2105
- * 弹窗Id
2106
- * - 自动分配,全局唯一
2305
+ * 格式化输入文本
2306
+ * @param text 输入文本
2307
+ * @param isEnd 是否是输入结束,true时,已经输入结束将进行数值精度处理
2308
+ * @returns 数值格式化结果
2107
2309
  */
2108
- popupId: string;
2310
+ format(text: string, isEnd: boolean): NumberFormatResult;
2109
2311
  /**
2110
- * 弹窗配置选项
2111
- * - 由外部传递过来的业务数据配置信息
2112
- * - 约束具体弹窗的业务组件和业务组件所需props等数据
2312
+ * 进行阈值检测,检测是否超过设定的最大值、最小值
2313
+ * @param number 要检测的数值
2314
+ * @returns 检测结果,`number` 新的值,`belowMin`是否低于最小值,`exceedMax`是否超过最大值
2113
2315
  */
2114
- options: Options;
2316
+ checkThreshold(number: any): {
2317
+ number: number;
2318
+ belowMin: boolean;
2319
+ exceedMax: boolean;
2320
+ };
2115
2321
  /**
2116
- * 弹窗扩展配置选项
2117
- * - 由 popup、follow等方法内部组件:如关闭弹窗方法、钩子函数等
2118
- * - 配合业务组件使用的一些配置数据
2322
+ * 对数值文本转大写
2323
+ * @param result
2324
+ * @returns 大写文本值
2119
2325
  */
2120
- extOptions: ExtOptions;
2326
+ buildUpper(result: NumberFormatResult): string;
2121
2327
  /**
2122
- * 实际分配的zIndex值
2328
+ * 对数值文本进行千分位格式化
2329
+ * @param result
2330
+ * @returns 格式化后的文本值
2123
2331
  */
2124
- zIndex: number;
2332
+ buildThousands(result: NumberFormatResult): string;
2125
2333
  /**
2126
- * 弹窗动画名
2127
- * - 约束打开、关闭动画;基于 PopupOptions.transition 构建出来的
2128
- * - 具体使用方,将此值绑定的根元素上
2334
+ * 基于步长计算值
2335
+ * @param number 要重新计算的数值
2336
+ * @param isPlus true为+,false为-
2337
+ * @returns 新的数值
2129
2338
  */
2130
- popupTransition: ShallowRef<string>;
2131
- };
2132
-
2133
- /**
2134
- * 跟随效果 弹窗
2135
- */
2136
-
2137
- /**
2138
- * 跟随弹窗 配置选项
2139
- * - 传入的组件,根据配置跟随 target 位置和大小;
2140
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2141
- */
2142
- type FollowOptions<Props = void, Model = void> = PopupOptions<Props, Model> & FollowPositionOptions;
2339
+ calcByStep(number: number, isPlus: boolean): number;
2340
+ }
2143
2341
  /**
2144
- * 跟随位置 配置选项
2145
- * - 基于此计算出最终的跟随效果
2342
+ * 数值格式化结果
2146
2343
  */
2147
- type FollowPositionOptions = {
2148
- /**
2149
- * 启用【宽度】跟随
2150
- * - 为true则和 target 宽度保持一致
2151
- * - false时,宽度由 弹出组件 自己维护
2152
- * - 不管是true、还是false,若宽度超过浏览器最大宽度,会进行强制干预
2153
- */
2154
- followWidth?: boolean;
2344
+ type NumberFormatResult = {
2155
2345
  /**
2156
- * 启用【高度】跟随
2157
- * - 为true则和 target 高度保持一致
2158
- * - false时,高度由 弹出组件 自己维护
2159
- * - 不管是true、还是false,若高度超过浏览器最大高度,会进行强制干预
2346
+ * 输入是否是有效输入
2347
+ * - `- 0 1 2 3 4 5 6 7 8 9 0 .`算是合法输入
2160
2348
  */
2161
- followHeight?: boolean;
2349
+ readonly valid: boolean;
2162
2350
  /**
2163
- * x轴方向上的跟随策略
2164
- * - 支持传入一个或者多个,依次尝试选举最优位置(全宽度展示,否则取最大宽度位置)
2165
- * - 不传入则按照默认策略;["start","end","after","before","center","ratio"]
2166
- * - 可选策略值如下:
2167
- * - - start : 起点跟随,和 target 起始位置(left)一致
2168
- * - - end : 终点跟随,和 target 结束位置(right)一致
2169
- * - - center : 中心跟随,和 target 中心位置一致
2170
- * - - before : 之前跟随,组件在 target 左侧展示
2171
- * - - after : 之后跟随,组件在 target 右侧展示
2172
- * - - ratio : 比例跟随,按比例(target中心点/窗口宽度)锚定位置,动态计算left值。
2351
+ * 有效的数值
2352
+ * - undefined时,输入无法转换成有效的数值
2173
2353
  */
2174
- followX?: FollowStrategy | FollowStrategy[];
2354
+ readonly number: number | undefined;
2175
2355
  /**
2176
- * y轴方向上的跟随策略
2177
- * - 支持传入一个或者多个,依次尝试选举最优位置(全高度展示,否则取最大高度位置)
2178
- * - 不传入则按照默认策略;["after","before","start","end","center","ratio"]
2179
- * - 可选策略值如下:
2180
- * - - start : 起点跟随,和 target 起始位置(top)一致
2181
- * - - end : 终点跟随,和 target 结束位置(bottom)一致
2182
- * - - center : 中心跟随,和 target 中心位置一致
2183
- * - - before : 之前跟随,组件在 target 顶部展示
2184
- * - - after : 之后跟随,组件在 target 底部展示
2185
- * - - ratio : 比例跟随,按比例(target中心点/窗口高度)锚定位置,动态计算top值。
2356
+ * 数值的显示文本
2357
+ * - 无千分位等处理的数值显示文本
2358
+ * - 若需要在行内显示 千分位 格式文本,需要单独处理
2186
2359
  */
2187
- followY?: FollowStrategy | FollowStrategy[];
2360
+ readonly text: string;
2188
2361
  /**
2189
- * x轴方向上 target 之间的留白空间
2190
- * - 默认0; followX 为 center、ratio 时间距失效
2191
- * - 增加间距,提升展示效果
2192
- * -
2362
+ * 格式化数值时发生的错误
2363
+ * - 输入数值有效,但是格式化时发生错误了
2193
2364
  */
2194
- spaceX?: number;
2365
+ readonly error?: string;
2195
2366
  /**
2196
- * y轴方向上 target 之间的留白空间
2197
- * - 默认0;followY 为 center、ratio 时间距失效
2198
- * - 增加间距,提升展示效果
2367
+ * 是否是负数
2368
+ * - true 时说明以`-`开始;false时为正数
2369
+ * - 若为true,但`integerPart`为undefined,则说明仅输入了`-`
2199
2370
  */
2200
- spaceY?: number;
2371
+ readonly isNegative?: boolean;
2201
2372
  /**
2202
- * 和 浏览器客户 端之间的留白空间
2203
- * - 弹出组件 和浏览器客户端窗口之间的【留白空间】
2204
- * - 仅在 弹出组件 计算出来位置紧贴浏览器窗口时生效
2205
- * - 若强制指定了 start、end,则对应的起始、结束位置不受此值影响
2373
+ * 是否是小数
2374
+ * - true 时说明有小数点“.”;false 时为整数
2375
+ * - 若为true,但`decimalPart`为undefined,则说明是以`.`结尾,还没输入具体的小数部分
2206
2376
  */
2207
- spaceClient?: number;
2377
+ readonly isDecimal?: boolean;
2208
2378
  /**
2209
- * 点击【遮罩层】时是否关闭弹窗
2210
- * - 则点击非【跟随组件】区域时是否关闭
2379
+ * 数值输入的整数部分
2380
+ * - 取整数部分绝对值,如-1.2,仅为1
2211
2381
  */
2212
- closeOnMask?: boolean;
2382
+ readonly integerPart?: string;
2213
2383
  /**
2214
- * 按下【ESC】健时是否关闭弹窗
2384
+ * 小数部分
2215
2385
  */
2216
- closeOnEscape?: boolean;
2386
+ readonly decimalPart?: string;
2217
2387
  /**
2218
- * window窗口【resize】时是否关闭弹窗
2388
+ * 进行系数放大后的整数部分
2219
2389
  */
2220
- closeOnResize?: boolean;
2390
+ readonly integerPartAfterMultiplier?: string;
2221
2391
  /**
2222
- * target改变时是否关闭弹窗
2223
- * - target尺寸、位置变化
2224
- * - target点击时
2392
+ * 进行系数放大后的小数部分
2225
2393
  */
2226
- closeOnTarget?: boolean;
2394
+ readonly decimalPartAfterMultiplier?: string;
2227
2395
  };
2228
2396
  /**
2229
- * 跟随策略
2230
- * - 详细值定义,参照 FollowOptions.followX 和 FollowOptions.followY
2397
+ * 数值组件的事件选项
2231
2398
  */
2232
- type FollowStrategy = "start" | "center" | "end" | "before" | "after" | "ratio";
2399
+ type NumberEvents = ChangeEvents<number> & {
2400
+ /**
2401
+ * 数值发生错误时
2402
+ * - 若超过最大的精度范围
2403
+ * - 其他未知异常等
2404
+ * @param reason 错误原因
2405
+ */
2406
+ error: [reason: string];
2407
+ /**
2408
+ * 小于最小值
2409
+ * @param value 当前值
2410
+ * @param minValue 最小值
2411
+ */
2412
+ belowMin: [value: number, minValue: number];
2413
+ /**
2414
+ * 超过最大值
2415
+ * @param value 当前值
2416
+ * @param maxValue 最大值
2417
+ */
2418
+ exceedMax: [value: number, maxValue: number];
2419
+ };
2420
+
2233
2421
  /**
2234
- * 跟随弹窗 句柄
2235
- * - 用于在 弹窗组件 内部进行模式判断和关闭跟随弹窗
2422
+ * 检查选项 数据结构
2236
2423
  */
2237
- type FollowHandle<T> = PopupHandle<T> & {};
2424
+
2238
2425
  /**
2239
- * 跟随弹窗 扩展配置
2426
+ * 选择 组件配置选项
2240
2427
  */
2241
- type FollowExtend = PopupStatusOptions & {
2428
+ type ChooseOptions<T> = ReadonlyOptions & {
2242
2429
  /**
2243
- * 跟随的目标元素
2430
+ * 是否为多选模式
2431
+ * - true 多选模式,可以选中items中多个选项
2432
+ * - false 单选模式,只能选中items中的一个选项
2244
2433
  */
2245
- target: Element;
2434
+ multi?: boolean;
2246
2435
  /**
2247
- * x轴方向的跟随策略:响应式
2248
- * - 基于外部传入的跟随策略,计算选举出来的最优策略值
2436
+ * 选项类型
2437
+ * - radio: 单选框样式
2438
+ * - checkbox: 多选框样式
2249
2439
  */
2250
- followX: ShallowRef<FollowStrategy>;
2440
+ type: "radio" | "checkbox";
2251
2441
  /**
2252
- * y轴方向的跟随策略:响应式
2253
- * - 基于外部传入的跟随策略,计算选举出来的最优策略值
2442
+ * 显示模式
2443
+ * - native 原生默认,浏览器自己渲染;不同浏览器效果不一致
2444
+ * - beautiful 美化模式,不同浏览器下效果通义
2254
2445
  */
2255
- followY: ShallowRef<FollowStrategy>;
2446
+ mode?: "native" | "beautiful";
2256
2447
  /**
2257
- * Follow弹窗是否【钉住】了
2258
- * - 为true时,closeOnMask、closeOnEscape失效
2259
- * - 满足 子弹窗 点击等操作时,不自动销毁父级弹窗
2448
+ * 选项布局
2449
+ * - 默认值:horizontal
2450
+ * - 可选值:
2451
+ * - - horizontal 水平布局;所有选项一行
2452
+ * - - vertical 垂直布局;每个选项一行
2453
+ */
2454
+ layout?: "horizontal" | "vertical";
2455
+ /**
2456
+ * 待选项目
2457
+ * text 可不传入
2458
+ */
2459
+ items: ChooseItem<T>[];
2460
+ /**
2461
+ * 选项自定义样式
2462
+ * - 可指定选项宽度、高度、外边距
2260
2463
  */
2261
- pinned: ShallowRef<boolean>;
2464
+ itemStyle?: WidthStyle & HeightStyle & MarginStyle;
2262
2465
  };
2263
2466
  /**
2264
- * 跟随策略 配置选项
2467
+ * 选择项
2265
2468
  */
2266
- type FollowStrategyOptions = {
2469
+ type ChooseItem<T> = {
2267
2470
  /**
2268
- * x轴的跟随策略
2471
+ * 选项文本
2269
2472
  */
2270
- followX?: FollowStrategy;
2473
+ text?: string;
2271
2474
  /**
2272
- * x轴的跟随策略
2475
+ * 选项值
2273
2476
  */
2274
- followY?: FollowStrategy;
2477
+ value: T;
2478
+ /**
2479
+ * 选项描述信息,一般作为解释使用
2480
+ */
2481
+ description?: string;
2275
2482
  };
2276
2483
  /**
2277
- * 跟随选举结果
2484
+ * 选择 组件事件
2278
2485
  */
2279
- type FollowElectResult = {
2486
+ type ChooseEvents<T> = {
2280
2487
  /**
2281
- * 跟随策略
2488
+ * 值改变 事件
2489
+ * - values 为当前选中值;单选时为单个值,多选时为值数组
2282
2490
  */
2283
- strategy: FollowStrategy;
2491
+ change: [values: T | T[]];
2492
+ };
2493
+
2494
+ /**
2495
+ * 按钮配置选项
2496
+ */
2497
+ type ButtonOptions = TitleOptions & {
2284
2498
  /**
2285
- * 开始位置:x/top
2499
+ * 按钮尺寸
2500
+ * - max : 120 X 40
2501
+ * - middle : 90 X 32
2502
+ * - normal : 54 X 28
2503
+ * - small : 30 X 20
2286
2504
  */
2287
- start: number;
2505
+ size: "max" | "middle" | "normal" | "small";
2288
2506
  /**
2289
- * 调整后的尺寸(width/height)
2290
- * - 为undefined表示无需调整尺寸
2507
+ * 按钮类型
2508
+ * - primary: 主按钮:蓝色背景
2509
+ * - default: 默认按钮:白色背景
2510
+ * - link :链接式按钮:蓝色字体颜色,无边框
2291
2511
  */
2292
- size?: number;
2512
+ type: "primary" | "default" | "link";
2293
2513
  };
2294
2514
 
2295
2515
  /**
@@ -2673,202 +2893,12 @@ declare const MOTION: Readonly<{
2673
2893
  };
2674
2894
  }>;
2675
2895
 
2676
- /**
2677
- * 模态弹窗数据结构
2678
- */
2679
-
2680
- /**
2681
- * 模态弹窗 配置选项
2682
- * - 继承 ComponentOptions ,动态加载组件
2683
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2684
- */
2685
- type DialogOptions<Props = void, Model = void> = PopupOptions<Props, Model> & {
2686
- /**
2687
- * 包裹器配置
2688
- * - 若传入配置,则启用弹窗包裹;弹窗打开时使用`Wrapper`包裹弹窗内容组件
2689
- */
2690
- wrapper?: Pick<WrapperOptions, "header" | "content" | "footer">;
2691
- /**
2692
- * 禁用【遮罩层】
2693
- * - 目前没实现,先忽略
2694
- maskDisabled?: boolean;
2695
- */
2696
- /**
2697
- * 点击【遮罩层】时是否关闭弹窗
2698
- * - 针对无遮罩层的弹窗,则点击非【弹窗组件】区域时是否关闭
2699
- */
2700
- closeOnMask?: boolean;
2701
- /**
2702
- * 按下【ESC】健时是否关闭弹窗
2703
- */
2704
- closeOnEscape?: boolean;
2705
- /**
2706
- * 模态弹窗的自定义class
2707
- * - 绑定到模态弹窗的根元素上
2708
- */
2709
- rootClass?: string | string[];
2710
- };
2711
- /**
2712
- * 弹窗组件句柄
2713
- * - 用于在弹窗内容组件中进行模式判断和关闭
2714
- */
2715
- type DialogHandle<T> = PopupHandle<T> & {
2716
- /**
2717
- * 注册监听【弹窗关闭】事件方法
2718
- * - 仅支持注册一次,多次注册以最后一次的为准
2719
- * @param fn 关闭时执行的钩子函数,支持异步;;调用后若返回false时将阻止弹窗关闭
2720
- */
2721
- onBeforeClose(fn: (data?: T) => false | undefined | Promise<false | undefined>): void;
2722
- };
2723
- /**
2724
- * 弹窗包裹器操作句柄
2725
- */
2726
- type DialogWrapperHandle<T> = {
2727
- /**
2728
- * 注册【构建数据】事件方法
2729
- * - 仅在Dialog为使用了wrapper模式时生效,用于在【确认】按钮点击时,构建实际内容组件中的数据
2730
- * - 仅支持注册一次,多次注册以最后一次的为准
2731
- * @param fn 取数据时执行的钩子函数,支持异步;若需要阻止弹窗关闭则`fn`方法直接报错即可
2732
- */
2733
- onBuildData(fn: () => T | Promise<T>): void;
2734
- };
2735
-
2736
- /**
2737
- * 确认弹窗配置选项
2738
- * - title 弹窗标题,默认“提示”
2739
- * - message 确认提示信息;默认“请确认?”;支持html格式内容
2740
- */
2741
- type ConfirmOptions = TitleOptions & MessageOptions & ConfirmAreaOptions & {};
2742
-
2743
- /**
2744
- * Toast配置选项
2745
- */
2746
- type ToastOptions = {
2747
- /**
2748
- * 提示类型,基于类型展示图标
2749
- */
2750
- type?: IconType;
2751
- /**
2752
- * 提示消息;支持html格式
2753
- */
2754
- message: string;
2755
- /**
2756
- * 提示显示时间
2757
- * - 单位毫秒,默认1500ms
2758
- */
2759
- duration?: number;
2760
- /**
2761
- * 关闭按钮是否禁用
2762
- */
2763
- closeDisabled?: boolean;
2764
- };
2765
-
2766
- /**
2767
- * 弹窗管理器
2768
- */
2769
- interface IPopupManager {
2770
- /**
2771
- * 弹出
2772
- * - 弹窗位置位置、大小、动画效果等由组件自己完成
2773
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2774
- * @param options 弹窗配置选项
2775
- * @returns 弹窗打开结果,外部可手动关闭弹窗
2776
- */
2777
- popup<T, Props = void, Model = void>(options: PopupOptions<Props, Model>): IAsyncScope<T>;
2778
- /**
2779
- * 对话框
2780
- * - 支持指定模态和非模态对话框
2781
- * - 默认垂直水平居中展示
2782
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2783
- * @param options 弹窗配置选项
2784
- * @returns 弹窗打开结果,外部可手动关闭弹窗
2785
- */
2786
- dialog<T, Props = void, Model = void>(options: DialogOptions<Props, Model>): IAsyncScope<T>;
2787
- /**
2788
- * 跟随弹窗
2789
- * - 跟随指定的target对象,可跟随位置、大小
2790
- * @see ComponentBindOptions 了解 Props、Model 泛型参数的含义
2791
- * @param target 跟随的目标元素
2792
- * @param options 跟随配置选项
2793
- * @returns 弹窗异步作用域,外部可手动关闭弹窗
2794
- */
2795
- follow<T, Props = void, Model = void>(target: HTMLElement, options: FollowOptions<Props, Model>): IAsyncScope<T>;
2796
- /**
2797
- * 打开【确认】弹窗
2798
- * @param title 弹窗标题
2799
- * @param message 确认提示信息,支持html片段
2800
- * @param options 确认弹窗其他配置信息
2801
- * @returns 弹窗打开结果,外部可手动关闭弹窗
2802
- */
2803
- confirm(title: string, message: string, options?: Omit<ConfirmOptions, "title" | "message">): IAsyncScope<boolean>;
2804
- /**
2805
- * Toast 提示框
2806
- * @param type 提示类型:成功、失败、、、
2807
- * @param message 提示消息
2808
- * @param options 提示框配置选项
2809
- * @returns 弹窗打开结果,外部可手动关闭弹窗
2810
- */
2811
- toast(type: IconType, message: string, options?: Omit<ToastOptions, "type" | "message">): IScope;
2812
- }
2813
-
2814
- /**
2815
- * 选择器 相关数据实体
2816
- */
2817
-
2818
- /**
2819
- * 接口:选择器管理器
2820
- */
2821
- interface IPickerManager {
2822
- /**
2823
- * 显示【日期】选择器
2824
- * @param target 哪个元素触发,基于此元素计算位置
2825
- * @param options 日期选择器配置选项
2826
- * @param popupOptions 弹窗配置选项;内部根据情况选择属性使用
2827
- * @returns 异步任务,可销毁日期选择器;可接收日期选择器的选择值
2828
- */
2829
- showDate(target: HTMLElement, options?: DatePickerOptions, popupOptions?: PickerPopupOptions): IAsyncScope<string>;
2830
- /**
2831
- * 显示【时间】选择控件
2832
- * @param target 哪个元素触发,基于此元素计算位置
2833
- * @param options 时间选择控件配置选项
2834
- * @param popupOptions 弹窗配置选项;内部根据情况选择属性使用
2835
- * @returns 异步任务,可销毁时间选择控件;可接收时间选择控件的选择值
2836
- */
2837
- showTime(target: HTMLElement, options?: TimePickerOptions, popupOptions?: PickerPopupOptions): IAsyncScope<string>;
2838
- }
2839
- /**
2840
- * 选择器弹窗配置选项
2841
- * - 放开一些属性,方便用户做一些自定义
2842
- */
2843
- type PickerPopupOptions = FollowPositionOptions;
2844
- /**
2845
- * 选择器扩展
2846
- */
2847
- type PickerExtend = {
2848
- /**
2849
- * 弹窗管理器
2850
- * - 方便下级再弹窗,公用一个管理器,方便生命周期管理
2851
- */
2852
- popup: IPopupManager;
2853
- /**
2854
- * 选择器对象,方便内部在弹出选择
2855
- * - 如日期选择器中,在选择时间
2856
- */
2857
- picker: IPickerManager;
2858
- };
2859
-
2860
2896
  /**
2861
2897
  * 使用选择器
2862
2898
  * @returns 选择器实例+作用域对象
2863
2899
  */
2864
2900
  declare function usePicker(): IPickerManager & IScope;
2865
2901
 
2866
- /**
2867
- * 使用【弹窗管理器】
2868
- * @returns 全新的【弹窗管理器】实例+作用域对象
2869
- */
2870
- declare function usePopup(): IPopupManager & IScope;
2871
-
2872
2902
  declare const components: {
2873
2903
  Action: {
2874
2904
  new (...args: any[]): vue.CreateComponentPublicInstanceWithMixins<Readonly<ActionOptions> & Readonly<{
@@ -2906,18 +2936,28 @@ declare const components: {
2906
2936
  };
2907
2937
  });
2908
2938
  Button: {
2909
- new (...args: any[]): vue.CreateComponentPublicInstanceWithMixins<Readonly<ButtonOptions> & Readonly<{}>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, vue.PublicProps, {}, false, {}, {}, vue.GlobalComponents, vue.GlobalDirectives, string, {}, any, vue.ComponentProvideOptions, {
2939
+ new (...args: any[]): vue.CreateComponentPublicInstanceWithMixins<Readonly<ButtonOptions> & Readonly<{
2940
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2941
+ }>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
2942
+ click: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2943
+ }, vue.PublicProps, {}, false, {}, {}, vue.GlobalComponents, vue.GlobalDirectives, string, {}, any, vue.ComponentProvideOptions, {
2910
2944
  P: {};
2911
2945
  B: {};
2912
2946
  D: {};
2913
2947
  C: {};
2914
2948
  M: {};
2915
2949
  Defaults: {};
2916
- }, Readonly<ButtonOptions> & Readonly<{}>, {}, {}, {}, {}, {}>;
2950
+ }, Readonly<ButtonOptions> & Readonly<{
2951
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2952
+ }>, {}, {}, {}, {}, {}>;
2917
2953
  __isFragment?: never;
2918
2954
  __isTeleport?: never;
2919
2955
  __isSuspense?: never;
2920
- } & vue.ComponentOptionsBase<Readonly<ButtonOptions> & Readonly<{}>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, {}, {}, string, {}, vue.GlobalComponents, vue.GlobalDirectives, string, vue.ComponentProvideOptions> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new () => {
2956
+ } & vue.ComponentOptionsBase<Readonly<ButtonOptions> & Readonly<{
2957
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2958
+ }>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
2959
+ click: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
2960
+ }, string, {}, {}, string, {}, vue.GlobalComponents, vue.GlobalDirectives, string, vue.ComponentProvideOptions> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new () => {
2921
2961
  $slots: {
2922
2962
  default?: (props: {}) => any;
2923
2963
  };
@@ -3007,18 +3047,28 @@ declare const components: {
3007
3047
  };
3008
3048
  });
3009
3049
  Icon: {
3010
- new (...args: any[]): vue.CreateComponentPublicInstanceWithMixins<Readonly<IconOptions> & Readonly<{}>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, vue.PublicProps, {}, true, {}, {}, vue.GlobalComponents, vue.GlobalDirectives, string, {}, any, vue.ComponentProvideOptions, {
3050
+ new (...args: any[]): vue.CreateComponentPublicInstanceWithMixins<Readonly<IconOptions> & Readonly<{
3051
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3052
+ }>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3053
+ click: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3054
+ }, vue.PublicProps, {}, true, {}, {}, vue.GlobalComponents, vue.GlobalDirectives, string, {}, any, vue.ComponentProvideOptions, {
3011
3055
  P: {};
3012
3056
  B: {};
3013
3057
  D: {};
3014
3058
  C: {};
3015
3059
  M: {};
3016
3060
  Defaults: {};
3017
- }, Readonly<IconOptions> & Readonly<{}>, {}, {}, {}, {}, {}>;
3061
+ }, Readonly<IconOptions> & Readonly<{
3062
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3063
+ }>, {}, {}, {}, {}, {}>;
3018
3064
  __isFragment?: never;
3019
3065
  __isTeleport?: never;
3020
3066
  __isSuspense?: never;
3021
- } & vue.ComponentOptionsBase<Readonly<IconOptions> & Readonly<{}>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, {}, {}, string, {}, vue.GlobalComponents, vue.GlobalDirectives, string, vue.ComponentProvideOptions> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new () => {
3067
+ } & vue.ComponentOptionsBase<Readonly<IconOptions> & Readonly<{
3068
+ onClick?: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3069
+ }>, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3070
+ click: (evt?: MouseEvent | TouchEvent | PointerEvent) => any;
3071
+ }, string, {}, {}, string, {}, vue.GlobalComponents, vue.GlobalDirectives, string, vue.ComponentProvideOptions> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new () => {
3022
3072
  $slots: {
3023
3073
  default?: (props: {}) => any;
3024
3074
  };
@@ -3030,8 +3080,8 @@ declare const components: {
3030
3080
  } & {
3031
3081
  modelValue?: string;
3032
3082
  }, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3033
- change: (value: string) => any;
3034
3083
  click: () => any;
3084
+ change: (value: string) => any;
3035
3085
  "update:modelValue": (value: string) => any;
3036
3086
  }, string, vue.PublicProps, Readonly<ReadonlyOptions & PlaceholderOptions & TitleOptions & {
3037
3087
  type?: "text" | "number" | "password";
@@ -3040,8 +3090,8 @@ declare const components: {
3040
3090
  } & {
3041
3091
  modelValue?: string;
3042
3092
  }> & Readonly<{
3043
- onChange?: (value: string) => any;
3044
3093
  onClick?: () => any;
3094
+ onChange?: (value: string) => any;
3045
3095
  "onUpdate:modelValue"?: (value: string) => any;
3046
3096
  }>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
3047
3097
  Number: vue.DefineComponent<PlaceholderOptions & ReadonlyOptions & NumberBaseOptions & {
@@ -3650,35 +3700,47 @@ declare const components: {
3650
3700
  DatePicker: vue.DefineComponent<ReadonlyOptions & {
3651
3701
  value?: string;
3652
3702
  format?: snail_core.DateFormat;
3703
+ mode?: "default" | "simple";
3653
3704
  min?: string;
3654
3705
  max?: string;
3655
3706
  minPickTime?: string;
3656
3707
  maxPickTime?: string;
3657
- } & DatetimeDisabledOptions, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3708
+ } & DatetimeDisabledOptions & {
3709
+ popup?: PickerPopupOptions;
3710
+ }, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3658
3711
  change: (newValue: string, oldValue?: string) => any;
3659
3712
  }, string, vue.PublicProps, Readonly<ReadonlyOptions & {
3660
3713
  value?: string;
3661
3714
  format?: snail_core.DateFormat;
3715
+ mode?: "default" | "simple";
3662
3716
  min?: string;
3663
3717
  max?: string;
3664
3718
  minPickTime?: string;
3665
3719
  maxPickTime?: string;
3666
- } & DatetimeDisabledOptions> & Readonly<{
3720
+ } & DatetimeDisabledOptions & {
3721
+ popup?: PickerPopupOptions;
3722
+ }> & Readonly<{
3667
3723
  onChange?: (newValue: string, oldValue?: string) => any;
3668
3724
  }>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
3669
3725
  TimePicker: vue.DefineComponent<ReadonlyOptions & {
3670
3726
  value?: string;
3671
3727
  format?: "HH:mm:ss" | "HH:mm";
3728
+ mode?: "default" | "simple";
3672
3729
  min?: string;
3673
3730
  max?: string;
3674
- } & DatetimeDisabledOptions, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3731
+ } & DatetimeDisabledOptions & {
3732
+ popup?: PickerPopupOptions;
3733
+ }, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
3675
3734
  change: (newValue: string, oldValue?: string) => any;
3676
3735
  }, string, vue.PublicProps, Readonly<ReadonlyOptions & {
3677
3736
  value?: string;
3678
3737
  format?: "HH:mm:ss" | "HH:mm";
3738
+ mode?: "default" | "simple";
3679
3739
  min?: string;
3680
3740
  max?: string;
3681
- } & DatetimeDisabledOptions> & Readonly<{
3741
+ } & DatetimeDisabledOptions & {
3742
+ popup?: PickerPopupOptions;
3743
+ }> & Readonly<{
3682
3744
  onChange?: (newValue: string, oldValue?: string) => any;
3683
3745
  }>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
3684
3746
  DragVerify: vue.DefineComponent<DragVerifyOptions, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {} & {