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
|
@@ -151,16 +151,16 @@ class MaskedInput {
|
|
|
151
151
|
#error = document.createElement("chui_error_message");
|
|
152
152
|
#id = undefined;
|
|
153
153
|
#name = undefined;
|
|
154
|
-
#
|
|
155
|
-
#
|
|
154
|
+
#titleText = undefined;
|
|
155
|
+
#labelText = undefined;
|
|
156
156
|
#mask = "";
|
|
157
157
|
#rendered = "";
|
|
158
|
-
#
|
|
159
|
-
#
|
|
158
|
+
#placeholderText = "";
|
|
159
|
+
#placeholderDefault = false;
|
|
160
160
|
#disabled = false;
|
|
161
|
-
#
|
|
161
|
+
#readOnly = false;
|
|
162
162
|
#listeners = [];
|
|
163
|
-
#
|
|
163
|
+
#onChange = undefined;
|
|
164
164
|
|
|
165
165
|
constructor(
|
|
166
166
|
options = {
|
|
@@ -182,8 +182,8 @@ class MaskedInput {
|
|
|
182
182
|
MaskedInput.#counter += 1;
|
|
183
183
|
this.#id = options.id === undefined ? `chui_masked_input_${MaskedInput.#counter}` : options.id;
|
|
184
184
|
this.#name = options.name;
|
|
185
|
-
this.#
|
|
186
|
-
this.#
|
|
185
|
+
this.#labelText = options.label;
|
|
186
|
+
this.#onChange = options.onChange;
|
|
187
187
|
this.#mask = options.mask === undefined ? MaskedInput.MASKS.PHONE : String(options.mask);
|
|
188
188
|
this.#root.id = this.#id;
|
|
189
189
|
this.#label.className = "masked_label";
|
|
@@ -211,13 +211,13 @@ class MaskedInput {
|
|
|
211
211
|
this.#root.appendChild(this.#status);
|
|
212
212
|
if (options.title !== undefined) this.setTitle(options.title);
|
|
213
213
|
else this.#label.hidden = true;
|
|
214
|
-
this.setLabel(this.#
|
|
214
|
+
this.setLabel(this.#labelText === undefined ? I18n.t("forms.maskedLabel") : this.#labelText);
|
|
215
215
|
if (options.hint !== undefined) this.setHint(options.hint);
|
|
216
216
|
this.setPlaceholder(
|
|
217
217
|
options.placeholder === undefined ? MaskedInput.placeholderText(this.#mask) : options.placeholder
|
|
218
218
|
);
|
|
219
219
|
// Флаг ставим после `setPlaceholder`: он же отмечает образец как заданный вручную
|
|
220
|
-
this.#
|
|
220
|
+
this.#placeholderDefault = options.placeholder === undefined;
|
|
221
221
|
// Текст «неверный формат» у маски значит «поле не дозаполнено» — так и говорим
|
|
222
222
|
const messages = Object.assign({ pattern: I18n.t("forms.maskedIncomplete") }, options.messages);
|
|
223
223
|
Validate.installField(
|
|
@@ -247,12 +247,12 @@ class MaskedInput {
|
|
|
247
247
|
}
|
|
248
248
|
|
|
249
249
|
getTitle() {
|
|
250
|
-
return this.#
|
|
250
|
+
return this.#titleText;
|
|
251
251
|
}
|
|
252
252
|
|
|
253
253
|
/** Доступное имя поля, заданное в `label` */
|
|
254
254
|
getLabel() {
|
|
255
|
-
return this.#
|
|
255
|
+
return this.#labelText;
|
|
256
256
|
}
|
|
257
257
|
|
|
258
258
|
getMask() {
|
|
@@ -275,7 +275,7 @@ class MaskedInput {
|
|
|
275
275
|
}
|
|
276
276
|
|
|
277
277
|
getPlaceholder() {
|
|
278
|
-
return this.#
|
|
278
|
+
return this.#placeholderText;
|
|
279
279
|
}
|
|
280
280
|
|
|
281
281
|
getDisabled() {
|
|
@@ -283,7 +283,7 @@ class MaskedInput {
|
|
|
283
283
|
}
|
|
284
284
|
|
|
285
285
|
isReadOnly() {
|
|
286
|
-
return this.#
|
|
286
|
+
return this.#readOnly;
|
|
287
287
|
}
|
|
288
288
|
|
|
289
289
|
// SET
|
|
@@ -302,7 +302,7 @@ class MaskedInput {
|
|
|
302
302
|
|
|
303
303
|
/** Подпись над полем; `undefined` её убирает (имя тогда даёт `label`) */
|
|
304
304
|
setTitle(text = undefined) {
|
|
305
|
-
this.#
|
|
305
|
+
this.#titleText = text;
|
|
306
306
|
if (text === undefined || text === "") {
|
|
307
307
|
this.#label.hidden = true;
|
|
308
308
|
this.#label.innerText = "";
|
|
@@ -319,8 +319,8 @@ class MaskedInput {
|
|
|
319
319
|
|
|
320
320
|
/** Имя поля, когда подписи в разметке нет */
|
|
321
321
|
setLabel(text = undefined) {
|
|
322
|
-
this.#
|
|
323
|
-
if (this.#
|
|
322
|
+
this.#labelText = text;
|
|
323
|
+
if (this.#titleText === undefined || this.#titleText === "") {
|
|
324
324
|
if (text === undefined) this.#input.removeAttribute("aria-label");
|
|
325
325
|
else this.#input.setAttribute("aria-label", String(text));
|
|
326
326
|
}
|
|
@@ -342,9 +342,9 @@ class MaskedInput {
|
|
|
342
342
|
}
|
|
343
343
|
|
|
344
344
|
setPlaceholder(text = String()) {
|
|
345
|
-
this.#
|
|
346
|
-
this.#
|
|
347
|
-
this.#input.placeholder = this.#
|
|
345
|
+
this.#placeholderText = text === undefined ? "" : String(text);
|
|
346
|
+
this.#placeholderDefault = false;
|
|
347
|
+
this.#input.placeholder = this.#placeholderText;
|
|
348
348
|
return this;
|
|
349
349
|
}
|
|
350
350
|
|
|
@@ -358,10 +358,10 @@ class MaskedInput {
|
|
|
358
358
|
const rules = this.getRules === undefined ? undefined : this.getRules();
|
|
359
359
|
if (rules !== undefined) rules.pattern = MaskedInput.maskPattern(this.#mask);
|
|
360
360
|
// Своя подсказка-образец остаётся, а вид маски по умолчанию пересобирается
|
|
361
|
-
if (this.#
|
|
362
|
-
this.#
|
|
363
|
-
this.#input.placeholder = this.#
|
|
364
|
-
this.#
|
|
361
|
+
if (this.#placeholderDefault) {
|
|
362
|
+
this.#placeholderText = MaskedInput.placeholderText(this.#mask);
|
|
363
|
+
this.#input.placeholder = this.#placeholderText;
|
|
364
|
+
this.#placeholderDefault = true;
|
|
365
365
|
}
|
|
366
366
|
return this;
|
|
367
367
|
}
|
|
@@ -391,10 +391,10 @@ class MaskedInput {
|
|
|
391
391
|
}
|
|
392
392
|
|
|
393
393
|
/** Режим показа: значение видно, но поле не принимает нажатия */
|
|
394
|
-
setReadOnly(
|
|
395
|
-
this.#
|
|
396
|
-
this.#root.classList.toggle("masked_readonly", this.#
|
|
397
|
-
this.#input.readOnly = this.#
|
|
394
|
+
setReadOnly(readOnly = Boolean()) {
|
|
395
|
+
this.#readOnly = readOnly === true;
|
|
396
|
+
this.#root.classList.toggle("masked_readonly", this.#readOnly);
|
|
397
|
+
this.#input.readOnly = this.#readOnly;
|
|
398
398
|
return this;
|
|
399
399
|
}
|
|
400
400
|
|
|
@@ -424,8 +424,8 @@ class MaskedInput {
|
|
|
424
424
|
|
|
425
425
|
// === ВНУТРЕННЕЕ ===
|
|
426
426
|
#accessibleName() {
|
|
427
|
-
if (this.#
|
|
428
|
-
if (this.#
|
|
427
|
+
if (this.#titleText !== undefined && this.#titleText !== "") return this.#titleText;
|
|
428
|
+
if (this.#labelText !== undefined && this.#labelText !== "") return this.#labelText;
|
|
429
429
|
return I18n.t("forms.maskedLabel");
|
|
430
430
|
}
|
|
431
431
|
|
|
@@ -476,7 +476,7 @@ class MaskedInput {
|
|
|
476
476
|
|
|
477
477
|
#notify() {
|
|
478
478
|
for (const listener of [...this.#listeners]) listener(this.#rendered, this);
|
|
479
|
-
if (this.#
|
|
479
|
+
if (this.#onChange !== undefined) this.#onChange(this.#rendered, this);
|
|
480
480
|
}
|
|
481
481
|
|
|
482
482
|
#announce(text = String()) {
|
|
@@ -489,36 +489,36 @@ class MaskedInput {
|
|
|
489
489
|
* и раскладываем по позициям маски заново.
|
|
490
490
|
*/
|
|
491
491
|
#onInput = () => {
|
|
492
|
-
if (this.#disabled || this.#
|
|
492
|
+
if (this.#disabled || this.#readOnly) return;
|
|
493
493
|
const next = this.#input.value;
|
|
494
494
|
const previous = this.#rendered;
|
|
495
495
|
let start = 0;
|
|
496
496
|
while (start < previous.length && start < next.length && previous[start] === next[start]) start += 1;
|
|
497
|
-
let
|
|
498
|
-
let
|
|
499
|
-
while (
|
|
500
|
-
|
|
501
|
-
|
|
497
|
+
let previousEnd = previous.length;
|
|
498
|
+
let nextEnd = next.length;
|
|
499
|
+
while (previousEnd > start && nextEnd > start && previous[previousEnd - 1] === next[nextEnd - 1]) {
|
|
500
|
+
previousEnd -= 1;
|
|
501
|
+
nextEnd -= 1;
|
|
502
502
|
}
|
|
503
|
-
const
|
|
503
|
+
const insertedText = next.slice(start, nextEnd);
|
|
504
504
|
const data = MaskedInput.#collect(this.#mask, previous, 0);
|
|
505
505
|
const before = MaskedInput.#placeholders(this.#mask, start);
|
|
506
|
-
const removed = MaskedInput.#placeholders(this.#mask,
|
|
507
|
-
const inserted = MaskedInput.#collect(this.#mask,
|
|
506
|
+
const removed = MaskedInput.#placeholders(this.#mask, previousEnd) - before;
|
|
507
|
+
const inserted = MaskedInput.#collect(this.#mask, insertedText, start);
|
|
508
508
|
const list = data.slice(0, before).concat(inserted, data.slice(before + removed));
|
|
509
509
|
const value = MaskedInput.#format(this.#mask, list);
|
|
510
|
-
const
|
|
510
|
+
const completeBefore = this.isComplete();
|
|
511
511
|
const changed = this.#apply(value);
|
|
512
512
|
const caret = this.#caretAfter(value, before + inserted.length);
|
|
513
513
|
this.#input.setSelectionRange(caret, caret);
|
|
514
514
|
// Отклонённый символ и заполненная маска иначе не заметны: поле просто ничего не делает.
|
|
515
515
|
// Литералы самой маски («-», «(») за отказ не считаем — их место в шаблоне.
|
|
516
|
-
const junk = [...
|
|
516
|
+
const junk = [...insertedText].filter(
|
|
517
517
|
(symbol) => symbol !== "" && !this.#accepts(symbol) && !this.#mask.includes(symbol)
|
|
518
518
|
);
|
|
519
519
|
if (junk.length > 0) {
|
|
520
520
|
this.#announce(I18n.t("forms.maskedAllowedOnly", { value: this.#allowedText() }));
|
|
521
|
-
} else if (!
|
|
521
|
+
} else if (!completeBefore && this.isComplete()) {
|
|
522
522
|
this.#announce(I18n.t("forms.maskedComplete"));
|
|
523
523
|
} else if (this.#status.innerText !== "") {
|
|
524
524
|
this.#announce("");
|
|
@@ -531,7 +531,7 @@ class MaskedInput {
|
|
|
531
531
|
// Backspace снимает ближайший значимый символ слева, Delete — справа (как в тексте).
|
|
532
532
|
// Иначе каретка сразу за литералом удаляла бы символ справа от себя.
|
|
533
533
|
#onKeyDown = (event) => {
|
|
534
|
-
if (this.#disabled || this.#
|
|
534
|
+
if (this.#disabled || this.#readOnly) return;
|
|
535
535
|
if (event.key !== "Backspace" && event.key !== "Delete") return;
|
|
536
536
|
const caret = this.#input.selectionStart;
|
|
537
537
|
if (caret === null || caret !== this.#input.selectionEnd) return;
|
|
@@ -5,18 +5,18 @@ chui_masked_input {
|
|
|
5
5
|
карточку. Токены переопределены у корня поля, поэтому действуют только внутри него
|
|
6
6
|
(тот же приём у полосы меню-бара). */
|
|
7
7
|
--control_padding: var(--control_padding_sm);
|
|
8
|
-
--
|
|
8
|
+
--block_padding: var(--block_padding_sm);
|
|
9
9
|
display: flex;
|
|
10
10
|
flex-direction: column;
|
|
11
11
|
width: var(--control_width);
|
|
12
12
|
height: max-content;
|
|
13
|
-
margin: var(--
|
|
13
|
+
margin: var(--block_margin);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
.masked_label {
|
|
17
17
|
display: block;
|
|
18
18
|
width: max-content;
|
|
19
|
-
margin: 0 0 var(--
|
|
19
|
+
margin: 0 0 var(--block_margin);
|
|
20
20
|
color: var(--text_color);
|
|
21
21
|
font-size: var(--font_labels_size);
|
|
22
22
|
font-weight: 500;
|
|
@@ -33,9 +33,9 @@ chui_masked_input {
|
|
|
33
33
|
width: -webkit-fill-available;
|
|
34
34
|
min-height: var(--control_height);
|
|
35
35
|
margin: 0;
|
|
36
|
-
padding: var(--
|
|
36
|
+
padding: var(--block_padding);
|
|
37
37
|
border: 1px solid var(--border_color);
|
|
38
|
-
border-radius: var(--
|
|
38
|
+
border-radius: var(--radius_sm);
|
|
39
39
|
background: var(--element_background);
|
|
40
40
|
color: var(--text_color);
|
|
41
41
|
}
|
|
@@ -59,10 +59,10 @@ class Mention {
|
|
|
59
59
|
#multiline = false;
|
|
60
60
|
#placeholder = "";
|
|
61
61
|
#name = undefined;
|
|
62
|
-
#
|
|
63
|
-
#
|
|
62
|
+
#labelText = undefined;
|
|
63
|
+
#hintText = undefined;
|
|
64
64
|
#disabled = false;
|
|
65
|
-
#
|
|
65
|
+
#changeListeners = [];
|
|
66
66
|
|
|
67
67
|
constructor(
|
|
68
68
|
options = {
|
|
@@ -85,8 +85,8 @@ class Mention {
|
|
|
85
85
|
) {
|
|
86
86
|
setStyles(__dirname + "/styles.css", "chUiJS_Mention");
|
|
87
87
|
this.#name = options.name;
|
|
88
|
-
this.#
|
|
89
|
-
this.#
|
|
88
|
+
this.#labelText = options.label;
|
|
89
|
+
this.#hintText = options.hint;
|
|
90
90
|
this.#placeholder = options.placeholder === undefined ? "" : options.placeholder;
|
|
91
91
|
this.#multiline = options.multiline === true;
|
|
92
92
|
if (options.trigger !== undefined) this.#trigger = options.trigger;
|
|
@@ -114,7 +114,7 @@ class Mention {
|
|
|
114
114
|
this.#hint.id = `${this.#id}_hint`;
|
|
115
115
|
this.#hint.className = "mention_hint";
|
|
116
116
|
this.#hint.innerText =
|
|
117
|
-
this.#
|
|
117
|
+
this.#hintText === undefined ? I18n.t("forms.mentionHint", { trigger: this.#trigger }) : this.#hintText;
|
|
118
118
|
this.#input.setAttribute("aria-describedby", this.#hint.id);
|
|
119
119
|
this.#status.setAttribute("role", "status");
|
|
120
120
|
this.#status.setAttribute("aria-live", "polite");
|
|
@@ -222,7 +222,7 @@ class Mention {
|
|
|
222
222
|
}
|
|
223
223
|
setTrigger(trigger = String()) {
|
|
224
224
|
this.#trigger = trigger;
|
|
225
|
-
if (this.#
|
|
225
|
+
if (this.#hintText === undefined)
|
|
226
226
|
this.#hint.innerText = I18n.t("forms.mentionHint", { trigger: this.#trigger });
|
|
227
227
|
this.#setDropdown(false);
|
|
228
228
|
return this;
|
|
@@ -233,7 +233,7 @@ class Mention {
|
|
|
233
233
|
return this;
|
|
234
234
|
}
|
|
235
235
|
setHint(text = String()) {
|
|
236
|
-
this.#
|
|
236
|
+
this.#hintText = text;
|
|
237
237
|
this.#hint.innerText = text;
|
|
238
238
|
this.#hint.style.display = String(text).trim() === "" ? "none" : "";
|
|
239
239
|
return this;
|
|
@@ -250,7 +250,7 @@ class Mention {
|
|
|
250
250
|
return this;
|
|
251
251
|
}
|
|
252
252
|
addChangeListener(listener = () => {}) {
|
|
253
|
-
this.#
|
|
253
|
+
this.#changeListeners.push(listener);
|
|
254
254
|
return this;
|
|
255
255
|
}
|
|
256
256
|
set() {
|
|
@@ -279,8 +279,8 @@ class Mention {
|
|
|
279
279
|
return { start: index, query: query };
|
|
280
280
|
}
|
|
281
281
|
#syncFieldAria() {
|
|
282
|
-
const
|
|
283
|
-
if (
|
|
282
|
+
const hasTitle = this.#label !== undefined && this.#label.innerText !== "";
|
|
283
|
+
if (hasTitle) {
|
|
284
284
|
this.#input.setAttribute("aria-labelledby", this.#label.id);
|
|
285
285
|
this.#input.removeAttribute("aria-label");
|
|
286
286
|
return;
|
|
@@ -288,7 +288,7 @@ class Mention {
|
|
|
288
288
|
this.#input.removeAttribute("aria-labelledby");
|
|
289
289
|
this.#input.setAttribute(
|
|
290
290
|
"aria-label",
|
|
291
|
-
this.#
|
|
291
|
+
this.#labelText === undefined ? I18n.t("forms.mentionLabel") : this.#labelText
|
|
292
292
|
);
|
|
293
293
|
}
|
|
294
294
|
/** Пересобрать подсказки по тексту до каретки и открыть список, если есть совпадения */
|
|
@@ -365,7 +365,7 @@ class Mention {
|
|
|
365
365
|
}
|
|
366
366
|
#emit() {
|
|
367
367
|
const text = this.getValue();
|
|
368
|
-
for (const listener of [...this.#
|
|
368
|
+
for (const listener of [...this.#changeListeners]) listener(text);
|
|
369
369
|
}
|
|
370
370
|
|
|
371
371
|
// === ОБРАБОТЧИКИ ===
|
|
@@ -5,11 +5,11 @@ chui_mention {
|
|
|
5
5
|
карточку. Токены переопределены у корня поля, поэтому действуют только внутри него
|
|
6
6
|
(тот же приём у полосы меню-бара). */
|
|
7
7
|
--control_padding: var(--control_padding_sm);
|
|
8
|
-
--
|
|
8
|
+
--block_padding: var(--block_padding_sm);
|
|
9
9
|
display: flex;
|
|
10
10
|
flex-direction: column;
|
|
11
11
|
height: max-content;
|
|
12
|
-
margin: var(--
|
|
12
|
+
margin: var(--block_margin);
|
|
13
13
|
width: var(--control_width);
|
|
14
14
|
font-size: var(--font_default_size);
|
|
15
15
|
color: var(--text_color);
|
|
@@ -18,7 +18,7 @@ chui_mention {
|
|
|
18
18
|
.mention_label {
|
|
19
19
|
height: max-content;
|
|
20
20
|
width: max-content;
|
|
21
|
-
margin: 0 0 var(--
|
|
21
|
+
margin: 0 0 var(--block_margin);
|
|
22
22
|
font-size: var(--font_labels_size);
|
|
23
23
|
font-weight: 500;
|
|
24
24
|
color: var(--text_color);
|
|
@@ -31,7 +31,7 @@ mention_field {
|
|
|
31
31
|
flex-direction: column;
|
|
32
32
|
height: max-content;
|
|
33
33
|
width: -webkit-fill-available;
|
|
34
|
-
border-radius: var(--
|
|
34
|
+
border-radius: var(--radius_sm);
|
|
35
35
|
background: var(--element_background);
|
|
36
36
|
border: 1px solid var(--border_color);
|
|
37
37
|
}
|
|
@@ -41,10 +41,10 @@ mention_field {
|
|
|
41
41
|
box-sizing: border-box;
|
|
42
42
|
width: 100%;
|
|
43
43
|
margin: 0;
|
|
44
|
-
padding: var(--
|
|
44
|
+
padding: var(--block_padding);
|
|
45
45
|
background: transparent;
|
|
46
46
|
border: none;
|
|
47
|
-
border-radius: var(--
|
|
47
|
+
border-radius: var(--radius_sm);
|
|
48
48
|
color: var(--text_color);
|
|
49
49
|
font-size: var(--font_default_size);
|
|
50
50
|
font-family: inherit;
|
|
@@ -74,7 +74,7 @@ mention_dropdown {
|
|
|
74
74
|
backdrop-filter: var(--global_blur);
|
|
75
75
|
-webkit-backdrop-filter: var(--global_blur);
|
|
76
76
|
border: 1px solid var(--border_color);
|
|
77
|
-
border-radius: var(--
|
|
77
|
+
border-radius: var(--radius_sm);
|
|
78
78
|
box-shadow: var(--box_shadow_main);
|
|
79
79
|
/* Прокрутка списка подсказок; `overflow: overlay` удалён в Chromium 122 */
|
|
80
80
|
overflow: hidden auto;
|
|
@@ -87,6 +87,12 @@ mention_dropdown[hidden] {
|
|
|
87
87
|
display: none;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
/* Появление списка подсказок: общий кадр панели, он же проигрывается заново при снятии
|
|
91
|
+
`hidden`. Прежде список появлялся без движения вовсе */
|
|
92
|
+
mention_dropdown {
|
|
93
|
+
animation: chui_panel_in var(--motion_base) var(--motion_spring);
|
|
94
|
+
}
|
|
95
|
+
|
|
90
96
|
.mention_option {
|
|
91
97
|
display: flex;
|
|
92
98
|
flex-direction: row;
|
|
@@ -132,7 +138,7 @@ mention_dropdown[hidden] {
|
|
|
132
138
|
|
|
133
139
|
.mention_hint {
|
|
134
140
|
display: block;
|
|
135
|
-
margin: var(--
|
|
141
|
+
margin: var(--block_margin);
|
|
136
142
|
color: var(--text_color_disabled);
|
|
137
143
|
font-size: var(--font_labels_size);
|
|
138
144
|
}
|