@douyinfe/semi-foundation 2.60.0 → 2.61.0-alpha.0

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.
@@ -9,6 +9,11 @@ import { BaseFormAdapter, FormState, CallOpts, FieldState, FieldStaff, Component
9
9
 
10
10
  export type { BaseFormAdapter };
11
11
 
12
+ type ScrollToErrorOpts = {
13
+ field?: string;
14
+ index?: number;
15
+ scrollOpts?: ScrollIntoViewOptions
16
+ }
12
17
  export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
13
18
 
14
19
  data: FormState;
@@ -72,6 +77,7 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
72
77
  this.getFormProps = this.getFormProps.bind(this);
73
78
  this.getFieldExist = this.getFieldExist.bind(this);
74
79
  this.scrollToField = this.scrollToField.bind(this);
80
+ this.scrollToError = this.scrollToError.bind(this);
75
81
  }
76
82
 
77
83
  init() {
@@ -130,7 +136,7 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
130
136
  this._adapter.forceUpdate();
131
137
  }
132
138
 
133
- // in order to slove byted-issue-289
139
+ // in order to solve bytedance internal issue-289
134
140
  registerArrayField(arrayFieldPath: string, val: any): void {
135
141
  this.updateArrayField(arrayFieldPath, {
136
142
  updateKey: new Date().valueOf(),
@@ -622,6 +628,7 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
622
628
  submitForm: () => this.submit(),
623
629
  getFieldExist: (field: string) => this.getFieldExist(field),
624
630
  scrollToField: (field: string, scrollOpts?: ScrollIntoViewOptions) => this.scrollToField(field, scrollOpts),
631
+ scrollToError: (opts?: ScrollToErrorOpts) => this.scrollToError(opts),
625
632
  };
626
633
  }
627
634
 
@@ -701,8 +708,8 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
701
708
  const errorDOM = this._adapter.getAllErrorDOM();
702
709
  if (errorDOM && errorDOM.length) {
703
710
  try {
704
- const fieldDom = errorDOM[0].parentNode.parentNode;
705
- scrollIntoView(fieldDom as Element, scrollOpts);
711
+ const fieldDOM = errorDOM[0].parentNode.parentNode;
712
+ scrollIntoView(fieldDOM as Element, scrollOpts);
706
713
  } catch (error) {}
707
714
  }
708
715
  }
@@ -713,4 +720,34 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
713
720
  scrollIntoView(fieldDOM as Element, scrollOpts);
714
721
  }
715
722
  }
723
+
724
+ scrollToError(config?: ScrollToErrorOpts): void {
725
+ let scrollOpts: ScrollIntoViewOptions = config && config.scrollOpts ? config.scrollOpts : { behavior: 'smooth', block: 'start' };
726
+ let field = config && config.field;
727
+ let index = config && config.index;
728
+ let fieldDOM, errorDOM;
729
+ if (typeof index === 'number') {
730
+ const allErrorDOM = this._adapter.getAllErrorDOM();
731
+ let errorDOM = allErrorDOM[index];
732
+ if (errorDOM) {
733
+ fieldDOM = errorDOM.parentNode.parentNode;
734
+ }
735
+ } else if (field) {
736
+ // If field is specified, find the error dom of the corresponding field
737
+ errorDOM = this._adapter.getFieldErrorDOM(field);
738
+ if (errorDOM) {
739
+ fieldDOM = errorDOM.parentNode.parentNode;
740
+ }
741
+ } else if (typeof field === 'undefined') {
742
+ // If field is not specified, find all error doms and scroll to the first one
743
+ let allErrorDOM = this._adapter.getAllErrorDOM();
744
+ if (allErrorDOM && allErrorDOM.length) {
745
+ fieldDOM = allErrorDOM[0].parentNode.parentNode;
746
+ }
747
+ }
748
+
749
+ if (fieldDOM) {
750
+ scrollIntoView(fieldDOM as Element, scrollOpts);
751
+ }
752
+ }
716
753
  }
package/form/interface.ts CHANGED
@@ -22,6 +22,7 @@ export interface BaseFormAdapter<P = Record<string, any>, S = Record<string, any
22
22
  getFormProps: (keys: undefined | string | Array<string>) => any;
23
23
  getAllErrorDOM: () => NodeList;
24
24
  getFieldDOM: (field: string) => Node;
25
+ getFieldErrorDOM: (field: string) => Node;
25
26
  initFormId: () => void
26
27
  }
27
28
 
@@ -62,6 +63,12 @@ export type FieldPathValue<T, P extends FieldPath<T>> =
62
63
  ? T[P]
63
64
  : never;
64
65
 
66
+ export type ScrollToErrorOptions<K> = {
67
+ field?: K;
68
+ index?: number;
69
+ scrollConfig?: ScrollIntoViewOptions
70
+ }
71
+
65
72
  // use object replace Record<string, any>, fix issue 933
66
73
  export interface BaseFormApi<T extends object = any> {
67
74
  /** get value of field */
@@ -91,7 +98,8 @@ export interface BaseFormApi<T extends object = any> {
91
98
  getValues: () => T;
92
99
  /** set value of multiple fields */
93
100
  setValues: (fieldsValue: Partial<T>, config?: setValuesConfig) => void;
94
- scrollToField: <K extends keyof T>(field: K, scrollConfig?: ScrollIntoViewOptions) => void
101
+ scrollToField: <K extends keyof T>(field: K, scrollConfig?: ScrollIntoViewOptions) => void;
102
+ scrollToError: <K extends keyof T>(config?: ScrollToErrorOptions<K>) => void
95
103
  }
96
104
 
97
105
  export interface CallOpts {
@@ -2,6 +2,11 @@ import BaseFoundation from '../base/foundation';
2
2
  import { Options as ScrollIntoViewOptions } from 'scroll-into-view-if-needed';
3
3
  import { BaseFormAdapter, FormState, CallOpts, FieldState, FieldStaff, ComponentProps, setValuesConfig, ArrayFieldStaff } from './interface';
4
4
  export type { BaseFormAdapter };
5
+ type ScrollToErrorOpts = {
6
+ field?: string;
7
+ index?: number;
8
+ scrollOpts?: ScrollIntoViewOptions;
9
+ };
5
10
  export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
6
11
  data: FormState;
7
12
  fields: Map<string, FieldStaff>;
@@ -85,6 +90,7 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
85
90
  submitForm: () => void;
86
91
  getFieldExist: (field: string) => boolean;
87
92
  scrollToField: (field: string, scrollOpts?: ScrollIntoViewOptions) => void;
93
+ scrollToError: (opts?: ScrollToErrorOpts) => void;
88
94
  setValue: (field: string, value: any, opts: CallOpts) => void;
89
95
  setError: (field: string, error: any, opts: CallOpts) => void;
90
96
  setTouched: (field: string, isTouched: boolean, opts: CallOpts) => void;
@@ -98,4 +104,5 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
98
104
  _autoScroll(timeout?: boolean | number): void;
99
105
  _getErrorFieldAndScroll(scrollOpts?: ScrollIntoViewOptions | boolean): void;
100
106
  scrollToField(field: string, scrollOpts?: ScrollIntoViewOptions<any>): void;
107
+ scrollToError(config?: ScrollToErrorOpts): void;
101
108
  }
@@ -65,6 +65,7 @@ class FormFoundation extends _foundation.default {
65
65
  this.getFormProps = this.getFormProps.bind(this);
66
66
  this.getFieldExist = this.getFieldExist.bind(this);
67
67
  this.scrollToField = this.scrollToField.bind(this);
68
+ this.scrollToError = this.scrollToError.bind(this);
68
69
  }
69
70
  init() {
70
71
  this._adapter.initFormId();
@@ -117,7 +118,7 @@ class FormFoundation extends _foundation.default {
117
118
  this._adapter.notifyChange(this.data);
118
119
  this._adapter.forceUpdate();
119
120
  }
120
- // in order to slove byted-issue-289
121
+ // in order to solve bytedance internal issue-289
121
122
  registerArrayField(arrayFieldPath, val) {
122
123
  this.updateArrayField(arrayFieldPath, {
123
124
  updateKey: new Date().valueOf(),
@@ -609,7 +610,8 @@ class FormFoundation extends _foundation.default {
609
610
  }),
610
611
  submitForm: () => this.submit(),
611
612
  getFieldExist: field => this.getFieldExist(field),
612
- scrollToField: (field, scrollOpts) => this.scrollToField(field, scrollOpts)
613
+ scrollToField: (field, scrollOpts) => this.scrollToField(field, scrollOpts),
614
+ scrollToError: opts => this.scrollToError(opts)
613
615
  });
614
616
  }
615
617
  getFormState() {
@@ -684,8 +686,8 @@ class FormFoundation extends _foundation.default {
684
686
  const errorDOM = this._adapter.getAllErrorDOM();
685
687
  if (errorDOM && errorDOM.length) {
686
688
  try {
687
- const fieldDom = errorDOM[0].parentNode.parentNode;
688
- (0, _scrollIntoViewIfNeeded.default)(fieldDom, scrollOpts);
689
+ const fieldDOM = errorDOM[0].parentNode.parentNode;
690
+ (0, _scrollIntoViewIfNeeded.default)(fieldDOM, scrollOpts);
689
691
  } catch (error) {}
690
692
  }
691
693
  }
@@ -699,5 +701,36 @@ class FormFoundation extends _foundation.default {
699
701
  (0, _scrollIntoViewIfNeeded.default)(fieldDOM, scrollOpts);
700
702
  }
701
703
  }
704
+ scrollToError(config) {
705
+ let scrollOpts = config && config.scrollOpts ? config.scrollOpts : {
706
+ behavior: 'smooth',
707
+ block: 'start'
708
+ };
709
+ let field = config && config.field;
710
+ let index = config && config.index;
711
+ let fieldDOM, errorDOM;
712
+ if (typeof index === 'number') {
713
+ const allErrorDOM = this._adapter.getAllErrorDOM();
714
+ let errorDOM = allErrorDOM[index];
715
+ if (errorDOM) {
716
+ fieldDOM = errorDOM.parentNode.parentNode;
717
+ }
718
+ } else if (field) {
719
+ // If field is specified, find the error dom of the corresponding field
720
+ errorDOM = this._adapter.getFieldErrorDOM(field);
721
+ if (errorDOM) {
722
+ fieldDOM = errorDOM.parentNode.parentNode;
723
+ }
724
+ } else if (typeof field === 'undefined') {
725
+ // If field is not specified, find all error doms and scroll to the first one
726
+ let allErrorDOM = this._adapter.getAllErrorDOM();
727
+ if (allErrorDOM && allErrorDOM.length) {
728
+ fieldDOM = allErrorDOM[0].parentNode.parentNode;
729
+ }
730
+ }
731
+ if (fieldDOM) {
732
+ (0, _scrollIntoViewIfNeeded.default)(fieldDOM, scrollOpts);
733
+ }
734
+ }
702
735
  }
703
736
  exports.default = FormFoundation;
@@ -16,6 +16,7 @@ export interface BaseFormAdapter<P = Record<string, any>, S = Record<string, any
16
16
  getFormProps: (keys: undefined | string | Array<string>) => any;
17
17
  getAllErrorDOM: () => NodeList;
18
18
  getFieldDOM: (field: string) => Node;
19
+ getFieldErrorDOM: (field: string) => Node;
19
20
  initFormId: () => void;
20
21
  }
21
22
  export type AllErrors<T> = T extends Record<string, any> ? {
@@ -35,6 +36,11 @@ export type FieldPath<T> = T extends object ? {
35
36
  [K in keyof T]: T[K] extends object ? `${string & K}.${FieldPath<T[K]>}` | `${string & K}` : `${string & K}`;
36
37
  }[keyof T] : never;
37
38
  export type FieldPathValue<T, P extends FieldPath<T>> = P extends `${infer K}.${infer Rest}` ? K extends keyof T ? Rest extends FieldPath<T[K]> ? FieldPathValue<T[K], Rest> : never : never : P extends keyof T ? T[P] : never;
39
+ export type ScrollToErrorOptions<K> = {
40
+ field?: K;
41
+ index?: number;
42
+ scrollConfig?: ScrollIntoViewOptions;
43
+ };
38
44
  export interface BaseFormApi<T extends object = any> {
39
45
  /** get value of field */
40
46
  getValue: <P extends FieldPath<T>>(field?: P) => FieldPathValue<T, P>;
@@ -66,6 +72,7 @@ export interface BaseFormApi<T extends object = any> {
66
72
  /** set value of multiple fields */
67
73
  setValues: (fieldsValue: Partial<T>, config?: setValuesConfig) => void;
68
74
  scrollToField: <K extends keyof T>(field: K, scrollConfig?: ScrollIntoViewOptions) => void;
75
+ scrollToError: <K extends keyof T>(config?: ScrollToErrorOptions<K>) => void;
69
76
  }
70
77
  export interface CallOpts {
71
78
  [x: string]: any;
@@ -2,6 +2,11 @@ import BaseFoundation from '../base/foundation';
2
2
  import { Options as ScrollIntoViewOptions } from 'scroll-into-view-if-needed';
3
3
  import { BaseFormAdapter, FormState, CallOpts, FieldState, FieldStaff, ComponentProps, setValuesConfig, ArrayFieldStaff } from './interface';
4
4
  export type { BaseFormAdapter };
5
+ type ScrollToErrorOpts = {
6
+ field?: string;
7
+ index?: number;
8
+ scrollOpts?: ScrollIntoViewOptions;
9
+ };
5
10
  export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
6
11
  data: FormState;
7
12
  fields: Map<string, FieldStaff>;
@@ -85,6 +90,7 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
85
90
  submitForm: () => void;
86
91
  getFieldExist: (field: string) => boolean;
87
92
  scrollToField: (field: string, scrollOpts?: ScrollIntoViewOptions) => void;
93
+ scrollToError: (opts?: ScrollToErrorOpts) => void;
88
94
  setValue: (field: string, value: any, opts: CallOpts) => void;
89
95
  setError: (field: string, error: any, opts: CallOpts) => void;
90
96
  setTouched: (field: string, isTouched: boolean, opts: CallOpts) => void;
@@ -98,4 +104,5 @@ export default class FormFoundation extends BaseFoundation<BaseFormAdapter> {
98
104
  _autoScroll(timeout?: boolean | number): void;
99
105
  _getErrorFieldAndScroll(scrollOpts?: ScrollIntoViewOptions | boolean): void;
100
106
  scrollToField(field: string, scrollOpts?: ScrollIntoViewOptions<any>): void;
107
+ scrollToError(config?: ScrollToErrorOpts): void;
101
108
  }
@@ -56,6 +56,7 @@ export default class FormFoundation extends BaseFoundation {
56
56
  this.getFormProps = this.getFormProps.bind(this);
57
57
  this.getFieldExist = this.getFieldExist.bind(this);
58
58
  this.scrollToField = this.scrollToField.bind(this);
59
+ this.scrollToError = this.scrollToError.bind(this);
59
60
  }
60
61
  init() {
61
62
  this._adapter.initFormId();
@@ -108,7 +109,7 @@ export default class FormFoundation extends BaseFoundation {
108
109
  this._adapter.notifyChange(this.data);
109
110
  this._adapter.forceUpdate();
110
111
  }
111
- // in order to slove byted-issue-289
112
+ // in order to solve bytedance internal issue-289
112
113
  registerArrayField(arrayFieldPath, val) {
113
114
  this.updateArrayField(arrayFieldPath, {
114
115
  updateKey: new Date().valueOf(),
@@ -600,7 +601,8 @@ export default class FormFoundation extends BaseFoundation {
600
601
  }),
601
602
  submitForm: () => this.submit(),
602
603
  getFieldExist: field => this.getFieldExist(field),
603
- scrollToField: (field, scrollOpts) => this.scrollToField(field, scrollOpts)
604
+ scrollToField: (field, scrollOpts) => this.scrollToField(field, scrollOpts),
605
+ scrollToError: opts => this.scrollToError(opts)
604
606
  });
605
607
  }
606
608
  getFormState() {
@@ -675,8 +677,8 @@ export default class FormFoundation extends BaseFoundation {
675
677
  const errorDOM = this._adapter.getAllErrorDOM();
676
678
  if (errorDOM && errorDOM.length) {
677
679
  try {
678
- const fieldDom = errorDOM[0].parentNode.parentNode;
679
- scrollIntoView(fieldDom, scrollOpts);
680
+ const fieldDOM = errorDOM[0].parentNode.parentNode;
681
+ scrollIntoView(fieldDOM, scrollOpts);
680
682
  } catch (error) {}
681
683
  }
682
684
  }
@@ -690,4 +692,35 @@ export default class FormFoundation extends BaseFoundation {
690
692
  scrollIntoView(fieldDOM, scrollOpts);
691
693
  }
692
694
  }
695
+ scrollToError(config) {
696
+ let scrollOpts = config && config.scrollOpts ? config.scrollOpts : {
697
+ behavior: 'smooth',
698
+ block: 'start'
699
+ };
700
+ let field = config && config.field;
701
+ let index = config && config.index;
702
+ let fieldDOM, errorDOM;
703
+ if (typeof index === 'number') {
704
+ const allErrorDOM = this._adapter.getAllErrorDOM();
705
+ let errorDOM = allErrorDOM[index];
706
+ if (errorDOM) {
707
+ fieldDOM = errorDOM.parentNode.parentNode;
708
+ }
709
+ } else if (field) {
710
+ // If field is specified, find the error dom of the corresponding field
711
+ errorDOM = this._adapter.getFieldErrorDOM(field);
712
+ if (errorDOM) {
713
+ fieldDOM = errorDOM.parentNode.parentNode;
714
+ }
715
+ } else if (typeof field === 'undefined') {
716
+ // If field is not specified, find all error doms and scroll to the first one
717
+ let allErrorDOM = this._adapter.getAllErrorDOM();
718
+ if (allErrorDOM && allErrorDOM.length) {
719
+ fieldDOM = allErrorDOM[0].parentNode.parentNode;
720
+ }
721
+ }
722
+ if (fieldDOM) {
723
+ scrollIntoView(fieldDOM, scrollOpts);
724
+ }
725
+ }
693
726
  }
@@ -16,6 +16,7 @@ export interface BaseFormAdapter<P = Record<string, any>, S = Record<string, any
16
16
  getFormProps: (keys: undefined | string | Array<string>) => any;
17
17
  getAllErrorDOM: () => NodeList;
18
18
  getFieldDOM: (field: string) => Node;
19
+ getFieldErrorDOM: (field: string) => Node;
19
20
  initFormId: () => void;
20
21
  }
21
22
  export type AllErrors<T> = T extends Record<string, any> ? {
@@ -35,6 +36,11 @@ export type FieldPath<T> = T extends object ? {
35
36
  [K in keyof T]: T[K] extends object ? `${string & K}.${FieldPath<T[K]>}` | `${string & K}` : `${string & K}`;
36
37
  }[keyof T] : never;
37
38
  export type FieldPathValue<T, P extends FieldPath<T>> = P extends `${infer K}.${infer Rest}` ? K extends keyof T ? Rest extends FieldPath<T[K]> ? FieldPathValue<T[K], Rest> : never : never : P extends keyof T ? T[P] : never;
39
+ export type ScrollToErrorOptions<K> = {
40
+ field?: K;
41
+ index?: number;
42
+ scrollConfig?: ScrollIntoViewOptions;
43
+ };
38
44
  export interface BaseFormApi<T extends object = any> {
39
45
  /** get value of field */
40
46
  getValue: <P extends FieldPath<T>>(field?: P) => FieldPathValue<T, P>;
@@ -66,6 +72,7 @@ export interface BaseFormApi<T extends object = any> {
66
72
  /** set value of multiple fields */
67
73
  setValues: (fieldsValue: Partial<T>, config?: setValuesConfig) => void;
68
74
  scrollToField: <K extends keyof T>(field: K, scrollConfig?: ScrollIntoViewOptions) => void;
75
+ scrollToError: <K extends keyof T>(config?: ScrollToErrorOptions<K>) => void;
69
76
  }
70
77
  export interface CallOpts {
71
78
  [x: string]: any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@douyinfe/semi-foundation",
3
- "version": "2.60.0",
3
+ "version": "2.61.0-alpha.0",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "build:lib": "node ./scripts/compileLib.js",
@@ -24,7 +24,7 @@
24
24
  "*.scss",
25
25
  "*.css"
26
26
  ],
27
- "gitHead": "4002a3053726ca7c3d5175cad3cd7bc36cf0daf1",
27
+ "gitHead": "0975fe4980561d1c172fefc4a2273f71d5154f41",
28
28
  "devDependencies": {
29
29
  "@babel/plugin-transform-runtime": "^7.15.8",
30
30
  "@babel/preset-env": "^7.15.8",