@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.
Files changed (311) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/package.json +124 -0
  4. package/src/classes/CaptionInclude.ts +71 -0
  5. package/src/classes/DescriptionInclude.ts +70 -0
  6. package/src/classes/EnabledInclude.ts +56 -0
  7. package/src/classes/EventClickInclude.ts +138 -0
  8. package/src/classes/LabelHighlightInclude.ts +90 -0
  9. package/src/classes/LabelInclude.ts +171 -0
  10. package/src/classes/LabelNumberInclude.ts +70 -0
  11. package/src/classes/ModelInclude.ts +49 -0
  12. package/src/classes/PrefixInclude.ts +71 -0
  13. package/src/classes/SuffixInclude.ts +71 -0
  14. package/src/classes/field/FieldAttributesInclude.ts +100 -0
  15. package/src/classes/field/FieldChangeInclude.ts +52 -0
  16. package/src/classes/field/FieldCodeInclude.ts +69 -0
  17. package/src/classes/field/FieldElementInclude.ts +97 -0
  18. package/src/classes/field/FieldInputCheckInclude.ts +128 -0
  19. package/src/classes/field/FieldMatchInclude.ts +101 -0
  20. package/src/classes/field/FieldPatternInclude.ts +42 -0
  21. package/src/classes/field/FieldTypeInclude.ts +42 -0
  22. package/src/classes/field/FieldValidationInclude.ts +196 -0
  23. package/src/classes/field/FieldValueInclude.ts +318 -0
  24. package/src/classes/field/FieldVisibilityInclude.ts +21 -0
  25. package/src/constructors/Badge/Badge.ts +73 -0
  26. package/src/constructors/Badge/BadgeDesign.tsx +127 -0
  27. package/src/constructors/Badge/BadgeInclude.ts +78 -0
  28. package/src/constructors/Badge/basicTypes.ts +15 -0
  29. package/src/constructors/Badge/index.ts +5 -0
  30. package/src/constructors/Badge/properties.json +36 -0
  31. package/src/constructors/Badge/props.ts +43 -0
  32. package/src/constructors/Badge/style.scss +83 -0
  33. package/src/constructors/Badge/types.ts +47 -0
  34. package/src/constructors/Bars/Bars.ts +188 -0
  35. package/src/constructors/Bars/BarsAction.ts +57 -0
  36. package/src/constructors/Bars/BarsDesign.tsx +229 -0
  37. package/src/constructors/Bars/BarsInclude.ts +116 -0
  38. package/src/constructors/Bars/basicTypes.ts +40 -0
  39. package/src/constructors/Bars/index.ts +6 -0
  40. package/src/constructors/Bars/properties.json +6 -0
  41. package/src/constructors/Bars/props.ts +63 -0
  42. package/src/constructors/Bars/style.scss +18 -0
  43. package/src/constructors/Bars/types.ts +58 -0
  44. package/src/constructors/Button/Button.ts +88 -0
  45. package/src/constructors/Button/ButtonDesign.tsx +136 -0
  46. package/src/constructors/Button/ButtonInclude.ts +80 -0
  47. package/src/constructors/Button/basicTypes.ts +12 -0
  48. package/src/constructors/Button/index.ts +5 -0
  49. package/src/constructors/Button/properties.json +84 -0
  50. package/src/constructors/Button/props.ts +55 -0
  51. package/src/constructors/Button/style.scss +96 -0
  52. package/src/constructors/Button/types.ts +56 -0
  53. package/src/constructors/Cell/Cell.ts +127 -0
  54. package/src/constructors/Cell/CellDesign.tsx +203 -0
  55. package/src/constructors/Cell/basicTypes.ts +6 -0
  56. package/src/constructors/Cell/index.ts +5 -0
  57. package/src/constructors/Cell/properties.json +52 -0
  58. package/src/constructors/Cell/props.ts +61 -0
  59. package/src/constructors/Cell/style.scss +80 -0
  60. package/src/constructors/Cell/types.ts +68 -0
  61. package/src/constructors/Chip/Chip.ts +33 -0
  62. package/src/constructors/Chip/ChipDesign.tsx +26 -0
  63. package/src/constructors/Chip/basicTypes.ts +0 -0
  64. package/src/constructors/Chip/index.ts +4 -0
  65. package/src/constructors/Chip/properties.json +3 -0
  66. package/src/constructors/Chip/props.ts +44 -0
  67. package/src/constructors/Chip/style.scss +6 -0
  68. package/src/constructors/Chip/types.ts +53 -0
  69. package/src/constructors/Field/Field.ts +147 -0
  70. package/src/constructors/Field/FieldDesign.tsx +372 -0
  71. package/src/constructors/Field/FieldIcons.ts +99 -0
  72. package/src/constructors/Field/FieldInclude.ts +72 -0
  73. package/src/constructors/Field/FieldSize.ts +93 -0
  74. package/src/constructors/Field/basicTypes.ts +90 -0
  75. package/src/constructors/Field/index.ts +5 -0
  76. package/src/constructors/Field/properties.json +86 -0
  77. package/src/constructors/Field/props.ts +88 -0
  78. package/src/constructors/Field/style.scss +556 -0
  79. package/src/constructors/Field/types.ts +78 -0
  80. package/src/constructors/FieldCounter/FieldCounter.ts +75 -0
  81. package/src/constructors/FieldCounter/FieldCounterDesign.tsx +122 -0
  82. package/src/constructors/FieldCounter/FieldCounterInclude.ts +98 -0
  83. package/src/constructors/FieldCounter/basicTypes.ts +25 -0
  84. package/src/constructors/FieldCounter/index.ts +6 -0
  85. package/src/constructors/FieldCounter/properties.json +3 -0
  86. package/src/constructors/FieldCounter/props.ts +32 -0
  87. package/src/constructors/FieldCounter/style.scss +4 -0
  88. package/src/constructors/FieldCounter/types.ts +42 -0
  89. package/src/constructors/FieldLabel/FieldLabel.ts +93 -0
  90. package/src/constructors/FieldLabel/FieldLabelDesign.tsx +156 -0
  91. package/src/constructors/FieldLabel/FieldLabelInclude.ts +91 -0
  92. package/src/constructors/FieldLabel/basicTypes.ts +34 -0
  93. package/src/constructors/FieldLabel/index.ts +6 -0
  94. package/src/constructors/FieldLabel/properties.json +4 -0
  95. package/src/constructors/FieldLabel/props.ts +40 -0
  96. package/src/constructors/FieldLabel/style.scss +10 -0
  97. package/src/constructors/FieldLabel/types.ts +49 -0
  98. package/src/constructors/FieldMessage/FieldMessage.ts +79 -0
  99. package/src/constructors/FieldMessage/FieldMessageDesign.tsx +159 -0
  100. package/src/constructors/FieldMessage/FieldMessageInclude.ts +105 -0
  101. package/src/constructors/FieldMessage/FieldMessageMessage.ts +54 -0
  102. package/src/constructors/FieldMessage/basicTypes.ts +27 -0
  103. package/src/constructors/FieldMessage/index.ts +6 -0
  104. package/src/constructors/FieldMessage/properties.json +9 -0
  105. package/src/constructors/FieldMessage/props.ts +40 -0
  106. package/src/constructors/FieldMessage/style.scss +13 -0
  107. package/src/constructors/FieldMessage/types.ts +49 -0
  108. package/src/constructors/Icon/Icon.ts +105 -0
  109. package/src/constructors/Icon/IconDesign.tsx +157 -0
  110. package/src/constructors/Icon/IconInclude.ts +64 -0
  111. package/src/constructors/Icon/IconLiteInclude.ts +121 -0
  112. package/src/constructors/Icon/IconTrailingInclude.ts +106 -0
  113. package/src/constructors/Icon/basicTypes.ts +50 -0
  114. package/src/constructors/Icon/index.ts +8 -0
  115. package/src/constructors/Icon/properties.json +25 -0
  116. package/src/constructors/Icon/props.ts +54 -0
  117. package/src/constructors/Icon/style.scss +106 -0
  118. package/src/constructors/Icon/types.ts +46 -0
  119. package/src/constructors/Image/Image.ts +184 -0
  120. package/src/constructors/Image/ImageAdaptiveGroup.ts +230 -0
  121. package/src/constructors/Image/ImageAdaptiveItem.ts +295 -0
  122. package/src/constructors/Image/ImageBackground.ts +127 -0
  123. package/src/constructors/Image/ImageCalculation.ts +184 -0
  124. package/src/constructors/Image/ImageCalculationList.ts +61 -0
  125. package/src/constructors/Image/ImageCoordinator.ts +104 -0
  126. package/src/constructors/Image/ImageData.ts +99 -0
  127. package/src/constructors/Image/ImageDesign.tsx +137 -0
  128. package/src/constructors/Image/ImageFile.ts +137 -0
  129. package/src/constructors/Image/ImageInclude.ts +53 -0
  130. package/src/constructors/Image/ImagePdf.ts +44 -0
  131. package/src/constructors/Image/ImagePosition.ts +49 -0
  132. package/src/constructors/Image/ImageType.ts +83 -0
  133. package/src/constructors/Image/basicTypes.ts +70 -0
  134. package/src/constructors/Image/index.ts +5 -0
  135. package/src/constructors/Image/properties.json +17 -0
  136. package/src/constructors/Image/props.ts +66 -0
  137. package/src/constructors/Image/style.scss +77 -0
  138. package/src/constructors/Image/types.ts +49 -0
  139. package/src/constructors/List/List.ts +267 -0
  140. package/src/constructors/List/ListControl.ts +194 -0
  141. package/src/constructors/List/ListDesign.tsx +382 -0
  142. package/src/constructors/List/ListFocus.ts +196 -0
  143. package/src/constructors/List/ListGo.ts +283 -0
  144. package/src/constructors/List/ListSearch.ts +113 -0
  145. package/src/constructors/List/basicTypes.ts +3 -0
  146. package/src/constructors/List/index.ts +5 -0
  147. package/src/constructors/List/properties.json +16 -0
  148. package/src/constructors/List/props.ts +76 -0
  149. package/src/constructors/List/style.scss +36 -0
  150. package/src/constructors/List/types.ts +66 -0
  151. package/src/constructors/ListGroup/ListGroup.ts +53 -0
  152. package/src/constructors/ListGroup/ListGroupDesign.tsx +180 -0
  153. package/src/constructors/ListGroup/ListGroupOpen.ts +56 -0
  154. package/src/constructors/ListGroup/basicTypes.ts +3 -0
  155. package/src/constructors/ListGroup/index.ts +5 -0
  156. package/src/constructors/ListGroup/properties.json +15 -0
  157. package/src/constructors/ListGroup/props.ts +30 -0
  158. package/src/constructors/ListGroup/style.scss +18 -0
  159. package/src/constructors/ListGroup/types.ts +51 -0
  160. package/src/constructors/ListItem/ListItem.ts +115 -0
  161. package/src/constructors/ListItem/ListItemDesign.tsx +196 -0
  162. package/src/constructors/ListItem/basicTypes.ts +3 -0
  163. package/src/constructors/ListItem/index.ts +5 -0
  164. package/src/constructors/ListItem/properties.json +52 -0
  165. package/src/constructors/ListItem/props.ts +78 -0
  166. package/src/constructors/ListItem/style.scss +152 -0
  167. package/src/constructors/ListItem/types.ts +78 -0
  168. package/src/constructors/ListMenu/ListMenu.ts +52 -0
  169. package/src/constructors/ListMenu/ListMenuDesign.tsx +127 -0
  170. package/src/constructors/ListMenu/basicTypes.ts +3 -0
  171. package/src/constructors/ListMenu/index.ts +5 -0
  172. package/src/constructors/ListMenu/properties.json +19 -0
  173. package/src/constructors/ListMenu/props.ts +34 -0
  174. package/src/constructors/ListMenu/style.scss +5 -0
  175. package/src/constructors/ListMenu/types.ts +54 -0
  176. package/src/constructors/Mask/Mask.ts +321 -0
  177. package/src/constructors/Mask/MaskBuffer.ts +89 -0
  178. package/src/constructors/Mask/MaskCharacter.ts +192 -0
  179. package/src/constructors/Mask/MaskCharacterLength.ts +40 -0
  180. package/src/constructors/Mask/MaskData.ts +287 -0
  181. package/src/constructors/Mask/MaskDate.ts +157 -0
  182. package/src/constructors/Mask/MaskDesign.tsx +217 -0
  183. package/src/constructors/Mask/MaskEmit.ts +140 -0
  184. package/src/constructors/Mask/MaskEvent.ts +347 -0
  185. package/src/constructors/Mask/MaskFocus.ts +49 -0
  186. package/src/constructors/Mask/MaskFormat.ts +216 -0
  187. package/src/constructors/Mask/MaskItem.ts +218 -0
  188. package/src/constructors/Mask/MaskMatch.ts +73 -0
  189. package/src/constructors/Mask/MaskPattern.ts +123 -0
  190. package/src/constructors/Mask/MaskRight.ts +43 -0
  191. package/src/constructors/Mask/MaskRubber.ts +156 -0
  192. package/src/constructors/Mask/MaskRubberItem.ts +96 -0
  193. package/src/constructors/Mask/MaskRubberTransition.ts +50 -0
  194. package/src/constructors/Mask/MaskSelection.ts +208 -0
  195. package/src/constructors/Mask/MaskSpecial.ts +179 -0
  196. package/src/constructors/Mask/MaskType.ts +103 -0
  197. package/src/constructors/Mask/MaskValidation.ts +102 -0
  198. package/src/constructors/Mask/MaskValue.ts +225 -0
  199. package/src/constructors/Mask/MaskValueBasic.ts +87 -0
  200. package/src/constructors/Mask/MaskView.ts +169 -0
  201. package/src/constructors/Mask/basicTypes.ts +49 -0
  202. package/src/constructors/Mask/index.ts +5 -0
  203. package/src/constructors/Mask/properties.json +29 -0
  204. package/src/constructors/Mask/props.ts +70 -0
  205. package/src/constructors/Mask/style.scss +104 -0
  206. package/src/constructors/Mask/types.ts +71 -0
  207. package/src/constructors/Menu/Menu.ts +179 -0
  208. package/src/constructors/Menu/MenuDesign.tsx +244 -0
  209. package/src/constructors/Menu/MenuInclude.ts +110 -0
  210. package/src/constructors/Menu/MenuRequest.ts +101 -0
  211. package/src/constructors/Menu/MenuSearch.ts +49 -0
  212. package/src/constructors/Menu/MenuValue.ts +73 -0
  213. package/src/constructors/Menu/MenuWindow.ts +89 -0
  214. package/src/constructors/Menu/basicTypes.ts +41 -0
  215. package/src/constructors/Menu/index.ts +6 -0
  216. package/src/constructors/Menu/properties.json +17 -0
  217. package/src/constructors/Menu/props.ts +79 -0
  218. package/src/constructors/Menu/style.scss +17 -0
  219. package/src/constructors/Menu/types.ts +79 -0
  220. package/src/constructors/MotionTransform/MotionTransform.ts +87 -0
  221. package/src/constructors/MotionTransform/MotionTransformClassesInclude.ts +38 -0
  222. package/src/constructors/MotionTransform/MotionTransformDesign.tsx +242 -0
  223. package/src/constructors/MotionTransform/MotionTransformElement.ts +220 -0
  224. package/src/constructors/MotionTransform/MotionTransformEvent.ts +118 -0
  225. package/src/constructors/MotionTransform/MotionTransformGo.ts +47 -0
  226. package/src/constructors/MotionTransform/MotionTransformInclude.ts +123 -0
  227. package/src/constructors/MotionTransform/MotionTransformSize.ts +97 -0
  228. package/src/constructors/MotionTransform/MotionTransformState.ts +250 -0
  229. package/src/constructors/MotionTransform/basicTypes.ts +121 -0
  230. package/src/constructors/MotionTransform/index.ts +7 -0
  231. package/src/constructors/MotionTransform/properties.json +35 -0
  232. package/src/constructors/MotionTransform/props.ts +50 -0
  233. package/src/constructors/MotionTransform/style.scss +180 -0
  234. package/src/constructors/MotionTransform/types.ts +86 -0
  235. package/src/constructors/Progress/Progress.ts +184 -0
  236. package/src/constructors/Progress/ProgressDesign.tsx +175 -0
  237. package/src/constructors/Progress/ProgressInclude.ts +67 -0
  238. package/src/constructors/Progress/basicTypes.ts +12 -0
  239. package/src/constructors/Progress/index.ts +6 -0
  240. package/src/constructors/Progress/properties.json +47 -0
  241. package/src/constructors/Progress/props.ts +54 -0
  242. package/src/constructors/Progress/style.scss +374 -0
  243. package/src/constructors/Progress/types.ts +43 -0
  244. package/src/constructors/Ripple/Ripple.ts +46 -0
  245. package/src/constructors/Ripple/RippleDesign.tsx +112 -0
  246. package/src/constructors/Ripple/RippleInclude.ts +39 -0
  247. package/src/constructors/Ripple/RippleItem.ts +62 -0
  248. package/src/constructors/Ripple/basicTypes.ts +3 -0
  249. package/src/constructors/Ripple/index.ts +6 -0
  250. package/src/constructors/Ripple/properties.json +9 -0
  251. package/src/constructors/Ripple/props.ts +28 -0
  252. package/src/constructors/Ripple/style.scss +62 -0
  253. package/src/constructors/Ripple/types.ts +41 -0
  254. package/src/constructors/Scrollbar/Scrollbar.ts +66 -0
  255. package/src/constructors/Scrollbar/ScrollbarBorder.ts +243 -0
  256. package/src/constructors/Scrollbar/ScrollbarDesign.tsx +126 -0
  257. package/src/constructors/Scrollbar/ScrollbarInclude.ts +80 -0
  258. package/src/constructors/Scrollbar/basicTypes.ts +42 -0
  259. package/src/constructors/Scrollbar/index.ts +5 -0
  260. package/src/constructors/Scrollbar/properties.json +33 -0
  261. package/src/constructors/Scrollbar/props.ts +37 -0
  262. package/src/constructors/Scrollbar/style.scss +117 -0
  263. package/src/constructors/Scrollbar/types.ts +52 -0
  264. package/src/constructors/Skeleton/Skeleton.ts +86 -0
  265. package/src/constructors/Skeleton/SkeletonDesign.tsx +117 -0
  266. package/src/constructors/Skeleton/SkeletonInclude.ts +61 -0
  267. package/src/constructors/Skeleton/basicTypes.ts +16 -0
  268. package/src/constructors/Skeleton/const.ts +1 -0
  269. package/src/constructors/Skeleton/index.ts +6 -0
  270. package/src/constructors/Skeleton/properties.json +24 -0
  271. package/src/constructors/Skeleton/props.ts +28 -0
  272. package/src/constructors/Skeleton/style.scss +112 -0
  273. package/src/constructors/Skeleton/types.ts +46 -0
  274. package/src/constructors/Window/Window.ts +212 -0
  275. package/src/constructors/Window/WindowClasses.ts +180 -0
  276. package/src/constructors/Window/WindowClassesInclude.ts +39 -0
  277. package/src/constructors/Window/WindowClient.ts +93 -0
  278. package/src/constructors/Window/WindowCoordinates.ts +257 -0
  279. package/src/constructors/Window/WindowDesign.tsx +278 -0
  280. package/src/constructors/Window/WindowElement.ts +84 -0
  281. package/src/constructors/Window/WindowEmit.ts +52 -0
  282. package/src/constructors/Window/WindowEvent.ts +157 -0
  283. package/src/constructors/Window/WindowFlash.ts +70 -0
  284. package/src/constructors/Window/WindowHook.ts +110 -0
  285. package/src/constructors/Window/WindowInclude.ts +134 -0
  286. package/src/constructors/Window/WindowOpen.ts +292 -0
  287. package/src/constructors/Window/WindowOrigin.ts +85 -0
  288. package/src/constructors/Window/WindowPersistent.ts +89 -0
  289. package/src/constructors/Window/WindowPosition.ts +358 -0
  290. package/src/constructors/Window/WindowStatic.ts +102 -0
  291. package/src/constructors/Window/WindowStatus.ts +138 -0
  292. package/src/constructors/Window/WindowStyles.ts +78 -0
  293. package/src/constructors/Window/WindowVerification.ts +287 -0
  294. package/src/constructors/Window/basicTypes.ts +186 -0
  295. package/src/constructors/Window/index.ts +7 -0
  296. package/src/constructors/Window/properties.json +236 -0
  297. package/src/constructors/Window/props.ts +88 -0
  298. package/src/constructors/Window/style.scss +262 -0
  299. package/src/constructors/Window/types.ts +124 -0
  300. package/src/functions/getClassTegAStatic.ts +8 -0
  301. package/src/library.ts +36 -0
  302. package/src/types/captionTypes.ts +15 -0
  303. package/src/types/descriptionTypes.ts +15 -0
  304. package/src/types/enabledTypes.ts +9 -0
  305. package/src/types/eventClickTypes.ts +51 -0
  306. package/src/types/fieldTypes.ts +282 -0
  307. package/src/types/labelTypes.ts +30 -0
  308. package/src/types/modelTypes.ts +23 -0
  309. package/src/types/prefixTypes.ts +15 -0
  310. package/src/types/suffixTypes.ts +15 -0
  311. 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
+ }