indicator-ui 0.1.47 → 0.1.48
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.
- package/README.md +25 -25
- package/dist/index.css +612 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +6059 -2842
- package/dist/index.js.map +1 -1
- package/dist/scss/styles/adaptive/index.scss +142 -142
- package/dist/scss/styles/colors/index.scss +1 -1
- package/dist/scss/styles/colors/primary.scss +54 -54
- package/dist/scss/styles/colors/secondary.scss +12 -12
- package/dist/scss/styles/index.scss +2 -2
- package/dist/scss/styles/mixins/centerInsideContent.scss +6 -6
- package/dist/scss/styles/mixins/changeSvg.scss +25 -25
- package/dist/scss/styles/mixins/fnt-flex.scss +38 -38
- package/dist/scss/styles/mixins/fnt.scss +25 -25
- package/dist/scss/styles/mixins/hiddeScrollBar.scss +9 -9
- package/dist/scss/styles/mixins/index.scss +7 -7
- package/dist/scss/styles/mixins/modify-flex.scss +17 -17
- package/dist/scss/styles/mixins/modify-svg.scss +30 -30
- package/dist/scss/test/global.scss +82 -82
- package/dist/scss/ui/Buttons/styles/mixins/baseButton.scss +48 -48
- package/dist/scss/ui/Buttons/styles/mixins/index.scss +1 -1
- package/dist/scss/ui/Buttons/styles/mixins/properties/index.scss +21 -21
- package/dist/scss/ui/Buttons/styles/mixins/properties/large.scss +28 -28
- package/dist/scss/ui/Buttons/styles/mixins/properties/link-black.scss +47 -47
- package/dist/scss/ui/Buttons/styles/mixins/properties/link-color.scss +47 -47
- package/dist/scss/ui/Buttons/styles/mixins/properties/link-dark-theme.scss +47 -47
- package/dist/scss/ui/Buttons/styles/mixins/properties/link-gray.scss +47 -47
- package/dist/scss/ui/Buttons/styles/mixins/properties/medium.scss +28 -28
- package/dist/scss/ui/Buttons/styles/mixins/properties/primary.scss +59 -59
- package/dist/scss/ui/Buttons/styles/mixins/properties/secondary-color.scss +72 -72
- package/dist/scss/ui/Buttons/styles/mixins/properties/secondary-gray.scss +90 -90
- package/dist/scss/ui/Buttons/styles/mixins/properties/small.scss +28 -28
- package/dist/scss/ui/Buttons/styles/mixins/properties/tab-active.scss +51 -51
- package/dist/scss/ui/Buttons/styles/mixins/properties/tab.scss +51 -51
- package/dist/scss/ui/Buttons/styles/mixins/properties/tertiary-color.scss +82 -82
- package/dist/scss/ui/Buttons/styles/mixins/properties/tertiary-gray.scss +42 -42
- package/dist/scss/ui/Buttons/styles/mixins/properties/tertiary-white.scss +83 -83
- package/dist/scss/ui/Buttons/styles/mixins/properties/ultra.scss +28 -28
- package/dist/scss/ui/Buttons/styles/mixins/properties/warning-link-color.scss +44 -44
- package/dist/scss/ui/Buttons/styles/mixins/properties/warning-primary.scss +36 -36
- package/dist/scss/ui/Buttons/styles/mixins/properties/warning-secondary-color.scss +40 -40
- package/dist/scss/ui/CheckboxMark/styles/mixins/base.scss +30 -30
- package/dist/scss/ui/CheckboxMark/styles/mixins/checkbox-mark.scss +95 -95
- package/dist/scss/ui/CheckboxMark/styles/mixins/index.scss +2 -2
- package/dist/scss/ui/CheckboxMark/styles/mixins/properties/checkbox.scss +2 -2
- package/dist/scss/ui/CheckboxMark/styles/mixins/properties/checked.scss +21 -21
- package/dist/scss/ui/CheckboxMark/styles/mixins/properties/correct.scss +48 -48
- package/dist/scss/ui/CheckboxMark/styles/mixins/properties/disabled.scss +28 -28
- package/dist/scss/ui/CheckboxMark/styles/mixins/properties/error.scss +23 -23
- package/dist/scss/ui/CheckboxMark/styles/mixins/properties/incorrect.scss +48 -48
- package/dist/scss/ui/CheckboxMark/styles/mixins/properties/indeterminate.scss +18 -18
- package/dist/scss/ui/CheckboxMark/styles/mixins/properties/index.scss +7 -7
- package/dist/scss/ui/CheckboxMark/styles/mixins/properties/radio.scss +14 -14
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomInputField/CustomInput.scss +125 -125
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomInputField/CustomInputField.scss +32 -32
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomInputField/CustomTextareaInput.scss +29 -29
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomInputField/index.scss +1 -1
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomInputWrapper/CustomInputWrapper.scss +54 -54
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomInputWrapper/config.scss +4 -4
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomOptionsInput/index.scss +47 -47
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomSelectField/CustomSelectField.scss +53 -53
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomSelectField/CustomSelectFieldOption.scss +50 -50
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomSelectField/CustomSelectFieldViewField.scss +27 -27
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomSwitchersField/CustomSwitchersField.scss +16 -16
- package/dist/scss/ui/FormBuilder/styles/CustomFields/CustomSwitchersField/components/option.scss +33 -33
- package/dist/scss/ui/FormBuilder/styles/CustomFields/index.scss +4 -4
- package/dist/scss/ui/InputFields/FlexField/styles/mixins/flexField.scss +150 -150
- package/dist/scss/ui/InputFields/InputFieldWrapper/styles/mixins/inputFieldWrapper.scss +49 -49
- package/dist/scss/ui/MicroButton/styles/mixins/base-button.scss +17 -17
- package/dist/scss/ui/MicroButton/styles/mixins/index.scss +1 -1
- package/dist/scss/ui/MicroButton/styles/mixins/micro-button.scss +68 -68
- package/dist/scss/ui/MicroButton/styles/mixins/properties/blue-light.scss +18 -18
- package/dist/scss/ui/MicroButton/styles/mixins/properties/color-fill.scss +20 -20
- package/dist/scss/ui/MicroButton/styles/mixins/properties/color-hover.scss +20 -20
- package/dist/scss/ui/MicroButton/styles/mixins/properties/color.scss +20 -20
- package/dist/scss/ui/MicroButton/styles/mixins/properties/dark.scss +18 -18
- package/dist/scss/ui/MicroButton/styles/mixins/properties/gray-fill.scss +20 -20
- package/dist/scss/ui/MicroButton/styles/mixins/properties/gray.scss +20 -20
- package/dist/scss/ui/MicroButton/styles/mixins/properties/index.scss +17 -17
- package/dist/scss/ui/MicroButton/styles/mixins/properties/light.scss +20 -20
- package/dist/scss/ui/MicroButton/styles/mixins/properties/red-fill.scss +20 -20
- package/dist/scss/ui/MicroButton/styles/mixins/properties/red-hover.scss +20 -20
- package/dist/scss/ui/MicroButton/styles/mixins/properties/rose.scss +20 -20
- package/dist/scss/ui/MicroButton/styles/mixins/properties/size-14.scss +11 -11
- package/dist/scss/ui/MicroButton/styles/mixins/properties/size-16.scss +11 -11
- package/dist/scss/ui/MicroButton/styles/mixins/properties/size-20.scss +11 -11
- package/dist/scss/ui/MicroButton/styles/mixins/properties/size-24.scss +11 -11
- package/dist/scss/ui/MicroButton/styles/mixins/properties/size-28.scss +11 -11
- package/dist/scss/ui/Tag/styles/properties/active.scss +15 -15
- package/dist/scss/ui/Tag/styles/properties/base.scss +33 -33
- package/dist/scss/ui/Tag/styles/properties/clicked.scss +2 -2
- package/dist/scss/ui/Tag/styles/properties/hover.scss +4 -4
- package/dist/scss/ui/Tag/styles/properties/index.scss +6 -6
- package/dist/scss/ui/Tag/styles/properties/large.scss +18 -18
- package/dist/scss/ui/Tag/styles/properties/medium.scss +18 -18
- package/dist/scss/ui/Tag/styles/properties/small.scss +18 -18
- package/dist/scss/ui/ToggleBase/styles/mixins/active.scss +12 -12
- package/dist/scss/ui/ToggleBase/styles/mixins/base-button.scss +8 -8
- package/dist/scss/ui/ToggleBase/styles/mixins/base.scss +13 -13
- package/dist/scss/ui/ToggleBase/styles/mixins/disabled.scss +5 -5
- package/dist/scss/ui/ToggleBase/styles/mixins/error.scss +6 -6
- package/dist/scss/ui/ToggleBase/styles/mixins/hover.scss +22 -22
- package/dist/scss/ui/ToggleBase/styles/mixins/index.scss +8 -8
- package/dist/scss/ui/ToggleBase/styles/mixins/large.scss +8 -8
- package/dist/scss/ui/ToggleBase/styles/mixins/medium.scss +8 -8
- package/dist/scss/ui/ToggleBase/styles/mixins/spacer.scss +4 -4
- package/dist/scss/ui/formFields/FormFieldWrapper/styles/mixins/index.scss +1 -0
- package/dist/scss/ui/formFields/FormFieldWrapper/styles/mixins/inputFieldWrapper.scss +50 -0
- package/dist/types/src/hooks/forms/__tests__/lib/getDataByPath.test.d.ts +1 -0
- package/dist/types/src/hooks/forms/__tests__/lib/getFormDataPaths.test.d.ts +1 -0
- package/dist/types/src/hooks/forms/__tests__/lib/setDataByPath.test.d.ts +1 -0
- package/dist/types/src/hooks/forms/__tests__/lib/utils.test.d.ts +1 -0
- package/dist/types/src/hooks/forms/classes/index.d.ts +44 -0
- package/dist/types/src/hooks/forms/index.d.ts +2 -0
- package/dist/types/src/hooks/forms/lib/fieldsProps.d.ts +11 -0
- package/dist/types/src/hooks/forms/lib/getDataByPath.d.ts +4 -0
- package/dist/types/src/hooks/forms/lib/getFormDataPaths.d.ts +5 -0
- package/dist/types/src/hooks/forms/lib/index.d.ts +5 -0
- package/dist/types/src/hooks/forms/lib/scheme.d.ts +13 -0
- package/dist/types/src/hooks/forms/lib/setDataByPath.d.ts +5 -0
- package/dist/types/src/hooks/forms/lib/utils.d.ts +9 -0
- package/dist/types/src/hooks/forms/types/formTypes.d.ts +51 -0
- package/dist/types/src/hooks/forms/types/index.d.ts +2 -3
- package/dist/types/src/hooks/forms/types/scheme.d.ts +151 -0
- package/dist/types/src/hooks/forms/useForm.d.ts +212 -0
- package/dist/types/src/hooks/forms/validateFunctions/config.d.ts +2 -0
- package/dist/types/src/hooks/forms/validateFunctions/index.d.ts +8 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateArray.d.ts +1 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateDateTime.d.ts +7 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateEqualsTo.d.ts +1 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateFile.d.ts +3 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateNum.d.ts +6 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateRequired.d.ts +1 -0
- package/dist/types/src/hooks/forms/validateFunctions/validateStr.d.ts +8 -0
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/lib/tsCheck/index.d.ts +1 -0
- package/dist/types/src/test/pages/FormPage.d.ts +1 -0
- package/dist/types/src/test/pages/index.d.ts +1 -0
- package/dist/types/src/types/mixins.d.ts +10 -0
- package/dist/types/src/ui/formFields/FormField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormField/styles/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormField/ui/FormField.d.ts +6 -0
- package/dist/types/src/ui/formFields/FormField/ui/FormFieldBase.d.ts +19 -0
- package/dist/types/src/ui/formFields/FormField/ui/index.d.ts +2 -0
- package/dist/types/src/ui/formFields/FormFieldWrapper/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormFieldWrapper/styles/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormFieldWrapper/ui/FormFieldWrapper.d.ts +24 -0
- package/dist/types/src/ui/formFields/FormFieldWrapper/ui/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormRadioField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormRadioField/ui/FieldItem.d.ts +11 -0
- package/dist/types/src/ui/formFields/FormRadioField/ui/FormRadioField.d.ts +18 -0
- package/dist/types/src/ui/formFields/FormRadioField/ui/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSelectField/config/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSelectField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSelectField/styles/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSelectField/ui/FormSelectField.d.ts +8 -0
- package/dist/types/src/ui/formFields/FormSelectField/ui/FormSelectFieldBase.d.ts +21 -0
- package/dist/types/src/ui/formFields/FormSelectField/ui/index.d.ts +2 -0
- package/dist/types/src/ui/formFields/FormSwitcherField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormSwitcherField/ui/FormSwitcherField.d.ts +5 -0
- package/dist/types/src/ui/formFields/FormSwitcherField/ui/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormTextareaField/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormTextareaField/styles/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/FormTextareaField/ui/FormTextareaField.d.ts +14 -0
- package/dist/types/src/ui/formFields/FormTextareaField/ui/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/extends/index.d.ts +1 -0
- package/dist/types/src/ui/formFields/extends/style/index.d.ts +2 -0
- package/dist/types/src/ui/formFields/extends/ui/DropdownArrow.d.ts +6 -0
- package/dist/types/src/ui/formFields/extends/ui/InputInnerButton.d.ts +7 -0
- package/dist/types/src/ui/formFields/extends/ui/index.d.ts +2 -0
- package/dist/types/src/ui/formFields/index.d.ts +6 -0
- package/dist/types/src/ui/index.d.ts +1 -0
- package/docs/CSSVariables/CSSVariables.md +62 -62
- package/docs/CSSVariables/CSSVariablesCalifornia.md +61 -61
- package/docs/ForDev.md +106 -106
- package/docs/FormBuilderDocs.md +204 -204
- package/docs/Notes.md +189 -55
- package/docs/SCSSVariables.md +28 -28
- package/package.json +2 -2
- package/dist/scss/ui/InputFields/index.scss +0 -7
- package/dist/types/src/hooks/forms/useForms.d.ts +0 -3
package/docs/FormBuilderDocs.md
CHANGED
|
@@ -1,205 +1,205 @@
|
|
|
1
|
-
[🔙 Назад](../README.md)
|
|
2
|
-
|
|
3
|
-
# `FormBuilder`
|
|
4
|
-
|
|
5
|
-
### Важно
|
|
6
|
-
|
|
7
|
-
Для работы нужно установить библы: `npm install clsx react-imask`
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
Клиентский компонент, созданный для облегчения создания полей. По большей части он был создан для имплементации хука
|
|
12
|
-
`useFormBuilder` (чья цель, создать гибкое состояние формы). В `FormBuilder` передается основной пропс - `schema`.
|
|
13
|
-
|
|
14
|
-
`schema` - словарь, в котором перечислены все поля и другие компоненты. Fообще в билдере можно написать обсалютно любую
|
|
15
|
-
логику компонента (или почти любую), в этом и была основная идея `FormBuilder`.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
### Актуальные типы полей:
|
|
20
|
-
|
|
21
|
-
* `FORM_WRAPPER_SCHEMA`
|
|
22
|
-
* `REACT_NODE_SCHEMA`
|
|
23
|
-
* `INPUT_FIELD_SCHEMA`
|
|
24
|
-
* `ARRAY_FIELDS_SCHEMA`
|
|
25
|
-
* `BLOCK_WRAPPER_SCHEMA`
|
|
26
|
-
|
|
27
|
-
### Неактуальные типы полей (ими лучше не пользоваться, они потихоньку будут выпиливаться из проекта)
|
|
28
|
-
|
|
29
|
-
* `BLOCK_SCHEMA`
|
|
30
|
-
* `CUSTOM_FIELD_WRAPPER_SCHEMA`
|
|
31
|
-
* `ADDITION_PROPS`
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
### `INPUT_FIELD_SCHEMA`
|
|
36
|
-
|
|
37
|
-
Самая используемая схема поля ввода.
|
|
38
|
-
|
|
39
|
-
```ts
|
|
40
|
-
const schema: INPUT_FIELD_SCHEMA = {
|
|
41
|
-
type: 'input_field',
|
|
42
|
-
props: {
|
|
43
|
-
name: 'test',
|
|
44
|
-
labelText: 'label',
|
|
45
|
-
hintText: 'hint',
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
Основной пропсы - это `name`, он отвечает за имя во вложенности формы
|
|
51
|
-
|
|
52
|
-
###### В результате получим:
|
|
53
|
-
|
|
54
|
-
```ts
|
|
55
|
-
const formData = {
|
|
56
|
-
test: 'data',
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
#### Дополнительные поля, предоставляемые `FormBuilder`:
|
|
61
|
-
|
|
62
|
-
* `keyWay` - позволяет вручную задать вложенность поля
|
|
63
|
-
|
|
64
|
-
```ts
|
|
65
|
-
const schema: INPUT_FIELD_SCHEMA = {
|
|
66
|
-
type: 'input_field',
|
|
67
|
-
props: {
|
|
68
|
-
keyWay: ['test1', 'test2', 'test3'],
|
|
69
|
-
labelText: 'label',
|
|
70
|
-
hintText: 'hint',
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
###### В результате получим:
|
|
76
|
-
|
|
77
|
-
```ts
|
|
78
|
-
const formData = {
|
|
79
|
-
test1: {
|
|
80
|
-
test2: {
|
|
81
|
-
test3: 'data',
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
* `onBlurValidation` - добавляет проверку на `onBlur`.
|
|
88
|
-
|
|
89
|
-
```ts
|
|
90
|
-
type onBlurValidation = { required: boolean, fun: (data: any) => boolean }
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
`required` - обязательное поле.
|
|
94
|
-
|
|
95
|
-
* `ownerInputComponent` - свое собственное `input` поле. Для работы оно должно принимать параметры `value` и `onChange`,
|
|
96
|
-
которые накидываются `FormBuilder`. Любые пропсы, переданные в `props` пойдут в компонент (можно накинуть на сам
|
|
97
|
-
компонент в `ownerInputComponent`, разницы нет, но `value`, `onChange`, `isError`, `isErrorMessage`, `onBlur` будут
|
|
98
|
-
перезаписаны).
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
### `ARRAY_FIELDS_SCHEMA`
|
|
103
|
-
|
|
104
|
-
Схема для создания массива в форме. Любой `input_field` будет класться в ячейку массива, а не в поле словаря.
|
|
105
|
-
|
|
106
|
-
```ts
|
|
107
|
-
const schemes: ARRAY_FIELDS_SCHEMA = [
|
|
108
|
-
{
|
|
109
|
-
type: 'array_fields',
|
|
110
|
-
props: {
|
|
111
|
-
name: 'test_arr',
|
|
112
|
-
children: [
|
|
113
|
-
{
|
|
114
|
-
type: 'input_field',
|
|
115
|
-
props: {
|
|
116
|
-
name: 'test',
|
|
117
|
-
labelText: 'label',
|
|
118
|
-
hintText: 'hint',
|
|
119
|
-
placeholder: 'placeholder',
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
]
|
|
123
|
-
}
|
|
124
|
-
},
|
|
125
|
-
]
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
###### В результате получим:
|
|
129
|
-
|
|
130
|
-
```ts
|
|
131
|
-
const formData = {
|
|
132
|
-
test_arr: [
|
|
133
|
-
{
|
|
134
|
-
test: "123213"
|
|
135
|
-
},
|
|
136
|
-
]
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
###### Если не указать `name` в `input_field`, то получим:
|
|
141
|
-
|
|
142
|
-
```ts
|
|
143
|
-
const formData = {
|
|
144
|
-
test_arr: [
|
|
145
|
-
"123123123123"
|
|
146
|
-
]
|
|
147
|
-
}
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
В зависимости от того, в каком порядке написаны поля ввода в массиве схемы, в том же порядке будет идти запись в форму.
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
### `FORM_WRAPPER_SCHEMA`
|
|
155
|
-
|
|
156
|
-
Используется для обертки формы, сбрасывает счетчик `ARRAY_FIELDS_SCHEMA` (это значит, что поля внутри `FORM_WAPPER`
|
|
157
|
-
**_не пойдут_** в массив).
|
|
158
|
-
|
|
159
|
-
```ts
|
|
160
|
-
const schemes: ARRAY_FIELDS_SCHEMA = [
|
|
161
|
-
{
|
|
162
|
-
type: 'form_wrapper',
|
|
163
|
-
props: {
|
|
164
|
-
name: 'test_arr',
|
|
165
|
-
children: [
|
|
166
|
-
{
|
|
167
|
-
type: 'input_field',
|
|
168
|
-
props: {
|
|
169
|
-
name: 'test',
|
|
170
|
-
labelText: 'label',
|
|
171
|
-
hintText: 'hint',
|
|
172
|
-
placeholder: 'placeholder',
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
]
|
|
176
|
-
}
|
|
177
|
-
},
|
|
178
|
-
]
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
###### В результате получим:
|
|
182
|
-
|
|
183
|
-
```ts
|
|
184
|
-
const formData = {
|
|
185
|
-
test_arr: {
|
|
186
|
-
test: "123123132132"
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
### `BLOCK_WRAPPER_SCHEMA`
|
|
194
|
-
|
|
195
|
-
Используется для обертки чего-то, не сбрасывает счетчик `ARRAY_FIELDS_SCHEMA`, но и прописать ключ значения в словаре
|
|
196
|
-
тоже нельзя (это значит, что поля внутри `FORM_WAPPER` **_пойдут_** в массив). Было сделано для того, чтобы можно было в
|
|
197
|
-
массиве (или просто в схеме) сделать обертку, а в нее передать схему поля. К примеру, у вас посреди схемы надо сделать
|
|
198
|
-
обертку для `input_field`, писать новый компонент поля не хочется, поэтому мы можем сделать компонент обертки и передать
|
|
199
|
-
его в `BLOCK_WRAPPER_SCHEMA`.
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
### `REACT_NODE_SCHEMA`
|
|
204
|
-
|
|
1
|
+
[🔙 Назад](../README.md)
|
|
2
|
+
|
|
3
|
+
# `FormBuilder`
|
|
4
|
+
|
|
5
|
+
### Важно
|
|
6
|
+
|
|
7
|
+
Для работы нужно установить библы: `npm install clsx react-imask`
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Клиентский компонент, созданный для облегчения создания полей. По большей части он был создан для имплементации хука
|
|
12
|
+
`useFormBuilder` (чья цель, создать гибкое состояние формы). В `FormBuilder` передается основной пропс - `schema`.
|
|
13
|
+
|
|
14
|
+
`schema` - словарь, в котором перечислены все поля и другие компоненты. Fообще в билдере можно написать обсалютно любую
|
|
15
|
+
логику компонента (или почти любую), в этом и была основная идея `FormBuilder`.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
### Актуальные типы полей:
|
|
20
|
+
|
|
21
|
+
* `FORM_WRAPPER_SCHEMA`
|
|
22
|
+
* `REACT_NODE_SCHEMA`
|
|
23
|
+
* `INPUT_FIELD_SCHEMA`
|
|
24
|
+
* `ARRAY_FIELDS_SCHEMA`
|
|
25
|
+
* `BLOCK_WRAPPER_SCHEMA`
|
|
26
|
+
|
|
27
|
+
### Неактуальные типы полей (ими лучше не пользоваться, они потихоньку будут выпиливаться из проекта)
|
|
28
|
+
|
|
29
|
+
* `BLOCK_SCHEMA`
|
|
30
|
+
* `CUSTOM_FIELD_WRAPPER_SCHEMA`
|
|
31
|
+
* `ADDITION_PROPS`
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
### `INPUT_FIELD_SCHEMA`
|
|
36
|
+
|
|
37
|
+
Самая используемая схема поля ввода.
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
const schema: INPUT_FIELD_SCHEMA = {
|
|
41
|
+
type: 'input_field',
|
|
42
|
+
props: {
|
|
43
|
+
name: 'test',
|
|
44
|
+
labelText: 'label',
|
|
45
|
+
hintText: 'hint',
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Основной пропсы - это `name`, он отвечает за имя во вложенности формы
|
|
51
|
+
|
|
52
|
+
###### В результате получим:
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
const formData = {
|
|
56
|
+
test: 'data',
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
#### Дополнительные поля, предоставляемые `FormBuilder`:
|
|
61
|
+
|
|
62
|
+
* `keyWay` - позволяет вручную задать вложенность поля
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
const schema: INPUT_FIELD_SCHEMA = {
|
|
66
|
+
type: 'input_field',
|
|
67
|
+
props: {
|
|
68
|
+
keyWay: ['test1', 'test2', 'test3'],
|
|
69
|
+
labelText: 'label',
|
|
70
|
+
hintText: 'hint',
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
###### В результате получим:
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
const formData = {
|
|
79
|
+
test1: {
|
|
80
|
+
test2: {
|
|
81
|
+
test3: 'data',
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
* `onBlurValidation` - добавляет проверку на `onBlur`.
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
type onBlurValidation = { required: boolean, fun: (data: any) => boolean }
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`required` - обязательное поле.
|
|
94
|
+
|
|
95
|
+
* `ownerInputComponent` - свое собственное `input` поле. Для работы оно должно принимать параметры `value` и `onChange`,
|
|
96
|
+
которые накидываются `FormBuilder`. Любые пропсы, переданные в `props` пойдут в компонент (можно накинуть на сам
|
|
97
|
+
компонент в `ownerInputComponent`, разницы нет, но `value`, `onChange`, `isError`, `isErrorMessage`, `onBlur` будут
|
|
98
|
+
перезаписаны).
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
### `ARRAY_FIELDS_SCHEMA`
|
|
103
|
+
|
|
104
|
+
Схема для создания массива в форме. Любой `input_field` будет класться в ячейку массива, а не в поле словаря.
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
const schemes: ARRAY_FIELDS_SCHEMA = [
|
|
108
|
+
{
|
|
109
|
+
type: 'array_fields',
|
|
110
|
+
props: {
|
|
111
|
+
name: 'test_arr',
|
|
112
|
+
children: [
|
|
113
|
+
{
|
|
114
|
+
type: 'input_field',
|
|
115
|
+
props: {
|
|
116
|
+
name: 'test',
|
|
117
|
+
labelText: 'label',
|
|
118
|
+
hintText: 'hint',
|
|
119
|
+
placeholder: 'placeholder',
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
###### В результате получим:
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
const formData = {
|
|
132
|
+
test_arr: [
|
|
133
|
+
{
|
|
134
|
+
test: "123213"
|
|
135
|
+
},
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
###### Если не указать `name` в `input_field`, то получим:
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
const formData = {
|
|
144
|
+
test_arr: [
|
|
145
|
+
"123123123123"
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
В зависимости от того, в каком порядке написаны поля ввода в массиве схемы, в том же порядке будет идти запись в форму.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
### `FORM_WRAPPER_SCHEMA`
|
|
155
|
+
|
|
156
|
+
Используется для обертки формы, сбрасывает счетчик `ARRAY_FIELDS_SCHEMA` (это значит, что поля внутри `FORM_WAPPER`
|
|
157
|
+
**_не пойдут_** в массив).
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
const schemes: ARRAY_FIELDS_SCHEMA = [
|
|
161
|
+
{
|
|
162
|
+
type: 'form_wrapper',
|
|
163
|
+
props: {
|
|
164
|
+
name: 'test_arr',
|
|
165
|
+
children: [
|
|
166
|
+
{
|
|
167
|
+
type: 'input_field',
|
|
168
|
+
props: {
|
|
169
|
+
name: 'test',
|
|
170
|
+
labelText: 'label',
|
|
171
|
+
hintText: 'hint',
|
|
172
|
+
placeholder: 'placeholder',
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
]
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
###### В результате получим:
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
const formData = {
|
|
185
|
+
test_arr: {
|
|
186
|
+
test: "123123132132"
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### `BLOCK_WRAPPER_SCHEMA`
|
|
194
|
+
|
|
195
|
+
Используется для обертки чего-то, не сбрасывает счетчик `ARRAY_FIELDS_SCHEMA`, но и прописать ключ значения в словаре
|
|
196
|
+
тоже нельзя (это значит, что поля внутри `FORM_WAPPER` **_пойдут_** в массив). Было сделано для того, чтобы можно было в
|
|
197
|
+
массиве (или просто в схеме) сделать обертку, а в нее передать схему поля. К примеру, у вас посреди схемы надо сделать
|
|
198
|
+
обертку для `input_field`, писать новый компонент поля не хочется, поэтому мы можем сделать компонент обертки и передать
|
|
199
|
+
его в `BLOCK_WRAPPER_SCHEMA`.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
### `REACT_NODE_SCHEMA`
|
|
204
|
+
|
|
205
205
|
Схема простого `React-компонента`. Можно посреди схемы вcтавить какой-нибудь `ReactNode`.
|
package/docs/Notes.md
CHANGED
|
@@ -1,55 +1,189 @@
|
|
|
1
|
-
[🔙 Назад](../README.md)
|
|
2
|
-
|
|
3
|
-
# Всякие интересные заметки
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Перетаскивание файлов на ios (на других os apple тоже наверное)
|
|
10
|
-
|
|
11
|
-
У *__Apple__* есть система перетаскивания файлов (к примеру изображений).
|
|
12
|
-
|
|
13
|
-
Вот так
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
<img src="./assets/Notes/apple/dragImage.png" style="width:200px;padding: 20px;">
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
И при правильно написанном коде должен быть такой эффект.
|
|
22
|
-
|
|
23
|
-
___
|
|
24
|
-
|
|
25
|
-
<img src="./assets/Notes/apple/dragging.png" style="width:200px;padding: 20px;">
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
Чтобы его получить надо навесить на элемент `dragover` слушатель и обязательно отменить ванильное поведение события.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
newEl.addEventListener("dragover", e => {
|
|
34
|
-
// Отменяем ванильное поведение события
|
|
35
|
-
e.preventDefault()
|
|
36
|
-
console.log('dragover')
|
|
37
|
-
})
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## Как дать возможность фокусироваться на элементе
|
|
45
|
-
|
|
46
|
-
`TabIndex` дает возможность фокусироваться на элементе, нужно просто указать его.
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## `Keydown` событие
|
|
53
|
-
|
|
54
|
-
`Keydown` событие срабатывает только на сфокусированном объекте и всплывает вверх по дереву, пока не встретит слушатель.
|
|
55
|
-
После обработки слушателем идет дальше - искать следующий (если не отменить всплытие).
|
|
1
|
+
[🔙 Назад](../README.md)
|
|
2
|
+
|
|
3
|
+
# Всякие интересные заметки
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Перетаскивание файлов на ios (на других os apple тоже наверное)
|
|
10
|
+
|
|
11
|
+
У *__Apple__* есть система перетаскивания файлов (к примеру изображений).
|
|
12
|
+
|
|
13
|
+
Вот так
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
<img src="./assets/Notes/apple/dragImage.png" style="width:200px;padding: 20px;">
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
И при правильно написанном коде должен быть такой эффект.
|
|
22
|
+
|
|
23
|
+
___
|
|
24
|
+
|
|
25
|
+
<img src="./assets/Notes/apple/dragging.png" style="width:200px;padding: 20px;">
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
Чтобы его получить надо навесить на элемент `dragover` слушатель и обязательно отменить ванильное поведение события.
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
newEl.addEventListener("dragover", e => {
|
|
34
|
+
// Отменяем ванильное поведение события
|
|
35
|
+
e.preventDefault()
|
|
36
|
+
console.log('dragover')
|
|
37
|
+
})
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Как дать возможность фокусироваться на элементе
|
|
45
|
+
|
|
46
|
+
`TabIndex` дает возможность фокусироваться на элементе, нужно просто указать его.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## `Keydown` событие
|
|
53
|
+
|
|
54
|
+
`Keydown` событие срабатывает только на сфокусированном объекте и всплывает вверх по дереву, пока не встретит слушатель.
|
|
55
|
+
После обработки слушателем идет дальше - искать следующий (если не отменить всплытие).
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
## Про `TS`
|
|
60
|
+
|
|
61
|
+
### Бесконечная рекурсия в типах или ***Type instantiation is excessively deep and possibly infinite.***
|
|
62
|
+
|
|
63
|
+
Давайте рассмотрим такой пример рекурсивных типов.
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
type GetBaseKeyChains<P extends string, T> =
|
|
67
|
+
IsAny<T> extends false
|
|
68
|
+
? P | `${P}${GetDeepKeyChains<T> | GetArrayKeyChains<T>}`
|
|
69
|
+
: P | `${P}${'.' | '['}${string}`
|
|
70
|
+
|
|
71
|
+
type GetArrayKeyChains<T> =
|
|
72
|
+
IsArray<T> extends false
|
|
73
|
+
? never
|
|
74
|
+
: ClearArrayType<T> extends infer Arr
|
|
75
|
+
? IsTuple<Arr> extends true
|
|
76
|
+
? {
|
|
77
|
+
[K in Extract<keyof Arr, `${number}`>]: GetBaseKeyChains<`[${K}]`, Arr[K]>
|
|
78
|
+
}[Extract<keyof Arr, `${number}`>]
|
|
79
|
+
: Arr extends any[]
|
|
80
|
+
? `[${number}]` | GetBaseKeyChains<`[${number}]`, Arr[number]>
|
|
81
|
+
: never
|
|
82
|
+
: never
|
|
83
|
+
|
|
84
|
+
type GetDeepKeyChains<T> =
|
|
85
|
+
IsObjectType<T> extends false
|
|
86
|
+
? never
|
|
87
|
+
: ClearObjectType<T> extends infer Form
|
|
88
|
+
? {
|
|
89
|
+
[K in Extract<keyof Form, string>]: GetBaseKeyChains<`.${K}`, Form[K]>
|
|
90
|
+
}[Extract<keyof Form, string>]
|
|
91
|
+
: never
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
export type FormPath<T> = '' |
|
|
95
|
+
(
|
|
96
|
+
IsObjectType<T> extends false
|
|
97
|
+
? GetArrayKeyChains<T>
|
|
98
|
+
: ClearObjectType<T> extends infer Form
|
|
99
|
+
? {
|
|
100
|
+
[K in Extract<keyof Form, string>]: GetBaseKeyChains<`${K}`, Form[K]>
|
|
101
|
+
}[Extract<keyof Form, string>]
|
|
102
|
+
: never
|
|
103
|
+
)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Как видно из примера, `GetBaseKeyChains` вызывает `GetArrayKeyChains` и `GetDeepKeyChains`,
|
|
107
|
+
а они в свою очередь вызывают его, что создаёт рекурсию.
|
|
108
|
+
|
|
109
|
+
Все бы хорошо, тип рабочий, всё правильно делает, но когда ты начинаешь его использовать в других типах,
|
|
110
|
+
которые используются в других типах и т. д., `ts` начинает офигевать от "глубины" наших намерений и предлагает поумерить пыл.
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Ошибка говорит о том, что слишком глубоко и, возможно, бесконечно.
|
|
117
|
+
Чтобы не было бесконечно, у рекурсии обязательно должно быть условие выхода.
|
|
118
|
+
Есть ли оно у этой?
|
|
119
|
+
|
|
120
|
+
Да, есть — `IsObjectType<T> extends false ? never : ...` или `IsArray<T> extends false ? never :` или `IsAny<T> extends false ...`
|
|
121
|
+
|
|
122
|
+
Но почему же `ts` всё равно ругается на `possibly infinite`? Ах да — `excessively deep`, `ts` ленивый.
|
|
123
|
+
Если он видит, что тип вывести слишком тяжело, он такой: "Не братан, по-моему, тут слишком глубоко и бесконечно".
|
|
124
|
+
|
|
125
|
+
На самом деле это круто, что есть такой защитный механизм, но как всё же победить это? Давайте разбираться.
|
|
126
|
+
|
|
127
|
+
Один из способов (и это единственный, который мы рассмотрим, но он довольно логичный и исходит из защиты от слишком
|
|
128
|
+
глубокой рекурсии в нормальных языках программирования) — это ограничить глубину рекурсии.
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
type SafeRecursiveArr = [1, 2, 3, 4, 5]
|
|
132
|
+
type SafeRecursiveStep<T> = T extends [infer _, ...infer Rest] ? Rest : never
|
|
133
|
+
type CanContinueRecursive<T> = SafeRecursiveStep<T> extends never ? false : true
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Здесь мы создали пару конструкций, которые помогут отслеживать возможность продолжать спуск и
|
|
137
|
+
уменьшать счётчик допустимой глубины.
|
|
138
|
+
|
|
139
|
+
Круто, теперь имплементируем это в наши изначальные типы.
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
type GetBaseKeyChains<P extends string, T, SafeArr> =
|
|
143
|
+
CanContinueRecursive<SafeArr> extends false
|
|
144
|
+
? never
|
|
145
|
+
: IsAny<T> extends false
|
|
146
|
+
? P | `${P}${GetDeepKeyChains<T, SafeRecursiveStep<SafeArr>> | GetArrayKeyChains<T, SafeRecursiveStep<SafeArr>>}`
|
|
147
|
+
: P | `${P}${'.' | '['}${string}`
|
|
148
|
+
|
|
149
|
+
type GetArrayKeyChains<T, SafeArr> =
|
|
150
|
+
CanContinueRecursive<SafeArr> extends false
|
|
151
|
+
? never
|
|
152
|
+
: IsArray<T> extends false
|
|
153
|
+
? never
|
|
154
|
+
: ClearArrayType<T> extends infer Arr
|
|
155
|
+
? IsTuple<Arr> extends true
|
|
156
|
+
? {
|
|
157
|
+
[K in Extract<keyof Arr, `${number}`>]: GetBaseKeyChains<`[${K}]`, Arr[K], SafeRecursiveStep<SafeArr>>
|
|
158
|
+
}[Extract<keyof Arr, `${number}`>]
|
|
159
|
+
: Arr extends any[]
|
|
160
|
+
? `[${number}]` | GetBaseKeyChains<`[${number}]`, Arr[number], SafeRecursiveStep<SafeArr>>
|
|
161
|
+
: never
|
|
162
|
+
: never
|
|
163
|
+
|
|
164
|
+
type GetDeepKeyChains<T, SafeArr> =
|
|
165
|
+
CanContinueRecursive<SafeArr> extends false
|
|
166
|
+
? never
|
|
167
|
+
: IsObjectType<T> extends false
|
|
168
|
+
? never
|
|
169
|
+
: ClearObjectType<T> extends infer Form
|
|
170
|
+
? {
|
|
171
|
+
[K in Extract<keyof Form, string>]: GetBaseKeyChains<`.${K}`, Form[K], SafeRecursiveStep<SafeArr>>
|
|
172
|
+
}[Extract<keyof Form, string>]
|
|
173
|
+
: never
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
export type FormPath<T> = '' |
|
|
177
|
+
(
|
|
178
|
+
IsObjectType<T> extends false
|
|
179
|
+
? GetArrayKeyChains<T, SafeRecursiveArr>
|
|
180
|
+
: ClearObjectType<T> extends infer Form
|
|
181
|
+
? {
|
|
182
|
+
[K in Extract<keyof Form, string>]: GetBaseKeyChains<`${K}`, Form[K], SafeRecursiveArr>
|
|
183
|
+
}[Extract<keyof Form, string>]
|
|
184
|
+
: never
|
|
185
|
+
)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Теперь `ts` будет нормально реагировать на использование типа `FormPath` в других типах,
|
|
189
|
+
и можно не бояться увидеть сообщение об ошибке.
|