@dxtmisha/constructor 0.23.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.
- package/LICENSE +21 -0
- package/README.md +136 -0
- package/package.json +124 -0
- package/src/classes/CaptionInclude.ts +71 -0
- package/src/classes/DescriptionInclude.ts +70 -0
- package/src/classes/EnabledInclude.ts +56 -0
- package/src/classes/EventClickInclude.ts +138 -0
- package/src/classes/LabelHighlightInclude.ts +90 -0
- package/src/classes/LabelInclude.ts +171 -0
- package/src/classes/LabelNumberInclude.ts +70 -0
- package/src/classes/ModelInclude.ts +49 -0
- package/src/classes/PrefixInclude.ts +71 -0
- package/src/classes/SuffixInclude.ts +71 -0
- package/src/classes/field/FieldAttributesInclude.ts +100 -0
- package/src/classes/field/FieldChangeInclude.ts +52 -0
- package/src/classes/field/FieldCodeInclude.ts +69 -0
- package/src/classes/field/FieldElementInclude.ts +97 -0
- package/src/classes/field/FieldInputCheckInclude.ts +128 -0
- package/src/classes/field/FieldMatchInclude.ts +101 -0
- package/src/classes/field/FieldPatternInclude.ts +42 -0
- package/src/classes/field/FieldTypeInclude.ts +42 -0
- package/src/classes/field/FieldValidationInclude.ts +196 -0
- package/src/classes/field/FieldValueInclude.ts +318 -0
- package/src/classes/field/FieldVisibilityInclude.ts +21 -0
- package/src/constructors/Badge/Badge.ts +73 -0
- package/src/constructors/Badge/BadgeDesign.tsx +127 -0
- package/src/constructors/Badge/BadgeInclude.ts +78 -0
- package/src/constructors/Badge/basicTypes.ts +15 -0
- package/src/constructors/Badge/index.ts +5 -0
- package/src/constructors/Badge/properties.json +36 -0
- package/src/constructors/Badge/props.ts +43 -0
- package/src/constructors/Badge/style.scss +83 -0
- package/src/constructors/Badge/types.ts +47 -0
- package/src/constructors/Bars/Bars.ts +188 -0
- package/src/constructors/Bars/BarsAction.ts +57 -0
- package/src/constructors/Bars/BarsDesign.tsx +229 -0
- package/src/constructors/Bars/BarsInclude.ts +116 -0
- package/src/constructors/Bars/basicTypes.ts +40 -0
- package/src/constructors/Bars/index.ts +6 -0
- package/src/constructors/Bars/properties.json +6 -0
- package/src/constructors/Bars/props.ts +63 -0
- package/src/constructors/Bars/style.scss +18 -0
- package/src/constructors/Bars/types.ts +58 -0
- package/src/constructors/Button/Button.ts +88 -0
- package/src/constructors/Button/ButtonDesign.tsx +136 -0
- package/src/constructors/Button/ButtonInclude.ts +80 -0
- package/src/constructors/Button/basicTypes.ts +12 -0
- package/src/constructors/Button/index.ts +5 -0
- package/src/constructors/Button/properties.json +84 -0
- package/src/constructors/Button/props.ts +55 -0
- package/src/constructors/Button/style.scss +96 -0
- package/src/constructors/Button/types.ts +56 -0
- package/src/constructors/Cell/Cell.ts +127 -0
- package/src/constructors/Cell/CellDesign.tsx +203 -0
- package/src/constructors/Cell/basicTypes.ts +6 -0
- package/src/constructors/Cell/index.ts +5 -0
- package/src/constructors/Cell/properties.json +52 -0
- package/src/constructors/Cell/props.ts +61 -0
- package/src/constructors/Cell/style.scss +80 -0
- package/src/constructors/Cell/types.ts +68 -0
- package/src/constructors/Chip/Chip.ts +33 -0
- package/src/constructors/Chip/ChipDesign.tsx +26 -0
- package/src/constructors/Chip/basicTypes.ts +0 -0
- package/src/constructors/Chip/index.ts +4 -0
- package/src/constructors/Chip/properties.json +3 -0
- package/src/constructors/Chip/props.ts +44 -0
- package/src/constructors/Chip/style.scss +6 -0
- package/src/constructors/Chip/types.ts +53 -0
- package/src/constructors/Field/Field.ts +147 -0
- package/src/constructors/Field/FieldDesign.tsx +372 -0
- package/src/constructors/Field/FieldIcons.ts +99 -0
- package/src/constructors/Field/FieldInclude.ts +72 -0
- package/src/constructors/Field/FieldSize.ts +93 -0
- package/src/constructors/Field/basicTypes.ts +90 -0
- package/src/constructors/Field/index.ts +5 -0
- package/src/constructors/Field/properties.json +86 -0
- package/src/constructors/Field/props.ts +88 -0
- package/src/constructors/Field/style.scss +556 -0
- package/src/constructors/Field/types.ts +78 -0
- package/src/constructors/FieldCounter/FieldCounter.ts +75 -0
- package/src/constructors/FieldCounter/FieldCounterDesign.tsx +122 -0
- package/src/constructors/FieldCounter/FieldCounterInclude.ts +98 -0
- package/src/constructors/FieldCounter/basicTypes.ts +25 -0
- package/src/constructors/FieldCounter/index.ts +6 -0
- package/src/constructors/FieldCounter/properties.json +3 -0
- package/src/constructors/FieldCounter/props.ts +32 -0
- package/src/constructors/FieldCounter/style.scss +4 -0
- package/src/constructors/FieldCounter/types.ts +42 -0
- package/src/constructors/FieldLabel/FieldLabel.ts +93 -0
- package/src/constructors/FieldLabel/FieldLabelDesign.tsx +156 -0
- package/src/constructors/FieldLabel/FieldLabelInclude.ts +91 -0
- package/src/constructors/FieldLabel/basicTypes.ts +34 -0
- package/src/constructors/FieldLabel/index.ts +6 -0
- package/src/constructors/FieldLabel/properties.json +4 -0
- package/src/constructors/FieldLabel/props.ts +40 -0
- package/src/constructors/FieldLabel/style.scss +10 -0
- package/src/constructors/FieldLabel/types.ts +49 -0
- package/src/constructors/FieldMessage/FieldMessage.ts +79 -0
- package/src/constructors/FieldMessage/FieldMessageDesign.tsx +159 -0
- package/src/constructors/FieldMessage/FieldMessageInclude.ts +105 -0
- package/src/constructors/FieldMessage/FieldMessageMessage.ts +54 -0
- package/src/constructors/FieldMessage/basicTypes.ts +27 -0
- package/src/constructors/FieldMessage/index.ts +6 -0
- package/src/constructors/FieldMessage/properties.json +9 -0
- package/src/constructors/FieldMessage/props.ts +40 -0
- package/src/constructors/FieldMessage/style.scss +13 -0
- package/src/constructors/FieldMessage/types.ts +49 -0
- package/src/constructors/Icon/Icon.ts +105 -0
- package/src/constructors/Icon/IconDesign.tsx +157 -0
- package/src/constructors/Icon/IconInclude.ts +64 -0
- package/src/constructors/Icon/IconLiteInclude.ts +121 -0
- package/src/constructors/Icon/IconTrailingInclude.ts +106 -0
- package/src/constructors/Icon/basicTypes.ts +50 -0
- package/src/constructors/Icon/index.ts +8 -0
- package/src/constructors/Icon/properties.json +25 -0
- package/src/constructors/Icon/props.ts +54 -0
- package/src/constructors/Icon/style.scss +106 -0
- package/src/constructors/Icon/types.ts +46 -0
- package/src/constructors/Image/Image.ts +184 -0
- package/src/constructors/Image/ImageAdaptiveGroup.ts +230 -0
- package/src/constructors/Image/ImageAdaptiveItem.ts +295 -0
- package/src/constructors/Image/ImageBackground.ts +127 -0
- package/src/constructors/Image/ImageCalculation.ts +184 -0
- package/src/constructors/Image/ImageCalculationList.ts +61 -0
- package/src/constructors/Image/ImageCoordinator.ts +104 -0
- package/src/constructors/Image/ImageData.ts +99 -0
- package/src/constructors/Image/ImageDesign.tsx +137 -0
- package/src/constructors/Image/ImageFile.ts +137 -0
- package/src/constructors/Image/ImageInclude.ts +53 -0
- package/src/constructors/Image/ImagePdf.ts +44 -0
- package/src/constructors/Image/ImagePosition.ts +49 -0
- package/src/constructors/Image/ImageType.ts +83 -0
- package/src/constructors/Image/basicTypes.ts +70 -0
- package/src/constructors/Image/index.ts +5 -0
- package/src/constructors/Image/properties.json +17 -0
- package/src/constructors/Image/props.ts +66 -0
- package/src/constructors/Image/style.scss +77 -0
- package/src/constructors/Image/types.ts +49 -0
- package/src/constructors/List/List.ts +267 -0
- package/src/constructors/List/ListControl.ts +194 -0
- package/src/constructors/List/ListDesign.tsx +382 -0
- package/src/constructors/List/ListFocus.ts +196 -0
- package/src/constructors/List/ListGo.ts +283 -0
- package/src/constructors/List/ListSearch.ts +113 -0
- package/src/constructors/List/basicTypes.ts +3 -0
- package/src/constructors/List/index.ts +5 -0
- package/src/constructors/List/properties.json +16 -0
- package/src/constructors/List/props.ts +76 -0
- package/src/constructors/List/style.scss +36 -0
- package/src/constructors/List/types.ts +66 -0
- package/src/constructors/ListGroup/ListGroup.ts +53 -0
- package/src/constructors/ListGroup/ListGroupDesign.tsx +180 -0
- package/src/constructors/ListGroup/ListGroupOpen.ts +56 -0
- package/src/constructors/ListGroup/basicTypes.ts +3 -0
- package/src/constructors/ListGroup/index.ts +5 -0
- package/src/constructors/ListGroup/properties.json +15 -0
- package/src/constructors/ListGroup/props.ts +30 -0
- package/src/constructors/ListGroup/style.scss +18 -0
- package/src/constructors/ListGroup/types.ts +51 -0
- package/src/constructors/ListItem/ListItem.ts +115 -0
- package/src/constructors/ListItem/ListItemDesign.tsx +196 -0
- package/src/constructors/ListItem/basicTypes.ts +3 -0
- package/src/constructors/ListItem/index.ts +5 -0
- package/src/constructors/ListItem/properties.json +52 -0
- package/src/constructors/ListItem/props.ts +78 -0
- package/src/constructors/ListItem/style.scss +152 -0
- package/src/constructors/ListItem/types.ts +78 -0
- package/src/constructors/ListMenu/ListMenu.ts +52 -0
- package/src/constructors/ListMenu/ListMenuDesign.tsx +127 -0
- package/src/constructors/ListMenu/basicTypes.ts +3 -0
- package/src/constructors/ListMenu/index.ts +5 -0
- package/src/constructors/ListMenu/properties.json +19 -0
- package/src/constructors/ListMenu/props.ts +34 -0
- package/src/constructors/ListMenu/style.scss +5 -0
- package/src/constructors/ListMenu/types.ts +54 -0
- package/src/constructors/Mask/Mask.ts +321 -0
- package/src/constructors/Mask/MaskBuffer.ts +89 -0
- package/src/constructors/Mask/MaskCharacter.ts +192 -0
- package/src/constructors/Mask/MaskCharacterLength.ts +40 -0
- package/src/constructors/Mask/MaskData.ts +287 -0
- package/src/constructors/Mask/MaskDate.ts +157 -0
- package/src/constructors/Mask/MaskDesign.tsx +217 -0
- package/src/constructors/Mask/MaskEmit.ts +140 -0
- package/src/constructors/Mask/MaskEvent.ts +347 -0
- package/src/constructors/Mask/MaskFocus.ts +49 -0
- package/src/constructors/Mask/MaskFormat.ts +216 -0
- package/src/constructors/Mask/MaskItem.ts +218 -0
- package/src/constructors/Mask/MaskMatch.ts +73 -0
- package/src/constructors/Mask/MaskPattern.ts +123 -0
- package/src/constructors/Mask/MaskRight.ts +43 -0
- package/src/constructors/Mask/MaskRubber.ts +156 -0
- package/src/constructors/Mask/MaskRubberItem.ts +96 -0
- package/src/constructors/Mask/MaskRubberTransition.ts +50 -0
- package/src/constructors/Mask/MaskSelection.ts +208 -0
- package/src/constructors/Mask/MaskSpecial.ts +179 -0
- package/src/constructors/Mask/MaskType.ts +103 -0
- package/src/constructors/Mask/MaskValidation.ts +102 -0
- package/src/constructors/Mask/MaskValue.ts +225 -0
- package/src/constructors/Mask/MaskValueBasic.ts +87 -0
- package/src/constructors/Mask/MaskView.ts +169 -0
- package/src/constructors/Mask/basicTypes.ts +49 -0
- package/src/constructors/Mask/index.ts +5 -0
- package/src/constructors/Mask/properties.json +29 -0
- package/src/constructors/Mask/props.ts +70 -0
- package/src/constructors/Mask/style.scss +104 -0
- package/src/constructors/Mask/types.ts +71 -0
- package/src/constructors/Menu/Menu.ts +179 -0
- package/src/constructors/Menu/MenuDesign.tsx +244 -0
- package/src/constructors/Menu/MenuInclude.ts +110 -0
- package/src/constructors/Menu/MenuRequest.ts +101 -0
- package/src/constructors/Menu/MenuSearch.ts +49 -0
- package/src/constructors/Menu/MenuValue.ts +73 -0
- package/src/constructors/Menu/MenuWindow.ts +89 -0
- package/src/constructors/Menu/basicTypes.ts +41 -0
- package/src/constructors/Menu/index.ts +6 -0
- package/src/constructors/Menu/properties.json +17 -0
- package/src/constructors/Menu/props.ts +79 -0
- package/src/constructors/Menu/style.scss +17 -0
- package/src/constructors/Menu/types.ts +79 -0
- package/src/constructors/MotionTransform/MotionTransform.ts +87 -0
- package/src/constructors/MotionTransform/MotionTransformClassesInclude.ts +38 -0
- package/src/constructors/MotionTransform/MotionTransformDesign.tsx +242 -0
- package/src/constructors/MotionTransform/MotionTransformElement.ts +220 -0
- package/src/constructors/MotionTransform/MotionTransformEvent.ts +118 -0
- package/src/constructors/MotionTransform/MotionTransformGo.ts +47 -0
- package/src/constructors/MotionTransform/MotionTransformInclude.ts +123 -0
- package/src/constructors/MotionTransform/MotionTransformSize.ts +97 -0
- package/src/constructors/MotionTransform/MotionTransformState.ts +250 -0
- package/src/constructors/MotionTransform/basicTypes.ts +121 -0
- package/src/constructors/MotionTransform/index.ts +7 -0
- package/src/constructors/MotionTransform/properties.json +35 -0
- package/src/constructors/MotionTransform/props.ts +50 -0
- package/src/constructors/MotionTransform/style.scss +180 -0
- package/src/constructors/MotionTransform/types.ts +86 -0
- package/src/constructors/Progress/Progress.ts +184 -0
- package/src/constructors/Progress/ProgressDesign.tsx +175 -0
- package/src/constructors/Progress/ProgressInclude.ts +67 -0
- package/src/constructors/Progress/basicTypes.ts +12 -0
- package/src/constructors/Progress/index.ts +6 -0
- package/src/constructors/Progress/properties.json +47 -0
- package/src/constructors/Progress/props.ts +54 -0
- package/src/constructors/Progress/style.scss +374 -0
- package/src/constructors/Progress/types.ts +43 -0
- package/src/constructors/Ripple/Ripple.ts +46 -0
- package/src/constructors/Ripple/RippleDesign.tsx +112 -0
- package/src/constructors/Ripple/RippleInclude.ts +39 -0
- package/src/constructors/Ripple/RippleItem.ts +62 -0
- package/src/constructors/Ripple/basicTypes.ts +3 -0
- package/src/constructors/Ripple/index.ts +6 -0
- package/src/constructors/Ripple/properties.json +9 -0
- package/src/constructors/Ripple/props.ts +28 -0
- package/src/constructors/Ripple/style.scss +62 -0
- package/src/constructors/Ripple/types.ts +41 -0
- package/src/constructors/Scrollbar/Scrollbar.ts +66 -0
- package/src/constructors/Scrollbar/ScrollbarBorder.ts +243 -0
- package/src/constructors/Scrollbar/ScrollbarDesign.tsx +126 -0
- package/src/constructors/Scrollbar/ScrollbarInclude.ts +80 -0
- package/src/constructors/Scrollbar/basicTypes.ts +42 -0
- package/src/constructors/Scrollbar/index.ts +5 -0
- package/src/constructors/Scrollbar/properties.json +33 -0
- package/src/constructors/Scrollbar/props.ts +37 -0
- package/src/constructors/Scrollbar/style.scss +117 -0
- package/src/constructors/Scrollbar/types.ts +52 -0
- package/src/constructors/Skeleton/Skeleton.ts +86 -0
- package/src/constructors/Skeleton/SkeletonDesign.tsx +117 -0
- package/src/constructors/Skeleton/SkeletonInclude.ts +61 -0
- package/src/constructors/Skeleton/basicTypes.ts +16 -0
- package/src/constructors/Skeleton/const.ts +1 -0
- package/src/constructors/Skeleton/index.ts +6 -0
- package/src/constructors/Skeleton/properties.json +24 -0
- package/src/constructors/Skeleton/props.ts +28 -0
- package/src/constructors/Skeleton/style.scss +112 -0
- package/src/constructors/Skeleton/types.ts +46 -0
- package/src/constructors/Window/Window.ts +212 -0
- package/src/constructors/Window/WindowClasses.ts +180 -0
- package/src/constructors/Window/WindowClassesInclude.ts +39 -0
- package/src/constructors/Window/WindowClient.ts +93 -0
- package/src/constructors/Window/WindowCoordinates.ts +257 -0
- package/src/constructors/Window/WindowDesign.tsx +278 -0
- package/src/constructors/Window/WindowElement.ts +84 -0
- package/src/constructors/Window/WindowEmit.ts +52 -0
- package/src/constructors/Window/WindowEvent.ts +157 -0
- package/src/constructors/Window/WindowFlash.ts +70 -0
- package/src/constructors/Window/WindowHook.ts +110 -0
- package/src/constructors/Window/WindowInclude.ts +134 -0
- package/src/constructors/Window/WindowOpen.ts +292 -0
- package/src/constructors/Window/WindowOrigin.ts +85 -0
- package/src/constructors/Window/WindowPersistent.ts +89 -0
- package/src/constructors/Window/WindowPosition.ts +358 -0
- package/src/constructors/Window/WindowStatic.ts +102 -0
- package/src/constructors/Window/WindowStatus.ts +138 -0
- package/src/constructors/Window/WindowStyles.ts +78 -0
- package/src/constructors/Window/WindowVerification.ts +287 -0
- package/src/constructors/Window/basicTypes.ts +186 -0
- package/src/constructors/Window/index.ts +7 -0
- package/src/constructors/Window/properties.json +236 -0
- package/src/constructors/Window/props.ts +88 -0
- package/src/constructors/Window/style.scss +262 -0
- package/src/constructors/Window/types.ts +124 -0
- package/src/functions/getClassTegAStatic.ts +8 -0
- package/src/library.ts +36 -0
- package/src/types/captionTypes.ts +15 -0
- package/src/types/descriptionTypes.ts +15 -0
- package/src/types/enabledTypes.ts +9 -0
- package/src/types/eventClickTypes.ts +51 -0
- package/src/types/fieldTypes.ts +282 -0
- package/src/types/labelTypes.ts +30 -0
- package/src/types/modelTypes.ts +23 -0
- package/src/types/prefixTypes.ts +15 -0
- package/src/types/suffixTypes.ts +15 -0
- package/src/vite-env.d.ts +1 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { computed, onUnmounted, watch } from 'vue'
|
|
2
|
+
import { EventItem, isDomRuntime, ListData } from '@dxtmisha/functional'
|
|
3
|
+
|
|
4
|
+
import { ListSearch } from './ListSearch'
|
|
5
|
+
import { ListGo } from './ListGo'
|
|
6
|
+
|
|
7
|
+
import type { ListProps } from './props'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Class for managing keyboard navigation and event handling in list components.
|
|
11
|
+
* Provides keyboard shortcuts, search functionality, and navigation controls.
|
|
12
|
+
*
|
|
13
|
+
* Класс для управления навигацией с клавиатуры и обработкой событий в компонентах списка.
|
|
14
|
+
* Предоставляет клавиатурные сокращения, функциональность поиска и элементы управления навигацией.
|
|
15
|
+
*/
|
|
16
|
+
export class ListControl {
|
|
17
|
+
protected event?: EventItem<HTMLElement, any>
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Creates an instance of ListControl for managing keyboard navigation and events.
|
|
21
|
+
*
|
|
22
|
+
* Создает экземпляр ListControl для управления навигацией с клавиатуры и событиями.
|
|
23
|
+
* @param props input data/ входные данные
|
|
24
|
+
* @param search search functionality controller / контроллер функциональности поиска
|
|
25
|
+
* @param data list data manager / менеджер данных списка
|
|
26
|
+
* @param go navigation controller / контроллер навигации
|
|
27
|
+
*/
|
|
28
|
+
constructor(
|
|
29
|
+
protected readonly props: ListProps,
|
|
30
|
+
protected readonly search: ListSearch,
|
|
31
|
+
protected readonly data: ListData,
|
|
32
|
+
protected readonly go: ListGo
|
|
33
|
+
) {
|
|
34
|
+
watch(
|
|
35
|
+
this.isActive,
|
|
36
|
+
(status) => {
|
|
37
|
+
if (status) {
|
|
38
|
+
this.start()
|
|
39
|
+
} else {
|
|
40
|
+
this.stop()
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{ immediate: true }
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
onUnmounted(() => this.stop())
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Checks if the menu is active.
|
|
51
|
+
*
|
|
52
|
+
* Проверяет, активное ли меню.
|
|
53
|
+
*/
|
|
54
|
+
readonly isActive = computed<boolean>(() => {
|
|
55
|
+
return Boolean(this.props.control)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Checks if the event target is not an input.
|
|
60
|
+
*
|
|
61
|
+
* Проверяет, не является ли цель события input.
|
|
62
|
+
* @param target selected element/ выбранный элемент
|
|
63
|
+
*/
|
|
64
|
+
protected isNotInput(target: HTMLElement): boolean {
|
|
65
|
+
return ['INPUT', 'TEXTAREA'].indexOf(target.nodeName) === -1
|
|
66
|
+
|| Boolean(this.getActiveElement())
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Gets the currently active input element with menu control.
|
|
71
|
+
*
|
|
72
|
+
* Получает текущий активный элемент input с управлением меню.
|
|
73
|
+
* @returns active input element or undefined / активный элемент input или undefined
|
|
74
|
+
*/
|
|
75
|
+
protected getActiveElement(): HTMLInputElement | undefined {
|
|
76
|
+
if (isDomRuntime()) {
|
|
77
|
+
const element = document.activeElement as HTMLInputElement
|
|
78
|
+
|
|
79
|
+
if (
|
|
80
|
+
element
|
|
81
|
+
&& element.dataset?.menuControl === '1'
|
|
82
|
+
) {
|
|
83
|
+
return element
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return undefined
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Starts the event.
|
|
92
|
+
*
|
|
93
|
+
* Запускает событие.
|
|
94
|
+
*/
|
|
95
|
+
protected start() {
|
|
96
|
+
if (isDomRuntime()) {
|
|
97
|
+
if (!this.event) {
|
|
98
|
+
this.event = new EventItem<HTMLElement, any>(
|
|
99
|
+
document.body,
|
|
100
|
+
['keydown', 'keypress'],
|
|
101
|
+
this.on
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
this.go.reset()
|
|
106
|
+
this.event.start()
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Stops the event.
|
|
112
|
+
*
|
|
113
|
+
* Останавливает событие.
|
|
114
|
+
*/
|
|
115
|
+
protected stop() {
|
|
116
|
+
if (this.event) {
|
|
117
|
+
this.event.stop()
|
|
118
|
+
this.event = undefined
|
|
119
|
+
this.go.stop()
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Updates the search value based on keyboard input.
|
|
125
|
+
*
|
|
126
|
+
* Обновляет значение поиска на основе ввода с клавиатуры.
|
|
127
|
+
* @param event keyboard event / событие клавиатуры
|
|
128
|
+
*/
|
|
129
|
+
protected updateSearch(event: KeyboardEvent) {
|
|
130
|
+
const element = this.getActiveElement()
|
|
131
|
+
|
|
132
|
+
if (element) {
|
|
133
|
+
requestAnimationFrame(() => this.search.set(element.value))
|
|
134
|
+
} else {
|
|
135
|
+
this.search.add(event.key)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Method for tracking keys when a window is open.
|
|
141
|
+
*
|
|
142
|
+
* Метод для отслеживания нажатий при открытом окне.
|
|
143
|
+
* @param event event object/ объект события
|
|
144
|
+
*/
|
|
145
|
+
protected readonly on = (event: KeyboardEvent) => {
|
|
146
|
+
if (
|
|
147
|
+
this.isNotInput(event.target as HTMLElement)
|
|
148
|
+
&& this.data.getLength()
|
|
149
|
+
) {
|
|
150
|
+
if (event.type === 'keypress') {
|
|
151
|
+
this.updateSearch(event)
|
|
152
|
+
} else {
|
|
153
|
+
const key = event.code || event.key || (event as any).keyCode
|
|
154
|
+
|
|
155
|
+
switch (key) {
|
|
156
|
+
case 'Backspace':
|
|
157
|
+
case 8:
|
|
158
|
+
this.updateSearch(event)
|
|
159
|
+
break
|
|
160
|
+
case 'ArrowUp':
|
|
161
|
+
case 38:
|
|
162
|
+
event.preventDefault()
|
|
163
|
+
this.go.previous()
|
|
164
|
+
break
|
|
165
|
+
case 'ArrowDown':
|
|
166
|
+
case 40:
|
|
167
|
+
event.preventDefault()
|
|
168
|
+
this.go.next()
|
|
169
|
+
break
|
|
170
|
+
case 'Enter':
|
|
171
|
+
case 'ArrowRight':
|
|
172
|
+
case ' ':
|
|
173
|
+
case 13:
|
|
174
|
+
case 39:
|
|
175
|
+
event.preventDefault()
|
|
176
|
+
this.go.open()
|
|
177
|
+
break
|
|
178
|
+
case 'ArrowLeft':
|
|
179
|
+
case 37:
|
|
180
|
+
event.preventDefault()
|
|
181
|
+
this.go.close()
|
|
182
|
+
break
|
|
183
|
+
case 'Space':
|
|
184
|
+
case 32:
|
|
185
|
+
if (!this.getActiveElement()) {
|
|
186
|
+
event.preventDefault()
|
|
187
|
+
this.go.open()
|
|
188
|
+
}
|
|
189
|
+
break
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { h, type VNode } from 'vue'
|
|
2
|
+
import {
|
|
3
|
+
type ConstrOptions,
|
|
4
|
+
type ConstrStyles,
|
|
5
|
+
DesignConstructorAbstract,
|
|
6
|
+
isObject,
|
|
7
|
+
type ListDataItem,
|
|
8
|
+
type ListList,
|
|
9
|
+
type ListType,
|
|
10
|
+
toBinds
|
|
11
|
+
} from '@dxtmisha/functional'
|
|
12
|
+
|
|
13
|
+
import { List } from './List'
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
type ListPropsBasic
|
|
17
|
+
} from './props'
|
|
18
|
+
import {
|
|
19
|
+
type ListClasses,
|
|
20
|
+
type ListComponents,
|
|
21
|
+
type ListEmits,
|
|
22
|
+
type ListExpose,
|
|
23
|
+
type ListSlots
|
|
24
|
+
} from './types'
|
|
25
|
+
import type { WindowControlItem } from '../Window'
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* ListDesign
|
|
29
|
+
*/
|
|
30
|
+
export class ListDesign<
|
|
31
|
+
COMP extends ListComponents,
|
|
32
|
+
EXPOSE extends ListExpose,
|
|
33
|
+
CLASSES extends ListClasses,
|
|
34
|
+
P extends ListPropsBasic
|
|
35
|
+
> extends DesignConstructorAbstract<
|
|
36
|
+
HTMLDivElement,
|
|
37
|
+
COMP,
|
|
38
|
+
ListEmits,
|
|
39
|
+
EXPOSE,
|
|
40
|
+
ListSlots,
|
|
41
|
+
CLASSES,
|
|
42
|
+
P
|
|
43
|
+
> {
|
|
44
|
+
protected readonly item: List
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Constructor
|
|
48
|
+
* @param name class name/ название класса
|
|
49
|
+
* @param props properties/ свойства
|
|
50
|
+
* @param options list of additional parameters/ список дополнительных параметров
|
|
51
|
+
*/
|
|
52
|
+
constructor(
|
|
53
|
+
name: string,
|
|
54
|
+
props: Readonly<P>,
|
|
55
|
+
options?: ConstrOptions<COMP, ListEmits, P>
|
|
56
|
+
) {
|
|
57
|
+
super(
|
|
58
|
+
name,
|
|
59
|
+
props,
|
|
60
|
+
options
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
this.item = new List(
|
|
64
|
+
this.props,
|
|
65
|
+
this.refs,
|
|
66
|
+
this.element,
|
|
67
|
+
this.getDesign(),
|
|
68
|
+
this.getName(),
|
|
69
|
+
this.components,
|
|
70
|
+
this.slots,
|
|
71
|
+
this.emits
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
this.init()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Initialization of all the necessary properties for work
|
|
79
|
+
*
|
|
80
|
+
* Инициализация всех необходимых свойств для работы.
|
|
81
|
+
*/
|
|
82
|
+
protected initExpose(): EXPOSE {
|
|
83
|
+
return {
|
|
84
|
+
isSelected: this.item.data.isSelected,
|
|
85
|
+
selectedList: this.item.data.selectedList,
|
|
86
|
+
selectedNames: this.item.data.selectedNames,
|
|
87
|
+
selectedValues: this.item.data.selectedValues
|
|
88
|
+
} as EXPOSE
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Improvement of the obtained list of classes.
|
|
93
|
+
*
|
|
94
|
+
* Доработка полученного списка классов.
|
|
95
|
+
*/
|
|
96
|
+
protected initClasses(): Partial<CLASSES> {
|
|
97
|
+
return {
|
|
98
|
+
main: {},
|
|
99
|
+
...{
|
|
100
|
+
// :classes [!] System label / Системная метка
|
|
101
|
+
space: this.getSubClass('space'),
|
|
102
|
+
line: this.getSubClass('line'),
|
|
103
|
+
subtitle: this.getSubClass('subtitle'),
|
|
104
|
+
html: this.getSubClass('html'),
|
|
105
|
+
management: this.getSubClass('management'),
|
|
106
|
+
group: this.getSubClass('group'),
|
|
107
|
+
menu: this.getSubClass('menu'),
|
|
108
|
+
menuGroup: this.getSubClass('menuGroup')
|
|
109
|
+
// :classes [!] System label / Системная метка
|
|
110
|
+
}
|
|
111
|
+
} as Partial<CLASSES>
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Refinement of the received list of styles.
|
|
116
|
+
*
|
|
117
|
+
* Доработка полученного списка стилей.
|
|
118
|
+
*/
|
|
119
|
+
protected initStyles(): ConstrStyles {
|
|
120
|
+
return {}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* A method for rendering.
|
|
125
|
+
*
|
|
126
|
+
* Метод для рендеринга.
|
|
127
|
+
*/
|
|
128
|
+
protected initRender(): VNode {
|
|
129
|
+
return h(
|
|
130
|
+
'div',
|
|
131
|
+
{
|
|
132
|
+
...this.getAttrs(),
|
|
133
|
+
ref: this.element,
|
|
134
|
+
class: this.classes?.value.main
|
|
135
|
+
},
|
|
136
|
+
this.renderData()
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Generates all elements from the list.
|
|
142
|
+
*
|
|
143
|
+
* Генерирует все элементы из списка.
|
|
144
|
+
*/
|
|
145
|
+
readonly renderData = (): VNode[] => {
|
|
146
|
+
return this.renderDataByItem('item', this.item.list.value, true)
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Generates an element.
|
|
151
|
+
*
|
|
152
|
+
* Генерирует элемент.
|
|
153
|
+
* @param type type of list/ тип списка
|
|
154
|
+
* @param item selected element/ выбранный элемент
|
|
155
|
+
*/
|
|
156
|
+
readonly renderItem = (
|
|
157
|
+
type: ListType,
|
|
158
|
+
item: ListDataItem
|
|
159
|
+
): VNode => {
|
|
160
|
+
return this.components.renderOne(
|
|
161
|
+
'listItem',
|
|
162
|
+
this.getItemAttrs(type, item)
|
|
163
|
+
) as VNode
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Generates a group element.
|
|
168
|
+
*
|
|
169
|
+
* Генерирует групповой элемент.
|
|
170
|
+
* @param item selected element/ выбранный элемент
|
|
171
|
+
* @param open is the group open/ открыта ли группа
|
|
172
|
+
*/
|
|
173
|
+
readonly renderItemGroup = (item: ListDataItem, open: boolean): VNode => {
|
|
174
|
+
return this.components.renderOne(
|
|
175
|
+
'listItem',
|
|
176
|
+
this.item.getItemManagementFormGroup(item, open)
|
|
177
|
+
) as VNode
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Generates a menu element.
|
|
182
|
+
*
|
|
183
|
+
* Генерирует элемент меню.
|
|
184
|
+
* @param item selected element/ выбранный элемент
|
|
185
|
+
* @param props data for working with the menu/ данные для работы с меню
|
|
186
|
+
*/
|
|
187
|
+
readonly renderItemMenu = (
|
|
188
|
+
item: ListDataItem,
|
|
189
|
+
props: WindowControlItem
|
|
190
|
+
): VNode => {
|
|
191
|
+
return this.components.renderOne(
|
|
192
|
+
'listItem',
|
|
193
|
+
toBinds(
|
|
194
|
+
this.item.getItemManagementFormMenu(item, Boolean(props.open.value)),
|
|
195
|
+
props.binds
|
|
196
|
+
)
|
|
197
|
+
) as VNode
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Generates a break between elements.
|
|
202
|
+
*
|
|
203
|
+
* Генерирует разрыв между элементами.
|
|
204
|
+
* @param item selected element/ выбранный элемент
|
|
205
|
+
*/
|
|
206
|
+
readonly renderSpace = (item: ListDataItem): VNode => {
|
|
207
|
+
return h('div', {
|
|
208
|
+
key: item.value,
|
|
209
|
+
class: [
|
|
210
|
+
this.classes?.value.space,
|
|
211
|
+
this.item.windowClasses.get().static
|
|
212
|
+
]
|
|
213
|
+
})
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Generates a dividing line.
|
|
218
|
+
*
|
|
219
|
+
* Генерирует линию разделения.
|
|
220
|
+
* @param item selected element/ выбранный элемент
|
|
221
|
+
*/
|
|
222
|
+
readonly renderLine = (item: ListDataItem): VNode => {
|
|
223
|
+
return h('div', {
|
|
224
|
+
key: item.value,
|
|
225
|
+
class: [
|
|
226
|
+
this.classes?.value.line,
|
|
227
|
+
this.item.windowClasses.get().static
|
|
228
|
+
]
|
|
229
|
+
})
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Generates a subtitle.
|
|
234
|
+
*
|
|
235
|
+
* Генерирует подзаголовок.
|
|
236
|
+
* @param item selected element/ выбранный элемент
|
|
237
|
+
*/
|
|
238
|
+
readonly renderSubtitle = (item: ListDataItem): VNode => {
|
|
239
|
+
return h('div', {
|
|
240
|
+
key: item.value,
|
|
241
|
+
class: [
|
|
242
|
+
this.classes?.value.subtitle,
|
|
243
|
+
this.item.windowClasses.get().static
|
|
244
|
+
]
|
|
245
|
+
}, item.label)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Generates HTML code by the slot name or the value of the `label` field.
|
|
250
|
+
*
|
|
251
|
+
* Генерирует HTML-код по названию слота или значению поля `label`.
|
|
252
|
+
* @param item selected element/ выбранный элемент
|
|
253
|
+
*/
|
|
254
|
+
readonly renderHtml = (item: ListDataItem): VNode => {
|
|
255
|
+
const props = {
|
|
256
|
+
key: item.label && isObject(item.value) ? item.label : item.value,
|
|
257
|
+
class: [
|
|
258
|
+
this.classes?.value.html,
|
|
259
|
+
this.item.windowClasses.get().static
|
|
260
|
+
]
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (
|
|
264
|
+
this.slots
|
|
265
|
+
&& item.value in this.slots
|
|
266
|
+
) {
|
|
267
|
+
return h('div', props, this.initSlot(item.value))
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return h('div', {
|
|
271
|
+
...props,
|
|
272
|
+
innerHTML: item.label
|
|
273
|
+
})
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Generates a group of lists.
|
|
278
|
+
*
|
|
279
|
+
* Генерирует группу списков.
|
|
280
|
+
* @param item selected element/ выбранный элемент
|
|
281
|
+
*/
|
|
282
|
+
readonly renderGroup = (item: ListDataItem): VNode => {
|
|
283
|
+
return this.components.renderOne(
|
|
284
|
+
'listGroup',
|
|
285
|
+
{
|
|
286
|
+
open: this.item.isOpenGroup(item),
|
|
287
|
+
divider: this.props.divider
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
head: ({ open }: { open: boolean }) => this.renderItemGroup(item, open),
|
|
291
|
+
list: () => this.renderDataByItem('group', this.item.getList(item))
|
|
292
|
+
}
|
|
293
|
+
) as VNode
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Generates a menu of lists.
|
|
298
|
+
*
|
|
299
|
+
* Генерирует меню списков.
|
|
300
|
+
* @param item selected element/ выбранный элемент
|
|
301
|
+
* @param first is the first element/ является ли первым элементом
|
|
302
|
+
*/
|
|
303
|
+
readonly renderMenu = (item: ListDataItem, first: boolean): VNode => {
|
|
304
|
+
return this.components.renderOne(
|
|
305
|
+
'listMenu',
|
|
306
|
+
{
|
|
307
|
+
divider: this.props.divider,
|
|
308
|
+
axis: first ? (this.props.axis === 'x' ? 'y' : 'x') : 'x'
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
head: (props: WindowControlItem) => this.renderItemMenu(item, props),
|
|
312
|
+
list: () => this.renderDataByItem('menu', this.item.getList(item))
|
|
313
|
+
}
|
|
314
|
+
) as VNode
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Returns binding properties for the item.
|
|
319
|
+
*
|
|
320
|
+
* Возвращает привязочные свойства для элемента.
|
|
321
|
+
* @param type type of list/ тип списка
|
|
322
|
+
* @param item selected element/ выбранный элемент
|
|
323
|
+
*/
|
|
324
|
+
protected getItemAttrs(
|
|
325
|
+
type: ListType,
|
|
326
|
+
item: ListDataItem
|
|
327
|
+
) {
|
|
328
|
+
switch (type) {
|
|
329
|
+
case 'group':
|
|
330
|
+
return this.item.getItemGroup(item)
|
|
331
|
+
case 'menu':
|
|
332
|
+
return this.item.getItemMenu(item)
|
|
333
|
+
default:
|
|
334
|
+
return this.item.getItem(item)
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Generates all elements from the list.
|
|
340
|
+
*
|
|
341
|
+
* Генерирует все элементы из списка.
|
|
342
|
+
* @param type type of list/ тип списка
|
|
343
|
+
* @param data selected element/ выбранный элемент
|
|
344
|
+
* @param first is the first element/ является ли первым элементом
|
|
345
|
+
*/
|
|
346
|
+
protected renderDataByItem(
|
|
347
|
+
type: ListType,
|
|
348
|
+
data: ListList,
|
|
349
|
+
first: boolean = false
|
|
350
|
+
): VNode[] {
|
|
351
|
+
const children: VNode[] = []
|
|
352
|
+
|
|
353
|
+
data.forEach((item) => {
|
|
354
|
+
switch (item.type) {
|
|
355
|
+
case 'space':
|
|
356
|
+
children.push(this.renderSpace(item))
|
|
357
|
+
break
|
|
358
|
+
case 'line':
|
|
359
|
+
children.push(this.renderLine(item))
|
|
360
|
+
break
|
|
361
|
+
case 'subtitle':
|
|
362
|
+
children.push(this.renderSubtitle(item))
|
|
363
|
+
break
|
|
364
|
+
case 'html':
|
|
365
|
+
children.push(this.renderHtml(item))
|
|
366
|
+
break
|
|
367
|
+
case 'group':
|
|
368
|
+
children.push(this.renderGroup(item))
|
|
369
|
+
break
|
|
370
|
+
case 'menu':
|
|
371
|
+
children.push(this.renderMenu(item, first))
|
|
372
|
+
break
|
|
373
|
+
default:
|
|
374
|
+
children.push(this.renderItem(type, item))
|
|
375
|
+
break
|
|
376
|
+
}
|
|
377
|
+
})
|
|
378
|
+
|
|
379
|
+
children.push(h('div'))
|
|
380
|
+
return children
|
|
381
|
+
}
|
|
382
|
+
}
|