chuijs 4.0.2 → 4.0.4
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/CHANGELOG.md +597 -0
- package/README.md +43 -644
- package/framework/appLayout/default/chui_app_layout.js +602 -496
- package/framework/appLayout/default/global_style.css +288 -97
- package/framework/appLayout/default/main_theme_style.css +188 -101
- package/framework/components/chui_accordion/accordion.js +38 -35
- package/framework/components/chui_accordion/styles.css +13 -12
- package/framework/components/chui_action_sheet/action_sheet.js +93 -64
- package/framework/components/chui_action_sheet/styles.css +12 -5
- package/framework/components/chui_actions_bar/actions_bar.js +338 -0
- package/framework/components/chui_actions_bar/styles.css +139 -0
- package/framework/components/chui_affix/affix.js +16 -11
- package/framework/components/chui_affix/styles.css +5 -0
- package/framework/components/chui_alert/alert.js +34 -19
- package/framework/components/chui_alert/styles.css +7 -0
- package/framework/components/chui_avatar/avatar.js +36 -35
- package/framework/components/chui_avatar/styles.css +1 -1
- package/framework/components/chui_avatar_group/avatar_group.js +25 -23
- package/framework/components/chui_avatar_group/styles.css +1 -1
- package/framework/components/chui_backtop/backtop.js +60 -21
- package/framework/components/chui_backtop/styles.css +21 -0
- package/framework/components/chui_badge/badge.js +30 -28
- package/framework/components/chui_badge/styles.css +6 -6
- package/framework/components/chui_banner/banner.js +222 -0
- package/framework/components/chui_banner/styles.css +170 -0
- package/framework/components/chui_breadcrumb/breadcrumb.js +15 -13
- package/framework/components/chui_breadcrumb/styles.css +1 -1
- package/framework/components/chui_button/button.js +52 -36
- package/framework/components/chui_button/styles.css +7 -7
- package/framework/components/chui_calendar/calendar.js +18 -16
- package/framework/components/chui_card/card.js +52 -32
- package/framework/components/chui_card_scroll/card_scroll.js +169 -0
- package/framework/components/chui_card_scroll/styles.css +86 -0
- package/framework/components/chui_chat/chat.js +140 -79
- package/framework/components/chui_chat/styles.css +18 -7
- package/framework/components/chui_clipboard_history/clipboard_history.js +53 -39
- package/framework/components/chui_clipboard_history/styles.css +13 -9
- package/framework/components/chui_code/code.js +10 -10
- package/framework/components/chui_code/styles.css +4 -4
- package/framework/components/chui_code_editor/code_editor.js +73 -57
- package/framework/components/chui_code_editor/styles.css +6 -5
- package/framework/components/chui_command_palette/command_palette.js +87 -64
- package/framework/components/chui_command_palette/styles.css +5 -5
- package/framework/components/chui_console/console.js +13 -13
- package/framework/components/chui_console/styles.css +6 -3
- package/framework/components/chui_content_block/content_block.js +35 -21
- package/framework/components/chui_content_block/styles.css +2 -2
- package/framework/components/chui_context_menu/context_menu.js +171 -58
- package/framework/components/chui_context_menu/styles.css +82 -8
- package/framework/components/chui_custom_element/custom_element.js +25 -18
- package/framework/components/chui_data_grid/data_grid.js +633 -471
- package/framework/components/chui_data_grid/styles.css +24 -22
- package/framework/components/chui_descriptions/descriptions.js +34 -17
- package/framework/components/chui_descriptions/styles.css +1 -1
- package/framework/components/chui_details/details.js +42 -36
- package/framework/components/chui_details/styles.css +12 -11
- package/framework/components/chui_diff_viewer/diff_viewer.js +172 -147
- package/framework/components/chui_diff_viewer/styles.css +10 -10
- package/framework/components/chui_divider/divider.js +19 -17
- package/framework/components/chui_divider/styles.css +2 -2
- package/framework/components/chui_drawer/drawer.js +63 -38
- package/framework/components/chui_drawer/styles.css +18 -4
- package/framework/components/chui_drop_zone/drop_zone.js +37 -27
- package/framework/components/chui_drop_zone/styles.css +10 -6
- package/framework/components/chui_empty_state/empty_state.js +20 -15
- package/framework/components/chui_fieldset/fieldset.js +40 -23
- package/framework/components/chui_fieldset/styles.css +6 -6
- package/framework/components/chui_file_explorer/file_explorer.js +260 -189
- package/framework/components/chui_file_explorer/styles.css +8 -7
- package/framework/components/chui_form/form.js +40 -28
- package/framework/components/chui_form/styles.css +1 -1
- package/framework/components/chui_gantt/gantt.js +102 -78
- package/framework/components/chui_gantt/styles.css +5 -5
- package/framework/components/chui_graphs/graphs.js +376 -239
- package/framework/components/chui_graphs/styles.css +27 -6
- package/framework/components/chui_hero/hero.js +98 -37
- package/framework/components/chui_hero/styles.css +176 -7
- package/framework/components/chui_html_block/html_block.js +8 -8
- package/framework/components/chui_html_block/styles.css +3 -3
- package/framework/components/chui_hx/hx.js +3 -3
- package/framework/components/chui_hx/styles.css +13 -6
- package/framework/components/chui_icons/icons.js +2115 -2115
- package/framework/components/chui_icons/styles.css +4 -3
- package/framework/components/chui_inputs/chui_check_box/check_box.js +31 -19
- package/framework/components/chui_inputs/chui_check_box/styles.css +30 -21
- package/framework/components/chui_inputs/chui_chips/chips.js +141 -70
- package/framework/components/chui_inputs/chui_chips/styles.css +32 -7
- package/framework/components/chui_inputs/chui_color_picker/color_picker.js +55 -38
- package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
- package/framework/components/chui_inputs/chui_combo_box/combo_box.js +127 -109
- package/framework/components/chui_inputs/chui_combo_box/styles.css +23 -21
- package/framework/components/chui_inputs/chui_date/date.js +161 -127
- package/framework/components/chui_inputs/chui_date/styles.css +20 -19
- package/framework/components/chui_inputs/chui_date_range/date_range.js +61 -50
- package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
- package/framework/components/chui_inputs/chui_datetime/datetime.js +47 -39
- package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
- package/framework/components/chui_inputs/chui_email/email.js +48 -36
- package/framework/components/chui_inputs/chui_email/styles.css +11 -11
- package/framework/components/chui_inputs/chui_file/file.js +71 -44
- package/framework/components/chui_inputs/chui_file/styles.css +23 -19
- package/framework/components/chui_inputs/chui_hotkey/hotkey.js +101 -76
- package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
- package/framework/components/chui_inputs/chui_masked/masked.js +83 -72
- package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
- package/framework/components/chui_inputs/chui_mention/mention.js +87 -40
- package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
- package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +242 -212
- package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +23 -15
- package/framework/components/chui_inputs/chui_number/number.js +84 -70
- package/framework/components/chui_inputs/chui_number/styles.css +13 -13
- package/framework/components/chui_inputs/chui_otp/otp.js +71 -62
- package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
- package/framework/components/chui_inputs/chui_password/password.js +72 -56
- package/framework/components/chui_inputs/chui_password/styles.css +15 -15
- package/framework/components/chui_inputs/chui_radio_button/radio_button.js +37 -25
- package/framework/components/chui_inputs/chui_radio_button/styles.css +22 -22
- package/framework/components/chui_inputs/chui_rating/rating.js +54 -50
- package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
- package/framework/components/chui_inputs/chui_select_box/select_box.js +132 -108
- package/framework/components/chui_inputs/chui_select_box/styles.css +21 -21
- package/framework/components/chui_inputs/chui_slider/slider.js +41 -38
- package/framework/components/chui_inputs/chui_slider/styles.css +7 -5
- package/framework/components/chui_inputs/chui_text/styles.css +14 -14
- package/framework/components/chui_inputs/chui_text/text.js +69 -52
- package/framework/components/chui_inputs/chui_text_area/styles.css +14 -14
- package/framework/components/chui_inputs/chui_text_area/text_area.js +59 -36
- package/framework/components/chui_inputs/chui_time/styles.css +18 -20
- package/framework/components/chui_inputs/chui_time/time.js +71 -49
- package/framework/components/chui_inputs/chui_toggle/styles.css +13 -6
- package/framework/components/chui_inputs/chui_toggle/toggle.js +27 -27
- package/framework/components/chui_json_editor/json_editor.js +137 -127
- package/framework/components/chui_json_editor/styles.css +5 -5
- package/framework/components/chui_json_viewer/json_viewer.js +133 -114
- package/framework/components/chui_json_viewer/styles.css +9 -8
- package/framework/components/chui_kanban/kanban.js +78 -60
- package/framework/components/chui_kanban/styles.css +8 -4
- package/framework/components/chui_kbd/kbd.js +12 -10
- package/framework/components/chui_kbd/styles.css +1 -1
- package/framework/components/chui_label/label.js +31 -29
- package/framework/components/chui_label/styles.css +3 -3
- package/framework/components/chui_link/link.js +36 -29
- package/framework/components/chui_link/styles.css +11 -4
- package/framework/components/chui_list/list.js +42 -38
- package/framework/components/chui_list/styles.css +4 -3
- package/framework/components/chui_markdown_editor/markdown_editor.js +125 -109
- package/framework/components/chui_markdown_editor/styles.css +5 -5
- package/framework/components/chui_media/audio.js +457 -364
- package/framework/components/chui_media/audio_styles.css +74 -37
- package/framework/components/chui_media/image.js +99 -64
- package/framework/components/chui_media/image_compare.js +86 -55
- package/framework/components/chui_media/image_compare_styles.css +5 -5
- package/framework/components/chui_media/image_styles.css +4 -4
- package/framework/components/chui_media/video.js +264 -171
- package/framework/components/chui_media/video_styles.css +57 -24
- package/framework/components/chui_menu_bar/menu_bar.js +67 -65
- package/framework/components/chui_menu_bar/styles.css +14 -12
- package/framework/components/chui_message_bar/message_bar.js +551 -0
- package/framework/components/chui_message_bar/styles.css +248 -0
- package/framework/components/chui_modal/modal.js +81 -56
- package/framework/components/chui_modal/styles.css +3 -2
- package/framework/components/chui_notification/notification.js +107 -69
- package/framework/components/chui_notification/notification_download.js +28 -77
- package/framework/components/chui_notification/notification_download_card.js +115 -0
- package/framework/components/chui_notification/notification_download_progress.css +5 -4
- package/framework/components/chui_notification/notification_download_progress.js +73 -105
- package/framework/components/chui_notification/notification_update.js +44 -37
- package/framework/components/chui_notification/status_plate.css +3 -3
- package/framework/components/chui_notification/status_plate.js +2 -2
- package/framework/components/chui_notification/styles.css +6 -1
- package/framework/components/chui_notification/styles_download.css +2 -2
- package/framework/components/chui_notification/styles_update.css +3 -3
- package/framework/components/chui_org_chart/org_chart.js +101 -62
- package/framework/components/chui_org_chart/styles.css +2 -2
- package/framework/components/chui_pagination/pagination.js +65 -30
- package/framework/components/chui_pagination/styles.css +1 -1
- package/framework/components/chui_paragraph/paragraph.js +2 -2
- package/framework/components/chui_paragraph/styles.css +3 -3
- package/framework/components/chui_popover/popover.js +77 -50
- package/framework/components/chui_popover/styles.css +1 -1
- package/framework/components/chui_popups/popups.js +210 -181
- package/framework/components/chui_popups/styles.css +7 -7
- package/framework/components/chui_print_button/print_button.js +48 -33
- package/framework/components/chui_progress_bar/progress_bar.js +49 -19
- package/framework/components/chui_progress_bar/styles.css +6 -6
- package/framework/components/chui_progress_ring/progress_ring.js +32 -30
- package/framework/components/chui_progress_ring/styles.css +1 -1
- package/framework/components/chui_qrcode/qrcode.js +85 -41
- package/framework/components/chui_query_builder/query_builder.js +263 -170
- package/framework/components/chui_query_builder/styles.css +4 -4
- package/framework/components/chui_radio_group/radio_group.js +36 -26
- package/framework/components/chui_radio_group/styles.css +2 -2
- package/framework/components/chui_result/result.js +41 -31
- package/framework/components/chui_result/styles.css +3 -3
- package/framework/components/chui_scheduler/scheduler.js +126 -104
- package/framework/components/chui_scheduler/styles.css +11 -7
- package/framework/components/chui_screen_spinner/screen_spinner.js +167 -0
- package/framework/components/chui_screen_spinner/styles.css +49 -0
- package/framework/components/chui_segmented_control/segmented_control.js +90 -27
- package/framework/components/chui_segmented_control/styles.css +32 -6
- package/framework/components/chui_settings/settings.js +160 -87
- package/framework/components/chui_settings/styles.css +4 -4
- package/framework/components/chui_shortcut_help/shortcut_help.js +82 -61
- package/framework/components/chui_sidebar_nav/sidebar_nav.js +132 -53
- package/framework/components/chui_sidebar_nav/styles.css +9 -3
- package/framework/components/chui_skeleton/skeleton.js +29 -24
- package/framework/components/chui_slideshow/slideshow.js +122 -103
- package/framework/components/chui_slideshow/styles.css +22 -16
- package/framework/components/chui_spinner/spinner.js +17 -17
- package/framework/components/chui_spinner/styles.css +0 -1
- package/framework/components/chui_split_button/split_button.js +53 -30
- package/framework/components/chui_split_button/styles.css +22 -6
- package/framework/components/chui_splitter/splitter.js +46 -39
- package/framework/components/chui_splitter/styles.css +2 -2
- package/framework/components/chui_statistic/statistic.js +111 -84
- package/framework/components/chui_status_bar/status_bar.js +11 -9
- package/framework/components/chui_status_bar/styles.css +2 -2
- package/framework/components/chui_stepper/stepper.js +230 -54
- package/framework/components/chui_stepper/styles.css +79 -14
- package/framework/components/chui_sticky_bar/sticky_bar.js +53 -17
- package/framework/components/chui_sticky_bar/styles.css +11 -7
- package/framework/components/chui_tabs/chui_tabs.js +100 -46
- package/framework/components/chui_tabs/styles.css +43 -15
- package/framework/components/chui_text_editor/styles.css +24 -23
- package/framework/components/chui_text_editor/text_editor.js +103 -79
- package/framework/components/chui_text_editor/text_editor_panel.js +428 -367
- package/framework/components/chui_theme_toggle/theme_toggle.js +46 -25
- package/framework/components/chui_timeline/styles.css +3 -1
- package/framework/components/chui_timeline/timeline.js +14 -12
- package/framework/components/chui_toast_queue/styles.css +11 -11
- package/framework/components/chui_toast_queue/toast_queue.js +82 -73
- package/framework/components/chui_toolbar/styles.css +2 -2
- package/framework/components/chui_toolbar/toolbar.js +20 -13
- package/framework/components/chui_tooltip/styles.css +2 -2
- package/framework/components/chui_tooltip/tooltip.js +40 -27
- package/framework/components/chui_tour/styles.css +12 -7
- package/framework/components/chui_tour/tour.js +132 -98
- package/framework/components/chui_transfer/styles.css +8 -7
- package/framework/components/chui_transfer/transfer.js +143 -123
- package/framework/components/chui_tree_table/styles.css +4 -4
- package/framework/components/chui_tree_table/tree_table.js +88 -74
- package/framework/components/chui_tree_view/styles.css +14 -10
- package/framework/components/chui_tree_view/tree_view.js +298 -253
- package/framework/components/chui_user_bar/styles.css +145 -0
- package/framework/components/chui_user_bar/user_bar.js +402 -0
- package/framework/components/chui_user_list_bar/styles.css +173 -0
- package/framework/components/chui_user_list_bar/user_list_bar.js +485 -0
- package/framework/components/chui_watermark/watermark.js +41 -33
- package/framework/components/chui_webview/styles.css +2 -2
- package/framework/components/chui_webview/webview.js +64 -52
- package/framework/components/chui_write_bar/styles.css +172 -0
- package/framework/components/chui_write_bar/write_bar.js +320 -0
- package/framework/main_window.js +1234 -0
- package/framework/modules/chui_a11y/chui_a11y.js +153 -123
- package/framework/modules/chui_animations/animations.js +105 -43
- package/framework/modules/chui_animations/motion.js +120 -0
- package/framework/modules/chui_animations/styles.css +37 -4
- package/framework/modules/chui_bridge/preload.js +36 -25
- package/framework/modules/chui_functions.js +69 -63
- package/framework/modules/chui_highlight/chui_highlight.js +25 -22
- package/framework/modules/chui_highlight/styles.css +13 -10
- package/framework/modules/chui_i18n/chui_i18n.js +12 -10
- package/framework/modules/chui_i18n/locales/a11y.js +5 -5
- package/framework/modules/chui_i18n/locales/app_layout.js +5 -5
- package/framework/modules/chui_i18n/locales/calendar.js +3 -3
- package/framework/modules/chui_i18n/locales/common.js +3 -3
- package/framework/modules/chui_i18n/locales/data.js +36 -26
- package/framework/modules/chui_i18n/locales/editors.js +40 -13
- package/framework/modules/chui_i18n/locales/feedback.js +65 -3
- package/framework/modules/chui_i18n/locales/forms.js +8 -8
- package/framework/modules/chui_i18n/locales/graphics.js +8 -8
- package/framework/modules/chui_i18n/locales/media.js +4 -4
- package/framework/modules/chui_i18n/locales/navigation.js +12 -8
- package/framework/modules/chui_i18n/locales/validate.js +3 -3
- package/framework/modules/chui_json/chui_json.js +11 -11
- package/framework/modules/chui_layout/chui_layout.js +12 -10
- package/framework/modules/chui_logger/chui_logger.js +47 -28
- package/framework/modules/chui_page/page.js +39 -33
- package/framework/modules/chui_palette/palette.js +61 -0
- package/framework/modules/chui_qr/chui_qr.js +179 -88
- package/framework/modules/chui_scrollbar/chui_scrollbar.js +79 -68
- package/framework/modules/chui_scrollbar/styles.css +4 -2
- package/framework/modules/chui_services/chui_channels.js +27 -13
- package/framework/modules/chui_services/chui_services.js +47 -39
- package/framework/modules/chui_services/desktop.js +108 -101
- package/framework/modules/chui_sortable/chui_sortable.js +33 -28
- package/framework/modules/chui_validate/chui_validate.js +10 -7
- package/framework/tray_bar/chui_menu_items.js +136 -46
- package/index.d.ts +5046 -0
- package/index.js +199 -1254
- package/package.json +81 -68
- package/framework/components/telegram_bot/chui_telegram_bot.js +0 -184
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const {setStyles, optionOr} = require("../../modules/chui_functions");
|
|
2
|
-
const {Icon, Icons} = require("../chui_icons/icons");
|
|
3
|
-
const {I18n} = require("../../modules/chui_i18n/chui_i18n");
|
|
1
|
+
const { setStyles, optionOr } = require("../../modules/chui_functions");
|
|
2
|
+
const { Icon, Icons } = require("../chui_icons/icons");
|
|
3
|
+
const { I18n } = require("../../modules/chui_i18n/chui_i18n");
|
|
4
4
|
|
|
5
5
|
/** Служебные ключи строки: всё остальное — значения колонок */
|
|
6
6
|
const SERVICE_KEYS = ["id", "children", "expanded", "disabled", "selected"];
|
|
@@ -50,13 +50,13 @@ const SERVICE_KEYS = ["id", "children", "expanded", "disabled", "selected"];
|
|
|
50
50
|
*/
|
|
51
51
|
class TreeTable {
|
|
52
52
|
static #counter = 0;
|
|
53
|
-
static #
|
|
53
|
+
static #rowCounter = 0;
|
|
54
54
|
|
|
55
55
|
#root = document.createElement("chui_tree_table");
|
|
56
56
|
#label = document.createElement("tree_table_label");
|
|
57
57
|
#grid = document.createElement("tree_table_grid");
|
|
58
58
|
#head = document.createElement("tree_table_head");
|
|
59
|
-
#
|
|
59
|
+
#headRow = document.createElement("tree_table_head_row");
|
|
60
60
|
#body = document.createElement("tree_table_body");
|
|
61
61
|
#empty = document.createElement("tree_table_empty");
|
|
62
62
|
#status = document.createElement("tree_table_status");
|
|
@@ -68,39 +68,41 @@ class TreeTable {
|
|
|
68
68
|
#filter = "";
|
|
69
69
|
#selectable = false;
|
|
70
70
|
#id = undefined;
|
|
71
|
-
#
|
|
72
|
-
#
|
|
71
|
+
#titleText = undefined;
|
|
72
|
+
#labelText = undefined;
|
|
73
73
|
#indent = 18;
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
#
|
|
74
|
+
#emptyText = undefined;
|
|
75
|
+
#onSelect = undefined;
|
|
76
|
+
#onToggle = undefined;
|
|
77
77
|
#listeners = [];
|
|
78
78
|
// Строка, которая держит остановку обхода, и строка под фокусом до перерисовки
|
|
79
|
-
#
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
|
|
83
|
-
constructor(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
79
|
+
#activeId = undefined;
|
|
80
|
+
#focusId = undefined;
|
|
81
|
+
#visibleCount = 0;
|
|
82
|
+
|
|
83
|
+
constructor(
|
|
84
|
+
options = {
|
|
85
|
+
id: String(),
|
|
86
|
+
title: String(),
|
|
87
|
+
label: String(),
|
|
88
|
+
columns: Array(),
|
|
89
|
+
rows: Array(),
|
|
90
|
+
expanded: Array(),
|
|
91
|
+
selectable: Boolean(),
|
|
92
|
+
indent: Number(),
|
|
93
|
+
height: String(),
|
|
94
|
+
emptyText: String(),
|
|
95
|
+
onSelect: undefined,
|
|
96
|
+
onToggle: undefined,
|
|
97
|
+
changeEvent: undefined,
|
|
98
|
+
}
|
|
99
|
+
) {
|
|
98
100
|
setStyles(__dirname + "/styles.css", "chUiJS_TreeTable");
|
|
99
101
|
TreeTable.#counter += 1;
|
|
100
102
|
this.#id = options.id === undefined ? `chui_tree_table_${TreeTable.#counter}` : options.id;
|
|
101
103
|
this.#root.id = this.#id;
|
|
102
|
-
this.#
|
|
103
|
-
this.#
|
|
104
|
+
this.#onSelect = options.onSelect;
|
|
105
|
+
this.#onToggle = options.onToggle;
|
|
104
106
|
this.#selectable = options.selectable === true;
|
|
105
107
|
if (options.changeEvent !== undefined) this.addChangeListener(options.changeEvent);
|
|
106
108
|
this.#label.className = "tree_table_label";
|
|
@@ -109,23 +111,23 @@ class TreeTable {
|
|
|
109
111
|
this.#grid.setAttribute("role", "treegrid");
|
|
110
112
|
this.#head.className = "tree_table_head";
|
|
111
113
|
this.#head.setAttribute("role", "rowgroup");
|
|
112
|
-
this.#
|
|
113
|
-
this.#
|
|
114
|
+
this.#headRow.className = "tree_table_head_row";
|
|
115
|
+
this.#headRow.setAttribute("role", "row");
|
|
114
116
|
this.#body.className = "tree_table_body";
|
|
115
117
|
this.#body.setAttribute("role", "rowgroup");
|
|
116
118
|
this.#empty.className = "tree_table_empty";
|
|
117
119
|
this.#status.className = "tree_table_status chui_visually_hidden";
|
|
118
120
|
this.#status.setAttribute("role", "status");
|
|
119
121
|
this.#status.setAttribute("aria-live", "polite");
|
|
120
|
-
this.#head.appendChild(this.#
|
|
122
|
+
this.#head.appendChild(this.#headRow);
|
|
121
123
|
this.#grid.appendChild(this.#head);
|
|
122
124
|
this.#grid.appendChild(this.#body);
|
|
123
125
|
this.#root.appendChild(this.#label);
|
|
124
126
|
this.#root.appendChild(this.#grid);
|
|
125
127
|
this.#root.appendChild(this.#empty);
|
|
126
128
|
this.#root.appendChild(this.#status);
|
|
127
|
-
if (options.emptyText !== undefined) this.#
|
|
128
|
-
else this.#
|
|
129
|
+
if (options.emptyText !== undefined) this.#emptyText = String(options.emptyText);
|
|
130
|
+
else this.#emptyText = I18n.t("common.nothingFound");
|
|
129
131
|
if (options.title !== undefined) this.setTitle(options.title);
|
|
130
132
|
else this.#label.hidden = true;
|
|
131
133
|
this.setLabel(optionOr(options.label, I18n.t("treeTable.label")));
|
|
@@ -148,12 +150,12 @@ class TreeTable {
|
|
|
148
150
|
}
|
|
149
151
|
|
|
150
152
|
getTitle() {
|
|
151
|
-
return this.#
|
|
153
|
+
return this.#titleText;
|
|
152
154
|
}
|
|
153
155
|
|
|
154
156
|
/** Доступное имя таблицы, заданное в `label` */
|
|
155
157
|
getLabel() {
|
|
156
|
-
return this.#
|
|
158
|
+
return this.#labelText;
|
|
157
159
|
}
|
|
158
160
|
|
|
159
161
|
/** Колонки: копии описаний */
|
|
@@ -215,7 +217,7 @@ class TreeTable {
|
|
|
215
217
|
|
|
216
218
|
/** Подпись над таблицей; `undefined` её убирает (имя тогда даёт `label`) */
|
|
217
219
|
setTitle(text = undefined) {
|
|
218
|
-
this.#
|
|
220
|
+
this.#titleText = text;
|
|
219
221
|
if (text === undefined || text === "") {
|
|
220
222
|
this.#label.hidden = true;
|
|
221
223
|
this.#label.innerText = "";
|
|
@@ -230,7 +232,7 @@ class TreeTable {
|
|
|
230
232
|
|
|
231
233
|
/** Имя таблицы, когда подписи в разметке нет */
|
|
232
234
|
setLabel(text = undefined) {
|
|
233
|
-
this.#
|
|
235
|
+
this.#labelText = text;
|
|
234
236
|
this.#syncLabel();
|
|
235
237
|
return this;
|
|
236
238
|
}
|
|
@@ -335,7 +337,8 @@ class TreeTable {
|
|
|
335
337
|
setFilter(text = String()) {
|
|
336
338
|
this.#filter = text === undefined ? "" : String(text);
|
|
337
339
|
this.#render();
|
|
338
|
-
if (this.#filter !== "")
|
|
340
|
+
if (this.#filter !== "")
|
|
341
|
+
this.#announce(I18n.t("treeTable.shownRows", { shown: this.#visibleCount, total: this.#index.size }));
|
|
339
342
|
return this;
|
|
340
343
|
}
|
|
341
344
|
|
|
@@ -369,7 +372,10 @@ class TreeTable {
|
|
|
369
372
|
const target = id === undefined ? undefined : String(id);
|
|
370
373
|
const list = this.#body.querySelectorAll("tree_table_row");
|
|
371
374
|
if (list.length === 0) return this;
|
|
372
|
-
const row =
|
|
375
|
+
const row =
|
|
376
|
+
target === undefined
|
|
377
|
+
? list[0]
|
|
378
|
+
: this.#body.querySelector(`tree_table_row[data-id="${CSS.escape(target)}"]`);
|
|
373
379
|
if (row === null) return this;
|
|
374
380
|
this.#focusRow(row.dataset.id);
|
|
375
381
|
return this;
|
|
@@ -385,9 +391,9 @@ class TreeTable {
|
|
|
385
391
|
const source = row === undefined || row === null ? {} : row;
|
|
386
392
|
const values = {};
|
|
387
393
|
for (const key of Object.keys(source)) if (!SERVICE_KEYS.includes(key)) values[key] = source[key];
|
|
388
|
-
TreeTable.#
|
|
394
|
+
TreeTable.#rowCounter += 1;
|
|
389
395
|
return {
|
|
390
|
-
id: source.id === undefined ? `tree_table_row_${TreeTable.#
|
|
396
|
+
id: source.id === undefined ? `tree_table_row_${TreeTable.#rowCounter}` : String(source.id),
|
|
391
397
|
values: values,
|
|
392
398
|
disabled: source.disabled === true,
|
|
393
399
|
default_expanded: source.expanded === true,
|
|
@@ -396,7 +402,7 @@ class TreeTable {
|
|
|
396
402
|
}
|
|
397
403
|
|
|
398
404
|
#describe(node) {
|
|
399
|
-
const descriptor = {id: node.id};
|
|
405
|
+
const descriptor = { id: node.id };
|
|
400
406
|
for (const key of Object.keys(node.values)) descriptor[key] = node.values[key];
|
|
401
407
|
descriptor.expanded = node.children.length > 0 && this.#expanded.has(node.id);
|
|
402
408
|
descriptor.disabled = node.disabled;
|
|
@@ -440,14 +446,14 @@ class TreeTable {
|
|
|
440
446
|
}
|
|
441
447
|
|
|
442
448
|
#accessibleName() {
|
|
443
|
-
if (this.#
|
|
444
|
-
if (this.#
|
|
449
|
+
if (this.#titleText !== undefined && this.#titleText !== "") return this.#titleText;
|
|
450
|
+
if (this.#labelText !== undefined && this.#labelText !== "") return this.#labelText;
|
|
445
451
|
return I18n.t("treeTable.label");
|
|
446
452
|
}
|
|
447
453
|
|
|
448
454
|
// Имя сетки: видимая подпись — через aria-labelledby, скрытая — через aria-label
|
|
449
455
|
#syncLabel() {
|
|
450
|
-
if (this.#
|
|
456
|
+
if (this.#titleText !== undefined && this.#titleText !== "") {
|
|
451
457
|
this.#grid.setAttribute("aria-labelledby", this.#label.id);
|
|
452
458
|
this.#grid.removeAttribute("aria-label");
|
|
453
459
|
return;
|
|
@@ -463,7 +469,7 @@ class TreeTable {
|
|
|
463
469
|
const walk = (nodes, level) => {
|
|
464
470
|
for (const node of nodes) {
|
|
465
471
|
if (filter !== "" && !this.#matchesTree(node, filter)) continue;
|
|
466
|
-
list.push({node: node, level: level});
|
|
472
|
+
list.push({ node: node, level: level });
|
|
467
473
|
if (!this.#isOpen(node, filter)) continue;
|
|
468
474
|
walk(node.children, level + 1);
|
|
469
475
|
}
|
|
@@ -485,15 +491,19 @@ class TreeTable {
|
|
|
485
491
|
}
|
|
486
492
|
|
|
487
493
|
#matchesRow(node, filter) {
|
|
488
|
-
return this.#columns.some((column) =>
|
|
494
|
+
return this.#columns.some((column) =>
|
|
495
|
+
String(node.values[column.key] === undefined ? "" : node.values[column.key])
|
|
496
|
+
.toLowerCase()
|
|
497
|
+
.includes(filter)
|
|
498
|
+
);
|
|
489
499
|
}
|
|
490
500
|
|
|
491
501
|
#render() {
|
|
492
502
|
// Строки пересобираются, а фокус живёт на строке: запоминаем её до перерисовки
|
|
493
503
|
const active = document.activeElement;
|
|
494
504
|
const focused = active === null || !this.#grid.contains(active) ? null : active.closest("tree_table_row");
|
|
495
|
-
if (focused !== null) this.#
|
|
496
|
-
this.#
|
|
505
|
+
if (focused !== null) this.#focusId = focused.dataset.id;
|
|
506
|
+
this.#headRow.innerHTML = "";
|
|
497
507
|
this.#body.innerHTML = "";
|
|
498
508
|
for (const column of this.#columns) {
|
|
499
509
|
const cell = document.createElement("tree_table_head_cell");
|
|
@@ -501,14 +511,14 @@ class TreeTable {
|
|
|
501
511
|
if (column.align === "end") cell.classList.add("tree_table_cell_end");
|
|
502
512
|
cell.setAttribute("role", "columnheader");
|
|
503
513
|
cell.innerText = column.title;
|
|
504
|
-
this.#
|
|
514
|
+
this.#headRow.appendChild(cell);
|
|
505
515
|
}
|
|
506
516
|
this.#head.hidden = this.#columns.length === 0;
|
|
507
517
|
const visible = this.#flatten();
|
|
508
|
-
this.#
|
|
518
|
+
this.#visibleCount = visible.length;
|
|
509
519
|
for (const entry of visible) this.#body.appendChild(this.#rowNode(entry));
|
|
510
520
|
this.#empty.hidden = visible.length > 0;
|
|
511
|
-
this.#empty.innerText = this.#
|
|
521
|
+
this.#empty.innerText = this.#emptyText;
|
|
512
522
|
this.#applyStop();
|
|
513
523
|
return this;
|
|
514
524
|
}
|
|
@@ -550,7 +560,10 @@ class TreeTable {
|
|
|
550
560
|
toggle.className = "tree_table_toggle";
|
|
551
561
|
// Стрелка не отдельная остановка обхода: у таблицы одна остановка на строку
|
|
552
562
|
toggle.setAttribute("tabindex", "-1");
|
|
553
|
-
toggle.setAttribute(
|
|
563
|
+
toggle.setAttribute(
|
|
564
|
+
"aria-label",
|
|
565
|
+
I18n.t(open ? "a11y.collapseNode" : "a11y.expandNode", { name: this.#titleOf(node) })
|
|
566
|
+
);
|
|
554
567
|
toggle.dataset.id = node.id;
|
|
555
568
|
const glyph = new Icon(Icons.NAVIGATION.CHEVRON_RIGHT, "18px").set();
|
|
556
569
|
glyph.setAttribute("aria-hidden", "true");
|
|
@@ -581,14 +594,14 @@ class TreeTable {
|
|
|
581
594
|
const list = [...this.#body.querySelectorAll("tree_table_row")];
|
|
582
595
|
if (list.length === 0) return;
|
|
583
596
|
const stop =
|
|
584
|
-
list.find((row) => row.dataset.id === this.#
|
|
585
|
-
list.find((row) => row.dataset.id === this.#
|
|
597
|
+
list.find((row) => row.dataset.id === this.#activeId) ??
|
|
598
|
+
list.find((row) => row.dataset.id === this.#focusId) ??
|
|
586
599
|
list[0];
|
|
587
|
-
this.#
|
|
600
|
+
this.#activeId = stop.dataset.id;
|
|
588
601
|
for (const row of list) row.setAttribute("tabindex", row === stop ? "0" : "-1");
|
|
589
602
|
// Фокус возвращаем только если он был в таблице: иначе перерисовка его бы украла
|
|
590
|
-
if (this.#
|
|
591
|
-
this.#
|
|
603
|
+
if (this.#focusId !== undefined && stop.dataset.id === this.#focusId) {
|
|
604
|
+
this.#focusId = undefined;
|
|
592
605
|
stop.focus();
|
|
593
606
|
}
|
|
594
607
|
}
|
|
@@ -596,7 +609,7 @@ class TreeTable {
|
|
|
596
609
|
#focusRow(id = String()) {
|
|
597
610
|
const row = this.#body.querySelector(`tree_table_row[data-id="${CSS.escape(id)}"]`);
|
|
598
611
|
if (row === null) return;
|
|
599
|
-
this.#
|
|
612
|
+
this.#activeId = id;
|
|
600
613
|
for (const other of this.#body.querySelectorAll("tree_table_row")) {
|
|
601
614
|
other.setAttribute("tabindex", other === row ? "0" : "-1");
|
|
602
615
|
}
|
|
@@ -611,10 +624,12 @@ class TreeTable {
|
|
|
611
624
|
else this.#expanded.delete(id);
|
|
612
625
|
this.#render();
|
|
613
626
|
if (silent) return this;
|
|
614
|
-
this.#announce(
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
627
|
+
this.#announce(
|
|
628
|
+
value
|
|
629
|
+
? I18n.t("treeTable.expanded", { name: this.#titleOf(node), count: node.children.length })
|
|
630
|
+
: I18n.t("treeTable.collapsed", { name: this.#titleOf(node) })
|
|
631
|
+
);
|
|
632
|
+
if (this.#onToggle !== undefined) this.#onToggle(this.#describe(node), value, this);
|
|
618
633
|
return this;
|
|
619
634
|
}
|
|
620
635
|
|
|
@@ -633,7 +648,7 @@ class TreeTable {
|
|
|
633
648
|
const node = this.#selected === undefined ? undefined : this.#index.get(this.#selected);
|
|
634
649
|
const row = node === undefined ? undefined : this.#describe(node);
|
|
635
650
|
for (const listener of [...this.#listeners]) listener(row, this);
|
|
636
|
-
if (this.#
|
|
651
|
+
if (this.#onSelect !== undefined) this.#onSelect(row, this);
|
|
637
652
|
}
|
|
638
653
|
|
|
639
654
|
#announce(text = String()) {
|
|
@@ -688,7 +703,7 @@ class TreeTable {
|
|
|
688
703
|
const list = this.#body.querySelectorAll("tree_table_row");
|
|
689
704
|
if (list.length === 0) return;
|
|
690
705
|
// Нажатия на самой стрелке (настоящая кнопка) не перехватываем
|
|
691
|
-
const
|
|
706
|
+
const fromButton = event.target instanceof Element && event.target.closest("button") !== null;
|
|
692
707
|
const row = this.#currentRow(event.target instanceof Element ? event.target : undefined);
|
|
693
708
|
const id = row === null ? undefined : row.dataset.id;
|
|
694
709
|
const node = id === undefined ? undefined : this.#index.get(id);
|
|
@@ -710,14 +725,14 @@ class TreeTable {
|
|
|
710
725
|
this.#focusRow(list[list.length - 1].dataset.id);
|
|
711
726
|
return;
|
|
712
727
|
case "ArrowRight": {
|
|
713
|
-
if (
|
|
728
|
+
if (fromButton || node === undefined || node.children.length === 0) return;
|
|
714
729
|
event.preventDefault();
|
|
715
730
|
if (!this.#expanded.has(id) && this.#filter === "") this.expand(id);
|
|
716
731
|
else this.#step(row, 1);
|
|
717
732
|
return;
|
|
718
733
|
}
|
|
719
734
|
case "ArrowLeft": {
|
|
720
|
-
if (
|
|
735
|
+
if (fromButton || node === undefined) return;
|
|
721
736
|
event.preventDefault();
|
|
722
737
|
if (node.children.length > 0 && this.#expanded.has(id)) {
|
|
723
738
|
this.collapse(id);
|
|
@@ -728,13 +743,13 @@ class TreeTable {
|
|
|
728
743
|
return;
|
|
729
744
|
}
|
|
730
745
|
case "Enter": {
|
|
731
|
-
if (
|
|
746
|
+
if (fromButton || node === undefined || node.children.length === 0) return;
|
|
732
747
|
event.preventDefault();
|
|
733
748
|
this.toggle(id);
|
|
734
749
|
return;
|
|
735
750
|
}
|
|
736
751
|
case " ": {
|
|
737
|
-
if (
|
|
752
|
+
if (fromButton || node === undefined) return;
|
|
738
753
|
event.preventDefault();
|
|
739
754
|
if (this.#selectable) this.#select(id);
|
|
740
755
|
else if (node.children.length > 0) this.toggle(id);
|
|
@@ -746,5 +761,4 @@ class TreeTable {
|
|
|
746
761
|
};
|
|
747
762
|
}
|
|
748
763
|
|
|
749
|
-
exports.TreeTable = TreeTable
|
|
750
|
-
|
|
764
|
+
exports.TreeTable = TreeTable;
|
|
@@ -7,9 +7,9 @@ chui_tree_view {
|
|
|
7
7
|
height: max-content;
|
|
8
8
|
font-size: var(--font_default_size);
|
|
9
9
|
border: 1px solid var(--border_color);
|
|
10
|
-
margin: var(--
|
|
10
|
+
margin: var(--block_margin);
|
|
11
11
|
padding: 4px;
|
|
12
|
-
border-radius: var(--
|
|
12
|
+
border-radius: var(--radius_sm);
|
|
13
13
|
background: var(--element_background_2);
|
|
14
14
|
box-sizing: border-box;
|
|
15
15
|
}
|
|
@@ -31,7 +31,9 @@ tree_view_button {
|
|
|
31
31
|
flex-direction: row;
|
|
32
32
|
gap: 6px;
|
|
33
33
|
width: -webkit-fill-available;
|
|
34
|
-
|
|
34
|
+
/* Высота строки — одна на вёрстку и на арифметику распорок: в переменном режиме
|
|
35
|
+
её пишет код после замера, 32px — значение до замера */
|
|
36
|
+
min-height: var(--tree_view_row_height, 32px);
|
|
35
37
|
box-sizing: border-box;
|
|
36
38
|
/* 4px панели + 9px строки = 13px — тот же отступ текста, что у ячеек таблиц и сетки */
|
|
37
39
|
padding: 4px 9px;
|
|
@@ -66,7 +68,7 @@ tree_view_button_arrow {
|
|
|
66
68
|
tree_view_button_arrow chui_icon {
|
|
67
69
|
font-size: var(--header_icon_size);
|
|
68
70
|
color: inherit;
|
|
69
|
-
transition: transform var(--
|
|
71
|
+
transition: transform var(--motion_fast) var(--motion_ease);
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
/* Стрелка: свёрнутый узел смотрит вправо, раскрытый — вниз */
|
|
@@ -81,13 +83,14 @@ tree_view_button[aria-expanded="true"] tree_view_button_arrow chui_icon {
|
|
|
81
83
|
tree_view_panel {
|
|
82
84
|
display: block;
|
|
83
85
|
width: -webkit-fill-available;
|
|
84
|
-
padding-block: 0 0;
|
|
86
|
+
padding-block: 0 0;
|
|
87
|
+
padding-inline: 18px 0;
|
|
85
88
|
overflow: hidden;
|
|
86
89
|
max-height: 0;
|
|
87
90
|
position: relative;
|
|
88
91
|
color: var(--text_color);
|
|
89
92
|
border: none;
|
|
90
|
-
transition: max-height var(--
|
|
93
|
+
transition: max-height var(--motion_base) var(--motion_ease);
|
|
91
94
|
}
|
|
92
95
|
|
|
93
96
|
/* Направляющая уровня: показывает, что вложенные строки относятся к раскрытому узлу */
|
|
@@ -115,7 +118,8 @@ tree_view_button:hover {
|
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
tree_view_button:active {
|
|
118
|
-
background: var(--element_background_prime);
|
|
121
|
+
background: var(--element_background_prime);
|
|
122
|
+
color: var(--text_color_hover);
|
|
119
123
|
}
|
|
120
124
|
|
|
121
125
|
tree_view_button:focus-visible {
|
|
@@ -168,7 +172,7 @@ tree_view_button.tree_view_button_drop_after {
|
|
|
168
172
|
}
|
|
169
173
|
|
|
170
174
|
tree_view_button.tree_view_button_drop_inside {
|
|
171
|
-
background: var(--
|
|
175
|
+
background: var(--blue_prime_background_tint_strong);
|
|
172
176
|
color: var(--text_color_hover);
|
|
173
177
|
}
|
|
174
178
|
|
|
@@ -182,8 +186,8 @@ tree_view_panel.tree_view_search_hidden {
|
|
|
182
186
|
|
|
183
187
|
/* Совпадение подсвечивается спокойным акцентом: акцент зарезервирован за выбором */
|
|
184
188
|
tree_view_button.tree_view_button_match {
|
|
185
|
-
background: var(--
|
|
186
|
-
border-radius: var(--
|
|
189
|
+
background: var(--blue_prime_background_tint_strong);
|
|
190
|
+
border-radius: var(--radius_sm);
|
|
187
191
|
}
|
|
188
192
|
|
|
189
193
|
/* === Отложенная отрисовка (опция deferRender) ===
|