chuijs 4.0.3 → 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 +536 -0
- package/framework/appLayout/default/chui_app_layout.js +361 -303
- package/framework/appLayout/default/global_style.css +243 -89
- package/framework/appLayout/default/main_theme_style.css +188 -101
- package/framework/components/chui_accordion/accordion.js +17 -17
- package/framework/components/chui_accordion/styles.css +7 -7
- package/framework/components/chui_action_sheet/action_sheet.js +35 -32
- package/framework/components/chui_action_sheet/styles.css +10 -4
- 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 +4 -4
- package/framework/components/chui_affix/styles.css +5 -0
- package/framework/components/chui_alert/alert.js +11 -5
- package/framework/components/chui_alert/styles.css +7 -0
- package/framework/components/chui_avatar/avatar.js +13 -13
- package/framework/components/chui_avatar/styles.css +1 -1
- package/framework/components/chui_avatar_group/avatar_group.js +4 -4
- package/framework/components/chui_avatar_group/styles.css +1 -1
- package/framework/components/chui_backtop/backtop.js +25 -2
- package/framework/components/chui_backtop/styles.css +21 -0
- package/framework/components/chui_badge/badge.js +15 -15
- 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/styles.css +1 -1
- package/framework/components/chui_button/button.js +24 -28
- package/framework/components/chui_button/styles.css +5 -5
- package/framework/components/chui_calendar/calendar.js +6 -6
- package/framework/components/chui_card/card.js +14 -14
- 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 +73 -51
- package/framework/components/chui_chat/styles.css +18 -7
- package/framework/components/chui_clipboard_history/clipboard_history.js +25 -20
- package/framework/components/chui_clipboard_history/styles.css +10 -8
- package/framework/components/chui_code/code.js +8 -8
- package/framework/components/chui_code/styles.css +2 -2
- package/framework/components/chui_code_editor/code_editor.js +26 -26
- package/framework/components/chui_code_editor/styles.css +3 -3
- package/framework/components/chui_command_palette/command_palette.js +29 -29
- package/framework/components/chui_command_palette/styles.css +5 -5
- package/framework/components/chui_console/console.js +9 -9
- package/framework/components/chui_console/styles.css +5 -2
- package/framework/components/chui_content_block/content_block.js +2 -2
- package/framework/components/chui_context_menu/context_menu.js +162 -54
- package/framework/components/chui_context_menu/styles.css +82 -8
- package/framework/components/chui_custom_element/custom_element.js +11 -11
- package/framework/components/chui_data_grid/data_grid.js +268 -268
- package/framework/components/chui_data_grid/styles.css +14 -14
- package/framework/components/chui_descriptions/styles.css +1 -1
- package/framework/components/chui_details/details.js +12 -12
- package/framework/components/chui_details/styles.css +7 -7
- package/framework/components/chui_diff_viewer/diff_viewer.js +88 -88
- package/framework/components/chui_diff_viewer/styles.css +9 -9
- package/framework/components/chui_divider/divider.js +6 -6
- package/framework/components/chui_divider/styles.css +2 -2
- package/framework/components/chui_drawer/drawer.js +37 -14
- package/framework/components/chui_drawer/styles.css +18 -4
- package/framework/components/chui_drop_zone/drop_zone.js +6 -6
- package/framework/components/chui_drop_zone/styles.css +10 -6
- package/framework/components/chui_fieldset/fieldset.js +6 -6
- package/framework/components/chui_fieldset/styles.css +5 -5
- package/framework/components/chui_file_explorer/file_explorer.js +115 -115
- package/framework/components/chui_file_explorer/styles.css +6 -6
- package/framework/components/chui_form/form.js +11 -11
- package/framework/components/chui_gantt/gantt.js +41 -41
- package/framework/components/chui_gantt/styles.css +5 -5
- package/framework/components/chui_graphs/graphs.js +82 -46
- package/framework/components/chui_graphs/styles.css +26 -5
- package/framework/components/chui_hero/hero.js +63 -20
- package/framework/components/chui_hero/styles.css +176 -7
- package/framework/components/chui_html_block/html_block.js +5 -5
- package/framework/components/chui_html_block/styles.css +1 -1
- package/framework/components/chui_hx/styles.css +2 -2
- package/framework/components/chui_icons/icons.js +7 -7
- package/framework/components/chui_icons/styles.css +2 -1
- package/framework/components/chui_inputs/chui_check_box/styles.css +12 -3
- package/framework/components/chui_inputs/chui_chips/chips.js +92 -31
- package/framework/components/chui_inputs/chui_chips/styles.css +28 -5
- package/framework/components/chui_inputs/chui_color_picker/color_picker.js +20 -15
- package/framework/components/chui_inputs/chui_color_picker/styles.css +7 -7
- package/framework/components/chui_inputs/chui_combo_box/combo_box.js +58 -58
- package/framework/components/chui_inputs/chui_combo_box/styles.css +9 -9
- package/framework/components/chui_inputs/chui_date/date.js +93 -95
- package/framework/components/chui_inputs/chui_date/styles.css +8 -8
- package/framework/components/chui_inputs/chui_date_range/date_range.js +22 -22
- package/framework/components/chui_inputs/chui_date_range/styles.css +3 -3
- package/framework/components/chui_inputs/chui_datetime/datetime.js +12 -12
- package/framework/components/chui_inputs/chui_datetime/styles.css +3 -3
- package/framework/components/chui_inputs/chui_email/email.js +10 -10
- package/framework/components/chui_inputs/chui_email/styles.css +6 -6
- package/framework/components/chui_inputs/chui_file/file.js +8 -8
- package/framework/components/chui_inputs/chui_file/styles.css +12 -9
- package/framework/components/chui_inputs/chui_hotkey/hotkey.js +39 -39
- package/framework/components/chui_inputs/chui_hotkey/styles.css +6 -6
- package/framework/components/chui_inputs/chui_masked/masked.js +44 -44
- package/framework/components/chui_inputs/chui_masked/styles.css +5 -5
- package/framework/components/chui_inputs/chui_mention/mention.js +13 -13
- package/framework/components/chui_inputs/chui_mention/styles.css +14 -8
- package/framework/components/chui_inputs/chui_multi_combo_box/multi_combo_box.js +147 -137
- package/framework/components/chui_inputs/chui_multi_combo_box/styles.css +14 -8
- package/framework/components/chui_inputs/chui_number/number.js +42 -45
- package/framework/components/chui_inputs/chui_number/styles.css +6 -6
- package/framework/components/chui_inputs/chui_otp/otp.js +32 -32
- package/framework/components/chui_inputs/chui_otp/styles.css +5 -5
- package/framework/components/chui_inputs/chui_password/password.js +30 -36
- package/framework/components/chui_inputs/chui_password/styles.css +7 -7
- package/framework/components/chui_inputs/chui_radio_button/styles.css +2 -2
- package/framework/components/chui_inputs/chui_rating/rating.js +28 -28
- package/framework/components/chui_inputs/chui_rating/styles.css +3 -3
- package/framework/components/chui_inputs/chui_select_box/select_box.js +54 -54
- package/framework/components/chui_inputs/chui_select_box/styles.css +10 -10
- package/framework/components/chui_inputs/chui_slider/slider.js +14 -14
- package/framework/components/chui_inputs/chui_slider/styles.css +5 -4
- package/framework/components/chui_inputs/chui_text/styles.css +7 -7
- package/framework/components/chui_inputs/chui_text/text.js +13 -17
- package/framework/components/chui_inputs/chui_text_area/styles.css +8 -8
- package/framework/components/chui_inputs/chui_text_area/text_area.js +23 -23
- package/framework/components/chui_inputs/chui_time/styles.css +13 -17
- package/framework/components/chui_inputs/chui_time/time.js +35 -24
- package/framework/components/chui_inputs/chui_toggle/styles.css +10 -3
- package/framework/components/chui_inputs/chui_toggle/toggle.js +16 -16
- package/framework/components/chui_json_editor/json_editor.js +87 -87
- package/framework/components/chui_json_editor/styles.css +5 -5
- package/framework/components/chui_json_viewer/json_viewer.js +80 -80
- package/framework/components/chui_json_viewer/styles.css +6 -6
- package/framework/components/chui_kanban/kanban.js +27 -27
- package/framework/components/chui_kanban/styles.css +8 -4
- package/framework/components/chui_kbd/styles.css +1 -1
- package/framework/components/chui_label/label.js +17 -17
- package/framework/components/chui_label/styles.css +1 -1
- package/framework/components/chui_link/link.js +9 -9
- package/framework/components/chui_link/styles.css +11 -4
- package/framework/components/chui_list/list.js +11 -11
- package/framework/components/chui_list/styles.css +2 -2
- package/framework/components/chui_markdown_editor/markdown_editor.js +66 -66
- package/framework/components/chui_markdown_editor/styles.css +5 -5
- package/framework/components/chui_media/audio.js +240 -246
- package/framework/components/chui_media/audio_styles.css +41 -23
- package/framework/components/chui_media/image.js +49 -46
- package/framework/components/chui_media/image_compare.js +35 -35
- package/framework/components/chui_media/image_compare_styles.css +5 -5
- package/framework/components/chui_media/image_styles.css +1 -1
- package/framework/components/chui_media/video.js +148 -148
- package/framework/components/chui_media/video_styles.css +27 -11
- package/framework/components/chui_menu_bar/menu_bar.js +54 -54
- package/framework/components/chui_menu_bar/styles.css +10 -10
- 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 +37 -13
- package/framework/components/chui_notification/notification.js +76 -54
- package/framework/components/chui_notification/notification_download.js +26 -81
- package/framework/components/chui_notification/notification_download_card.js +115 -0
- package/framework/components/chui_notification/notification_download_progress.css +2 -2
- package/framework/components/chui_notification/notification_download_progress.js +70 -108
- package/framework/components/chui_notification/notification_update.js +31 -31
- package/framework/components/chui_notification/status_plate.css +3 -3
- package/framework/components/chui_notification/styles.css +6 -1
- package/framework/components/chui_notification/styles_download.css +1 -1
- package/framework/components/chui_notification/styles_update.css +2 -2
- package/framework/components/chui_org_chart/org_chart.js +29 -29
- package/framework/components/chui_org_chart/styles.css +2 -2
- package/framework/components/chui_pagination/pagination.js +3 -3
- package/framework/components/chui_pagination/styles.css +1 -1
- package/framework/components/chui_paragraph/styles.css +2 -2
- package/framework/components/chui_popover/popover.js +29 -23
- package/framework/components/chui_popover/styles.css +1 -1
- package/framework/components/chui_popups/popups.js +124 -124
- package/framework/components/chui_popups/styles.css +5 -5
- package/framework/components/chui_print_button/print_button.js +15 -10
- package/framework/components/chui_progress_bar/progress_bar.js +34 -12
- package/framework/components/chui_progress_bar/styles.css +4 -4
- package/framework/components/chui_progress_ring/progress_ring.js +15 -15
- package/framework/components/chui_progress_ring/styles.css +1 -1
- package/framework/components/chui_qrcode/qrcode.js +12 -12
- package/framework/components/chui_query_builder/query_builder.js +46 -46
- package/framework/components/chui_query_builder/styles.css +4 -4
- package/framework/components/chui_radio_group/styles.css +1 -1
- package/framework/components/chui_result/result.js +15 -15
- package/framework/components/chui_result/styles.css +3 -3
- package/framework/components/chui_scheduler/scheduler.js +74 -74
- package/framework/components/chui_scheduler/styles.css +5 -5
- 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 +63 -6
- package/framework/components/chui_segmented_control/styles.css +32 -6
- package/framework/components/chui_settings/settings.js +45 -46
- package/framework/components/chui_settings/styles.css +4 -4
- package/framework/components/chui_shortcut_help/shortcut_help.js +32 -34
- package/framework/components/chui_sidebar_nav/sidebar_nav.js +98 -29
- package/framework/components/chui_sidebar_nav/styles.css +9 -3
- package/framework/components/chui_slideshow/slideshow.js +85 -85
- package/framework/components/chui_slideshow/styles.css +6 -6
- package/framework/components/chui_spinner/spinner.js +10 -10
- package/framework/components/chui_split_button/split_button.js +30 -12
- package/framework/components/chui_split_button/styles.css +21 -5
- package/framework/components/chui_splitter/splitter.js +11 -11
- package/framework/components/chui_splitter/styles.css +2 -2
- package/framework/components/chui_statistic/statistic.js +47 -47
- package/framework/components/chui_status_bar/styles.css +2 -2
- package/framework/components/chui_stepper/stepper.js +202 -31
- package/framework/components/chui_stepper/styles.css +79 -14
- package/framework/components/chui_sticky_bar/sticky_bar.js +44 -13
- package/framework/components/chui_sticky_bar/styles.css +10 -8
- package/framework/components/chui_tabs/chui_tabs.js +74 -26
- package/framework/components/chui_tabs/styles.css +40 -12
- package/framework/components/chui_text_editor/styles.css +7 -7
- package/framework/components/chui_text_editor/text_editor.js +56 -56
- package/framework/components/chui_text_editor/text_editor_panel.js +173 -174
- package/framework/components/chui_theme_toggle/theme_toggle.js +21 -5
- package/framework/components/chui_timeline/styles.css +3 -1
- package/framework/components/chui_toast_queue/styles.css +11 -11
- package/framework/components/chui_toast_queue/toast_queue.js +30 -27
- package/framework/components/chui_toolbar/styles.css +2 -2
- package/framework/components/chui_tooltip/styles.css +2 -2
- package/framework/components/chui_tooltip/tooltip.js +3 -3
- package/framework/components/chui_tour/styles.css +8 -8
- package/framework/components/chui_tour/tour.js +72 -72
- package/framework/components/chui_transfer/styles.css +6 -6
- package/framework/components/chui_transfer/transfer.js +93 -106
- package/framework/components/chui_tree_table/styles.css +4 -4
- package/framework/components/chui_tree_table/tree_table.js +45 -45
- package/framework/components/chui_tree_view/styles.css +10 -8
- package/framework/components/chui_tree_view/tree_view.js +185 -183
- 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 +17 -17
- package/framework/components/chui_webview/webview.js +9 -9
- 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 +78 -79
- package/framework/modules/chui_animations/animations.js +77 -15
- package/framework/modules/chui_animations/motion.js +120 -0
- package/framework/modules/chui_animations/styles.css +36 -3
- package/framework/modules/chui_functions.js +31 -27
- package/framework/modules/chui_highlight/styles.css +13 -10
- package/framework/modules/chui_i18n/chui_i18n.js +3 -3
- package/framework/modules/chui_i18n/locales/feedback.js +62 -0
- package/framework/modules/chui_i18n/locales/navigation.js +4 -0
- package/framework/modules/chui_json/chui_json.js +2 -2
- package/framework/modules/chui_logger/chui_logger.js +23 -8
- package/framework/modules/chui_page/page.js +10 -10
- package/framework/modules/chui_palette/palette.js +61 -0
- package/framework/modules/chui_qr/chui_qr.js +23 -23
- package/framework/modules/chui_scrollbar/chui_scrollbar.js +45 -45
- package/framework/modules/chui_scrollbar/styles.css +3 -3
- package/framework/modules/chui_services/chui_services.js +8 -8
- package/framework/modules/chui_services/desktop.js +77 -71
- package/framework/modules/chui_sortable/chui_sortable.js +17 -17
- package/framework/modules/chui_validate/chui_validate.js +3 -3
- package/framework/tray_bar/chui_menu_items.js +2 -2
- package/index.d.ts +266 -34
- package/index.js +20 -1168
- package/package.json +6 -4
- package/framework/components/telegram_bot/chui_telegram_bot.js +0 -191
|
@@ -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,17 +68,17 @@ 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
|
-
#
|
|
79
|
+
#activeId = undefined;
|
|
80
|
+
#focusId = undefined;
|
|
81
|
+
#visibleCount = 0;
|
|
82
82
|
|
|
83
83
|
constructor(
|
|
84
84
|
options = {
|
|
@@ -101,8 +101,8 @@ class TreeTable {
|
|
|
101
101
|
TreeTable.#counter += 1;
|
|
102
102
|
this.#id = options.id === undefined ? `chui_tree_table_${TreeTable.#counter}` : options.id;
|
|
103
103
|
this.#root.id = this.#id;
|
|
104
|
-
this.#
|
|
105
|
-
this.#
|
|
104
|
+
this.#onSelect = options.onSelect;
|
|
105
|
+
this.#onToggle = options.onToggle;
|
|
106
106
|
this.#selectable = options.selectable === true;
|
|
107
107
|
if (options.changeEvent !== undefined) this.addChangeListener(options.changeEvent);
|
|
108
108
|
this.#label.className = "tree_table_label";
|
|
@@ -111,23 +111,23 @@ class TreeTable {
|
|
|
111
111
|
this.#grid.setAttribute("role", "treegrid");
|
|
112
112
|
this.#head.className = "tree_table_head";
|
|
113
113
|
this.#head.setAttribute("role", "rowgroup");
|
|
114
|
-
this.#
|
|
115
|
-
this.#
|
|
114
|
+
this.#headRow.className = "tree_table_head_row";
|
|
115
|
+
this.#headRow.setAttribute("role", "row");
|
|
116
116
|
this.#body.className = "tree_table_body";
|
|
117
117
|
this.#body.setAttribute("role", "rowgroup");
|
|
118
118
|
this.#empty.className = "tree_table_empty";
|
|
119
119
|
this.#status.className = "tree_table_status chui_visually_hidden";
|
|
120
120
|
this.#status.setAttribute("role", "status");
|
|
121
121
|
this.#status.setAttribute("aria-live", "polite");
|
|
122
|
-
this.#head.appendChild(this.#
|
|
122
|
+
this.#head.appendChild(this.#headRow);
|
|
123
123
|
this.#grid.appendChild(this.#head);
|
|
124
124
|
this.#grid.appendChild(this.#body);
|
|
125
125
|
this.#root.appendChild(this.#label);
|
|
126
126
|
this.#root.appendChild(this.#grid);
|
|
127
127
|
this.#root.appendChild(this.#empty);
|
|
128
128
|
this.#root.appendChild(this.#status);
|
|
129
|
-
if (options.emptyText !== undefined) this.#
|
|
130
|
-
else this.#
|
|
129
|
+
if (options.emptyText !== undefined) this.#emptyText = String(options.emptyText);
|
|
130
|
+
else this.#emptyText = I18n.t("common.nothingFound");
|
|
131
131
|
if (options.title !== undefined) this.setTitle(options.title);
|
|
132
132
|
else this.#label.hidden = true;
|
|
133
133
|
this.setLabel(optionOr(options.label, I18n.t("treeTable.label")));
|
|
@@ -150,12 +150,12 @@ class TreeTable {
|
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
getTitle() {
|
|
153
|
-
return this.#
|
|
153
|
+
return this.#titleText;
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
/** Доступное имя таблицы, заданное в `label` */
|
|
157
157
|
getLabel() {
|
|
158
|
-
return this.#
|
|
158
|
+
return this.#labelText;
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
/** Колонки: копии описаний */
|
|
@@ -217,7 +217,7 @@ class TreeTable {
|
|
|
217
217
|
|
|
218
218
|
/** Подпись над таблицей; `undefined` её убирает (имя тогда даёт `label`) */
|
|
219
219
|
setTitle(text = undefined) {
|
|
220
|
-
this.#
|
|
220
|
+
this.#titleText = text;
|
|
221
221
|
if (text === undefined || text === "") {
|
|
222
222
|
this.#label.hidden = true;
|
|
223
223
|
this.#label.innerText = "";
|
|
@@ -232,7 +232,7 @@ class TreeTable {
|
|
|
232
232
|
|
|
233
233
|
/** Имя таблицы, когда подписи в разметке нет */
|
|
234
234
|
setLabel(text = undefined) {
|
|
235
|
-
this.#
|
|
235
|
+
this.#labelText = text;
|
|
236
236
|
this.#syncLabel();
|
|
237
237
|
return this;
|
|
238
238
|
}
|
|
@@ -338,7 +338,7 @@ class TreeTable {
|
|
|
338
338
|
this.#filter = text === undefined ? "" : String(text);
|
|
339
339
|
this.#render();
|
|
340
340
|
if (this.#filter !== "")
|
|
341
|
-
this.#announce(I18n.t("treeTable.shownRows", { shown: this.#
|
|
341
|
+
this.#announce(I18n.t("treeTable.shownRows", { shown: this.#visibleCount, total: this.#index.size }));
|
|
342
342
|
return this;
|
|
343
343
|
}
|
|
344
344
|
|
|
@@ -391,9 +391,9 @@ class TreeTable {
|
|
|
391
391
|
const source = row === undefined || row === null ? {} : row;
|
|
392
392
|
const values = {};
|
|
393
393
|
for (const key of Object.keys(source)) if (!SERVICE_KEYS.includes(key)) values[key] = source[key];
|
|
394
|
-
TreeTable.#
|
|
394
|
+
TreeTable.#rowCounter += 1;
|
|
395
395
|
return {
|
|
396
|
-
id: source.id === undefined ? `tree_table_row_${TreeTable.#
|
|
396
|
+
id: source.id === undefined ? `tree_table_row_${TreeTable.#rowCounter}` : String(source.id),
|
|
397
397
|
values: values,
|
|
398
398
|
disabled: source.disabled === true,
|
|
399
399
|
default_expanded: source.expanded === true,
|
|
@@ -446,14 +446,14 @@ class TreeTable {
|
|
|
446
446
|
}
|
|
447
447
|
|
|
448
448
|
#accessibleName() {
|
|
449
|
-
if (this.#
|
|
450
|
-
if (this.#
|
|
449
|
+
if (this.#titleText !== undefined && this.#titleText !== "") return this.#titleText;
|
|
450
|
+
if (this.#labelText !== undefined && this.#labelText !== "") return this.#labelText;
|
|
451
451
|
return I18n.t("treeTable.label");
|
|
452
452
|
}
|
|
453
453
|
|
|
454
454
|
// Имя сетки: видимая подпись — через aria-labelledby, скрытая — через aria-label
|
|
455
455
|
#syncLabel() {
|
|
456
|
-
if (this.#
|
|
456
|
+
if (this.#titleText !== undefined && this.#titleText !== "") {
|
|
457
457
|
this.#grid.setAttribute("aria-labelledby", this.#label.id);
|
|
458
458
|
this.#grid.removeAttribute("aria-label");
|
|
459
459
|
return;
|
|
@@ -502,8 +502,8 @@ class TreeTable {
|
|
|
502
502
|
// Строки пересобираются, а фокус живёт на строке: запоминаем её до перерисовки
|
|
503
503
|
const active = document.activeElement;
|
|
504
504
|
const focused = active === null || !this.#grid.contains(active) ? null : active.closest("tree_table_row");
|
|
505
|
-
if (focused !== null) this.#
|
|
506
|
-
this.#
|
|
505
|
+
if (focused !== null) this.#focusId = focused.dataset.id;
|
|
506
|
+
this.#headRow.innerHTML = "";
|
|
507
507
|
this.#body.innerHTML = "";
|
|
508
508
|
for (const column of this.#columns) {
|
|
509
509
|
const cell = document.createElement("tree_table_head_cell");
|
|
@@ -511,14 +511,14 @@ class TreeTable {
|
|
|
511
511
|
if (column.align === "end") cell.classList.add("tree_table_cell_end");
|
|
512
512
|
cell.setAttribute("role", "columnheader");
|
|
513
513
|
cell.innerText = column.title;
|
|
514
|
-
this.#
|
|
514
|
+
this.#headRow.appendChild(cell);
|
|
515
515
|
}
|
|
516
516
|
this.#head.hidden = this.#columns.length === 0;
|
|
517
517
|
const visible = this.#flatten();
|
|
518
|
-
this.#
|
|
518
|
+
this.#visibleCount = visible.length;
|
|
519
519
|
for (const entry of visible) this.#body.appendChild(this.#rowNode(entry));
|
|
520
520
|
this.#empty.hidden = visible.length > 0;
|
|
521
|
-
this.#empty.innerText = this.#
|
|
521
|
+
this.#empty.innerText = this.#emptyText;
|
|
522
522
|
this.#applyStop();
|
|
523
523
|
return this;
|
|
524
524
|
}
|
|
@@ -594,14 +594,14 @@ class TreeTable {
|
|
|
594
594
|
const list = [...this.#body.querySelectorAll("tree_table_row")];
|
|
595
595
|
if (list.length === 0) return;
|
|
596
596
|
const stop =
|
|
597
|
-
list.find((row) => row.dataset.id === this.#
|
|
598
|
-
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) ??
|
|
599
599
|
list[0];
|
|
600
|
-
this.#
|
|
600
|
+
this.#activeId = stop.dataset.id;
|
|
601
601
|
for (const row of list) row.setAttribute("tabindex", row === stop ? "0" : "-1");
|
|
602
602
|
// Фокус возвращаем только если он был в таблице: иначе перерисовка его бы украла
|
|
603
|
-
if (this.#
|
|
604
|
-
this.#
|
|
603
|
+
if (this.#focusId !== undefined && stop.dataset.id === this.#focusId) {
|
|
604
|
+
this.#focusId = undefined;
|
|
605
605
|
stop.focus();
|
|
606
606
|
}
|
|
607
607
|
}
|
|
@@ -609,7 +609,7 @@ class TreeTable {
|
|
|
609
609
|
#focusRow(id = String()) {
|
|
610
610
|
const row = this.#body.querySelector(`tree_table_row[data-id="${CSS.escape(id)}"]`);
|
|
611
611
|
if (row === null) return;
|
|
612
|
-
this.#
|
|
612
|
+
this.#activeId = id;
|
|
613
613
|
for (const other of this.#body.querySelectorAll("tree_table_row")) {
|
|
614
614
|
other.setAttribute("tabindex", other === row ? "0" : "-1");
|
|
615
615
|
}
|
|
@@ -629,7 +629,7 @@ class TreeTable {
|
|
|
629
629
|
? I18n.t("treeTable.expanded", { name: this.#titleOf(node), count: node.children.length })
|
|
630
630
|
: I18n.t("treeTable.collapsed", { name: this.#titleOf(node) })
|
|
631
631
|
);
|
|
632
|
-
if (this.#
|
|
632
|
+
if (this.#onToggle !== undefined) this.#onToggle(this.#describe(node), value, this);
|
|
633
633
|
return this;
|
|
634
634
|
}
|
|
635
635
|
|
|
@@ -648,7 +648,7 @@ class TreeTable {
|
|
|
648
648
|
const node = this.#selected === undefined ? undefined : this.#index.get(this.#selected);
|
|
649
649
|
const row = node === undefined ? undefined : this.#describe(node);
|
|
650
650
|
for (const listener of [...this.#listeners]) listener(row, this);
|
|
651
|
-
if (this.#
|
|
651
|
+
if (this.#onSelect !== undefined) this.#onSelect(row, this);
|
|
652
652
|
}
|
|
653
653
|
|
|
654
654
|
#announce(text = String()) {
|
|
@@ -703,7 +703,7 @@ class TreeTable {
|
|
|
703
703
|
const list = this.#body.querySelectorAll("tree_table_row");
|
|
704
704
|
if (list.length === 0) return;
|
|
705
705
|
// Нажатия на самой стрелке (настоящая кнопка) не перехватываем
|
|
706
|
-
const
|
|
706
|
+
const fromButton = event.target instanceof Element && event.target.closest("button") !== null;
|
|
707
707
|
const row = this.#currentRow(event.target instanceof Element ? event.target : undefined);
|
|
708
708
|
const id = row === null ? undefined : row.dataset.id;
|
|
709
709
|
const node = id === undefined ? undefined : this.#index.get(id);
|
|
@@ -725,14 +725,14 @@ class TreeTable {
|
|
|
725
725
|
this.#focusRow(list[list.length - 1].dataset.id);
|
|
726
726
|
return;
|
|
727
727
|
case "ArrowRight": {
|
|
728
|
-
if (
|
|
728
|
+
if (fromButton || node === undefined || node.children.length === 0) return;
|
|
729
729
|
event.preventDefault();
|
|
730
730
|
if (!this.#expanded.has(id) && this.#filter === "") this.expand(id);
|
|
731
731
|
else this.#step(row, 1);
|
|
732
732
|
return;
|
|
733
733
|
}
|
|
734
734
|
case "ArrowLeft": {
|
|
735
|
-
if (
|
|
735
|
+
if (fromButton || node === undefined) return;
|
|
736
736
|
event.preventDefault();
|
|
737
737
|
if (node.children.length > 0 && this.#expanded.has(id)) {
|
|
738
738
|
this.collapse(id);
|
|
@@ -743,13 +743,13 @@ class TreeTable {
|
|
|
743
743
|
return;
|
|
744
744
|
}
|
|
745
745
|
case "Enter": {
|
|
746
|
-
if (
|
|
746
|
+
if (fromButton || node === undefined || node.children.length === 0) return;
|
|
747
747
|
event.preventDefault();
|
|
748
748
|
this.toggle(id);
|
|
749
749
|
return;
|
|
750
750
|
}
|
|
751
751
|
case " ": {
|
|
752
|
-
if (
|
|
752
|
+
if (fromButton || node === undefined) return;
|
|
753
753
|
event.preventDefault();
|
|
754
754
|
if (this.#selectable) this.#select(id);
|
|
755
755
|
else if (node.children.length > 0) this.toggle(id);
|
|
@@ -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
|
/* Стрелка: свёрнутый узел смотрит вправо, раскрытый — вниз */
|
|
@@ -88,7 +90,7 @@ tree_view_panel {
|
|
|
88
90
|
position: relative;
|
|
89
91
|
color: var(--text_color);
|
|
90
92
|
border: none;
|
|
91
|
-
transition: max-height var(--
|
|
93
|
+
transition: max-height var(--motion_base) var(--motion_ease);
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
/* Направляющая уровня: показывает, что вложенные строки относятся к раскрытому узлу */
|
|
@@ -170,7 +172,7 @@ tree_view_button.tree_view_button_drop_after {
|
|
|
170
172
|
}
|
|
171
173
|
|
|
172
174
|
tree_view_button.tree_view_button_drop_inside {
|
|
173
|
-
background: var(--
|
|
175
|
+
background: var(--blue_prime_background_tint_strong);
|
|
174
176
|
color: var(--text_color_hover);
|
|
175
177
|
}
|
|
176
178
|
|
|
@@ -184,8 +186,8 @@ tree_view_panel.tree_view_search_hidden {
|
|
|
184
186
|
|
|
185
187
|
/* Совпадение подсвечивается спокойным акцентом: акцент зарезервирован за выбором */
|
|
186
188
|
tree_view_button.tree_view_button_match {
|
|
187
|
-
background: var(--
|
|
188
|
-
border-radius: var(--
|
|
189
|
+
background: var(--blue_prime_background_tint_strong);
|
|
190
|
+
border-radius: var(--radius_sm);
|
|
189
191
|
}
|
|
190
192
|
|
|
191
193
|
/* === Отложенная отрисовка (опция deferRender) ===
|