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,7 +1,8 @@
|
|
|
1
|
-
const {Button} = require(
|
|
2
|
-
const {Icons} = require(
|
|
3
|
-
const {Desktop} = require(
|
|
4
|
-
const {I18n} = require(
|
|
1
|
+
const { Button } = require("../chui_button/button");
|
|
2
|
+
const { Icons } = require("../chui_icons/icons");
|
|
3
|
+
const { Desktop } = require("../../modules/chui_services/desktop");
|
|
4
|
+
const { I18n } = require("../../modules/chui_i18n/chui_i18n");
|
|
5
|
+
const { reportError } = require("../../modules/chui_logger/chui_logger");
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Кнопка печати: печатает страницу целиком, готовый HTML или элемент с его стилями.
|
|
@@ -22,7 +23,7 @@ const {I18n} = require('../../modules/chui_i18n/chui_i18n');
|
|
|
22
23
|
class PrintButton {
|
|
23
24
|
static MODE = {
|
|
24
25
|
PRINT: "print",
|
|
25
|
-
PDF: "pdf"
|
|
26
|
+
PDF: "pdf",
|
|
26
27
|
};
|
|
27
28
|
|
|
28
29
|
#button = undefined;
|
|
@@ -30,34 +31,45 @@ class PrintButton {
|
|
|
30
31
|
#target = undefined;
|
|
31
32
|
#html = undefined;
|
|
32
33
|
#options = {};
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
#
|
|
34
|
+
#fileName = undefined;
|
|
35
|
+
#documentTitle = undefined;
|
|
36
|
+
#onResult = undefined;
|
|
37
|
+
#onError = undefined;
|
|
36
38
|
|
|
37
|
-
constructor(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
39
|
+
constructor(
|
|
40
|
+
options = {
|
|
41
|
+
title: String(),
|
|
42
|
+
mode: String(),
|
|
43
|
+
target: undefined,
|
|
44
|
+
html: undefined,
|
|
45
|
+
options: {},
|
|
46
|
+
fileName: String(),
|
|
47
|
+
documentTitle: String(),
|
|
48
|
+
icon: undefined,
|
|
49
|
+
onResult: undefined,
|
|
50
|
+
onError: undefined,
|
|
51
|
+
}
|
|
52
|
+
) {
|
|
48
53
|
this.#mode = options.mode === undefined ? PrintButton.MODE.PRINT : options.mode;
|
|
49
54
|
this.#target = options.target;
|
|
50
55
|
this.#html = options.html;
|
|
51
56
|
this.#options = options.options === undefined ? {} : options.options;
|
|
52
|
-
this.#
|
|
53
|
-
this.#
|
|
54
|
-
this.#
|
|
57
|
+
this.#fileName = options.fileName;
|
|
58
|
+
this.#documentTitle = options.documentTitle;
|
|
59
|
+
this.#onResult = options.onResult;
|
|
60
|
+
this.#onError = options.onError;
|
|
55
61
|
this.#button = new Button({
|
|
56
|
-
title:
|
|
62
|
+
title:
|
|
63
|
+
options.title === undefined
|
|
64
|
+
? this.#mode === PrintButton.MODE.PDF
|
|
65
|
+
? I18n.t("graphics.printSavePdf")
|
|
66
|
+
: I18n.t("graphics.print")
|
|
67
|
+
: options.title,
|
|
57
68
|
icon: options.icon === undefined ? Icons.ACTIONS.PRINT : options.icon,
|
|
58
69
|
clickEvent: () => {
|
|
59
|
-
|
|
60
|
-
|
|
70
|
+
// Отказ сервиса не глушим: приложению — `onError`, без него — в лог
|
|
71
|
+
this.print().catch((error) => reportError(error, this.#onError));
|
|
72
|
+
},
|
|
61
73
|
});
|
|
62
74
|
}
|
|
63
75
|
|
|
@@ -99,13 +111,16 @@ class PrintButton {
|
|
|
99
111
|
/** Запустить печать или сохранение PDF; возвращает результат сервиса */
|
|
100
112
|
print() {
|
|
101
113
|
const html = this.#buildHtml();
|
|
102
|
-
const options = {...this.#options};
|
|
103
|
-
if (this.#
|
|
104
|
-
const request =
|
|
105
|
-
|
|
106
|
-
|
|
114
|
+
const options = { ...this.#options };
|
|
115
|
+
if (this.#fileName !== undefined) options.fileName = this.#fileName;
|
|
116
|
+
const request =
|
|
117
|
+
this.#mode === PrintButton.MODE.PDF
|
|
118
|
+
? Desktop.print.pdf(html === undefined ? document.documentElement.outerHTML : html, options)
|
|
119
|
+
: html === undefined
|
|
120
|
+
? Desktop.print.page(options)
|
|
121
|
+
: Desktop.print.html(html, options);
|
|
107
122
|
return request.then((result) => {
|
|
108
|
-
if (this.#
|
|
123
|
+
if (this.#onResult !== undefined) this.#onResult(result);
|
|
109
124
|
return result;
|
|
110
125
|
});
|
|
111
126
|
}
|
|
@@ -122,9 +137,9 @@ class PrintButton {
|
|
|
122
137
|
const node = this.#target instanceof Element ? this.#target : this.#target.set();
|
|
123
138
|
if (node === undefined || node === null) return undefined;
|
|
124
139
|
const styles = [...document.querySelectorAll("style")].map((style) => style.outerHTML).join("\n");
|
|
125
|
-
const title = this.#
|
|
140
|
+
const title = this.#documentTitle === undefined ? "" : `<title>${this.#documentTitle}</title>`;
|
|
126
141
|
return `<!DOCTYPE html><html><head><meta charset="utf-8">${title}${styles}</head><body>${node.outerHTML}</body></html>`;
|
|
127
142
|
}
|
|
128
143
|
}
|
|
129
144
|
|
|
130
|
-
exports.PrintButton = PrintButton
|
|
145
|
+
exports.PrintButton = PrintButton;
|
|
@@ -7,31 +7,35 @@
|
|
|
7
7
|
* уходит в `aria-valuetext`, чтобы «40%» не читалось дважды.
|
|
8
8
|
*
|
|
9
9
|
* Значение зажимается в `0…max`, `setMax()` не принимает неположительный максимум —
|
|
10
|
-
* иначе полоса и её озвучка расходились бы.
|
|
10
|
+
* иначе полоса и её озвучка расходились бы. Смена значения идёт движением: заливка догоняет
|
|
11
|
+
* число за время токена `--motion_base`, а при уменьшенном движении значение ставится сразу.
|
|
11
12
|
*/
|
|
13
|
+
const { animate, reducedMotion } = require("../../modules/chui_animations/motion");
|
|
12
14
|
class ProgressBar {
|
|
13
15
|
#id = require("randomstring").generate();
|
|
14
16
|
#ProgressBar = document.createElement(`progress`);
|
|
15
17
|
#main = document.createElement("progress_block");
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
+
#progressCount = document.createElement("progress_count");
|
|
19
|
+
#progressText = document.createElement("progress_text");
|
|
18
20
|
#label = undefined;
|
|
21
|
+
// Остановка догоняющих кадров: новое значение отменяет прежнее движение
|
|
22
|
+
#stop = undefined;
|
|
19
23
|
constructor(options = { max: Number(), label: String() }) {
|
|
20
|
-
require(
|
|
24
|
+
require("../../modules/chui_functions").setStyles(__dirname + "/styles.css", "chUiJS_ProgressBar");
|
|
21
25
|
// Роль дублирует нативную у <progress>, но делает разметку явной для тестов и стендов
|
|
22
26
|
this.#ProgressBar.setAttribute("role", "progressbar");
|
|
23
27
|
if (options.max !== undefined) this.setMax(options.max);
|
|
24
28
|
this.#ProgressBar.id = this.#id;
|
|
25
|
-
this.#
|
|
26
|
-
this.#
|
|
29
|
+
this.#progressCount.setAttribute("for", this.#id);
|
|
30
|
+
this.#progressText.setAttribute("for", this.#id);
|
|
27
31
|
// Подписи рядом с полосой — внешний вид: значение объявляет сама полоса
|
|
28
|
-
this.#
|
|
29
|
-
this.#
|
|
32
|
+
this.#progressCount.setAttribute("aria-hidden", "true");
|
|
33
|
+
this.#progressText.setAttribute("aria-hidden", "true");
|
|
30
34
|
// Вид подписей полностью в CSS: прежде отступы, ширина и выравнивание
|
|
31
35
|
// задавались отсюда инлайново и расходились с темой
|
|
32
|
-
this.#main.appendChild(this.#
|
|
33
|
-
this.#main.appendChild(this.#ProgressBar)
|
|
34
|
-
this.#main.appendChild(this.#
|
|
36
|
+
this.#main.appendChild(this.#progressCount);
|
|
37
|
+
this.#main.appendChild(this.#ProgressBar);
|
|
38
|
+
this.#main.appendChild(this.#progressText);
|
|
35
39
|
this.setLabel(options.label);
|
|
36
40
|
}
|
|
37
41
|
#clamp(value) {
|
|
@@ -40,10 +44,16 @@ class ProgressBar {
|
|
|
40
44
|
if (Number.isNaN(number) || Number.isNaN(max) || max <= 0) return 0;
|
|
41
45
|
return Math.min(Math.max(number, 0), max);
|
|
42
46
|
}
|
|
43
|
-
getValue() {
|
|
44
|
-
|
|
47
|
+
getValue() {
|
|
48
|
+
return Number(this.#ProgressBar.value);
|
|
49
|
+
}
|
|
50
|
+
getMax() {
|
|
51
|
+
return Number(this.#ProgressBar.max);
|
|
52
|
+
}
|
|
45
53
|
/** Имя полосы для скринридера */
|
|
46
|
-
getLabel() {
|
|
54
|
+
getLabel() {
|
|
55
|
+
return this.#label;
|
|
56
|
+
}
|
|
47
57
|
setLabel(text = String()) {
|
|
48
58
|
this.#label = text === undefined || text === "" ? undefined : text;
|
|
49
59
|
if (this.#label === undefined) this.#ProgressBar.removeAttribute("aria-label");
|
|
@@ -62,21 +72,41 @@ class ProgressBar {
|
|
|
62
72
|
return this;
|
|
63
73
|
}
|
|
64
74
|
setProgressCountText(text = String()) {
|
|
65
|
-
this.#
|
|
75
|
+
this.#progressCount.innerText = text;
|
|
66
76
|
return this;
|
|
67
77
|
}
|
|
68
78
|
setValue(value = Number()) {
|
|
69
|
-
this.#
|
|
79
|
+
this.#animateTo(this.#clamp(value));
|
|
70
80
|
return this;
|
|
71
81
|
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Смена значения идёт движением: заливка догоняет число, а не перескакивает кадром.
|
|
85
|
+
* Ширину заливки у нативного `progress` задаёт браузер — переходом её не задать,
|
|
86
|
+
* поэтому целевое значение догоняют кадры, а их считает общий движок движения.
|
|
87
|
+
*/
|
|
88
|
+
#animateTo(target = Number()) {
|
|
89
|
+
const from = Number(this.#ProgressBar.value);
|
|
90
|
+
this.#stop?.();
|
|
91
|
+
this.#stop = undefined;
|
|
92
|
+
if (from === target || reducedMotion()) {
|
|
93
|
+
this.#ProgressBar.value = target;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.#stop = animate((t) => {
|
|
97
|
+
this.#ProgressBar.value = from + (target - from) * t;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
72
100
|
setProgressText(text = String()) {
|
|
73
|
-
this.#
|
|
101
|
+
this.#progressText.innerText = text;
|
|
74
102
|
// Тот же текст читает скринридер вместо числа: подпись помечена aria-hidden
|
|
75
103
|
if (text === undefined || text === "") this.#ProgressBar.removeAttribute("aria-valuetext");
|
|
76
104
|
else this.#ProgressBar.setAttribute("aria-valuetext", String(text));
|
|
77
105
|
return this;
|
|
78
106
|
}
|
|
79
|
-
set() {
|
|
107
|
+
set() {
|
|
108
|
+
return this.#main;
|
|
109
|
+
}
|
|
80
110
|
}
|
|
81
111
|
|
|
82
|
-
exports.ProgressBar = ProgressBar
|
|
112
|
+
exports.ProgressBar = ProgressBar;
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
progress_block {
|
|
2
2
|
/* Толщина дорожки одной переменной: полоса тоньше 29-пиксельного контрола и
|
|
3
3
|
читается индикатором, а не плашкой (прежде было 15px — ростом с кнопку) */
|
|
4
|
-
--
|
|
4
|
+
--progress_bar_height: 8px;
|
|
5
5
|
width: max-content;
|
|
6
6
|
height: max-content;
|
|
7
|
-
margin: var(--
|
|
7
|
+
margin: var(--block_margin);
|
|
8
8
|
font-size: var(--font_labels_size);
|
|
9
9
|
color: var(--text_color_disabled);
|
|
10
10
|
/* Подписи стоят по левому краю полосы: центрирование расходилось с полосой */
|
|
11
11
|
text-align: start;
|
|
12
|
-
font-weight: 500
|
|
12
|
+
font-weight: 500;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
progress {
|
|
16
16
|
display: block;
|
|
17
17
|
border-radius: var(--radius_pill);
|
|
18
18
|
text-align: start;
|
|
19
|
-
margin: var(--
|
|
19
|
+
margin: var(--block_margin) 0;
|
|
20
20
|
width: -webkit-fill-available;
|
|
21
|
-
height: var(--
|
|
21
|
+
height: var(--progress_bar_height);
|
|
22
22
|
border: none;
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -53,4 +53,4 @@ progress_count + progress {
|
|
|
53
53
|
|
|
54
54
|
progress + progress_text {
|
|
55
55
|
margin-block-start: 4px;
|
|
56
|
-
}
|
|
56
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const {setStyles, optionOr} = require(
|
|
2
|
-
const {I18n} = require(
|
|
1
|
+
const { setStyles, optionOr } = require("../../modules/chui_functions");
|
|
2
|
+
const { I18n } = require("../../modules/chui_i18n/chui_i18n");
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Круговой индикатор прогресса: кольцо с процентом внутри.
|
|
@@ -32,30 +32,32 @@ class ProgressRing {
|
|
|
32
32
|
#root = document.createElement("chui_progress_ring");
|
|
33
33
|
#svg = undefined;
|
|
34
34
|
#track = undefined;
|
|
35
|
-
#
|
|
35
|
+
#valueArc = undefined;
|
|
36
36
|
#text = document.createElement("progress_ring_text");
|
|
37
37
|
#id = undefined;
|
|
38
38
|
#value = 0;
|
|
39
39
|
#max = 100;
|
|
40
40
|
#size = ProgressRing.DEFAULT_SIZE;
|
|
41
41
|
#thickness = ProgressRing.DEFAULT_THICKNESS;
|
|
42
|
-
#
|
|
42
|
+
#showValue = true;
|
|
43
43
|
#indeterminate = false;
|
|
44
44
|
#label = undefined;
|
|
45
45
|
#format = undefined;
|
|
46
46
|
|
|
47
|
-
constructor(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
constructor(
|
|
48
|
+
options = {
|
|
49
|
+
id: String(),
|
|
50
|
+
value: Number(),
|
|
51
|
+
max: Number(),
|
|
52
|
+
size: Number(),
|
|
53
|
+
thickness: Number(),
|
|
54
|
+
showValue: Boolean(),
|
|
55
|
+
indeterminate: Boolean(),
|
|
56
|
+
label: String(),
|
|
57
|
+
color: String(),
|
|
58
|
+
format: undefined,
|
|
59
|
+
}
|
|
60
|
+
) {
|
|
59
61
|
setStyles(__dirname + "/styles.css", "chUiJS_ProgressRing");
|
|
60
62
|
ProgressRing.#counter += 1;
|
|
61
63
|
this.#id = options.id === undefined ? `chui_progress_ring_${ProgressRing.#counter}` : options.id;
|
|
@@ -64,7 +66,7 @@ class ProgressRing {
|
|
|
64
66
|
if (options.max !== undefined) this.#max = options.max;
|
|
65
67
|
if (options.size !== undefined) this.#size = options.size;
|
|
66
68
|
if (options.thickness !== undefined) this.#thickness = options.thickness;
|
|
67
|
-
this.#
|
|
69
|
+
this.#showValue = options.showValue !== false;
|
|
68
70
|
this.#format = options.format;
|
|
69
71
|
this.#build();
|
|
70
72
|
if (options.color !== undefined) this.setColor(options.color);
|
|
@@ -109,7 +111,7 @@ class ProgressRing {
|
|
|
109
111
|
}
|
|
110
112
|
|
|
111
113
|
isValueVisible() {
|
|
112
|
-
return this.#
|
|
114
|
+
return this.#showValue;
|
|
113
115
|
}
|
|
114
116
|
|
|
115
117
|
// SET
|
|
@@ -147,7 +149,7 @@ class ProgressRing {
|
|
|
147
149
|
|
|
148
150
|
/** Показывать ли процент внутри кольца */
|
|
149
151
|
setShowValue(visible = Boolean()) {
|
|
150
|
-
this.#
|
|
152
|
+
this.#showValue = visible === true;
|
|
151
153
|
this.#render();
|
|
152
154
|
return this;
|
|
153
155
|
}
|
|
@@ -200,13 +202,13 @@ class ProgressRing {
|
|
|
200
202
|
this.#track.setAttribute("cx", "50");
|
|
201
203
|
this.#track.setAttribute("cy", "50");
|
|
202
204
|
this.#track.setAttribute("r", "45");
|
|
203
|
-
this.#
|
|
204
|
-
this.#
|
|
205
|
-
this.#
|
|
206
|
-
this.#
|
|
207
|
-
this.#
|
|
205
|
+
this.#valueArc = document.createElementNS(namespace, "circle");
|
|
206
|
+
this.#valueArc.setAttribute("class", "progress_ring_value");
|
|
207
|
+
this.#valueArc.setAttribute("cx", "50");
|
|
208
|
+
this.#valueArc.setAttribute("cy", "50");
|
|
209
|
+
this.#valueArc.setAttribute("r", "45");
|
|
208
210
|
this.#svg.appendChild(this.#track);
|
|
209
|
-
this.#svg.appendChild(this.#
|
|
211
|
+
this.#svg.appendChild(this.#valueArc);
|
|
210
212
|
this.#text.setAttribute("aria-hidden", "true");
|
|
211
213
|
this.#root.appendChild(this.#svg);
|
|
212
214
|
this.#root.appendChild(this.#text);
|
|
@@ -228,13 +230,13 @@ class ProgressRing {
|
|
|
228
230
|
const radius = 50 - thickness / 2;
|
|
229
231
|
this.#svg.style.setProperty("--progress_ring_thickness", String(thickness));
|
|
230
232
|
this.#track.setAttribute("r", String(radius));
|
|
231
|
-
this.#
|
|
233
|
+
this.#valueArc.setAttribute("r", String(radius));
|
|
232
234
|
// Длина окружности: dasharray — периметр, dashoffset — доля от него.
|
|
233
235
|
// У неопределённого прогресса дуга фиксированной длины, а крутит её CSS-анимация
|
|
234
236
|
const circuit = 2 * Math.PI * radius;
|
|
235
|
-
this.#
|
|
236
|
-
this.#
|
|
237
|
-
this.#text.hidden = !this.#
|
|
237
|
+
this.#valueArc.style.strokeDasharray = this.#indeterminate ? "60 230" : String(circuit);
|
|
238
|
+
this.#valueArc.style.strokeDashoffset = this.#indeterminate ? "0" : String(circuit * (1 - this.getRatio()));
|
|
239
|
+
this.#text.hidden = !this.#showValue;
|
|
238
240
|
this.#text.innerText = this.#indeterminate ? "" : this.#valueText();
|
|
239
241
|
this.#root.setAttribute("aria-valuemin", String(0));
|
|
240
242
|
this.#root.setAttribute("aria-valuemax", String(this.#max));
|
|
@@ -244,4 +246,4 @@ class ProgressRing {
|
|
|
244
246
|
}
|
|
245
247
|
}
|
|
246
248
|
|
|
247
|
-
exports.ProgressRing = ProgressRing
|
|
249
|
+
exports.ProgressRing = ProgressRing;
|
|
@@ -34,7 +34,7 @@ chui_progress_ring {
|
|
|
34
34
|
.progress_ring_value {
|
|
35
35
|
stroke: var(--progress_ring_color);
|
|
36
36
|
stroke-linecap: round;
|
|
37
|
-
transition: stroke-dashoffset
|
|
37
|
+
transition: stroke-dashoffset var(--motion_base) var(--motion_ease);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
chui_progress_ring.progress_ring_indeterminate .progress_ring_value {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const { setStyles, optionOr } = require(
|
|
2
|
-
const { QR } = require(
|
|
3
|
-
const { I18n } = require(
|
|
1
|
+
const { setStyles, optionOr } = require("../../modules/chui_functions");
|
|
2
|
+
const { QR } = require("../../modules/chui_qr/chui_qr");
|
|
3
|
+
const { I18n } = require("../../modules/chui_i18n/chui_i18n");
|
|
4
4
|
|
|
5
5
|
/** Длинное значение не перечисляется в имени кода — там остаётся только его длина */
|
|
6
6
|
const LONG_VALUE = 64;
|
|
@@ -64,20 +64,31 @@ class QRCode {
|
|
|
64
64
|
#margin = QRCode.DEFAULT_MARGIN;
|
|
65
65
|
#level = QR.LEVEL.MEDIUM;
|
|
66
66
|
#mode = QR.MODE.AUTO;
|
|
67
|
-
#
|
|
67
|
+
#minVersion = undefined;
|
|
68
68
|
#mask = undefined;
|
|
69
69
|
#dark = QRCode.DEFAULT_DARK;
|
|
70
70
|
#light = QRCode.DEFAULT_LIGHT;
|
|
71
71
|
#label = undefined;
|
|
72
|
-
#
|
|
72
|
+
#emptyText = undefined;
|
|
73
73
|
#code = undefined;
|
|
74
|
-
#
|
|
74
|
+
#errorMessage = undefined;
|
|
75
75
|
|
|
76
|
-
constructor(
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
constructor(
|
|
77
|
+
options = {
|
|
78
|
+
id: String(),
|
|
79
|
+
value: String(),
|
|
80
|
+
size: Number(),
|
|
81
|
+
margin: Number(),
|
|
82
|
+
level: String(),
|
|
83
|
+
mode: String(),
|
|
84
|
+
minVersion: Number(),
|
|
85
|
+
mask: Number(),
|
|
86
|
+
dark: String(),
|
|
87
|
+
light: String(),
|
|
88
|
+
label: String(),
|
|
89
|
+
emptyText: String(),
|
|
90
|
+
}
|
|
91
|
+
) {
|
|
81
92
|
setStyles(__dirname + "/styles.css", "ChUiJS_QRCode");
|
|
82
93
|
QRCode.#counter += 1;
|
|
83
94
|
this.#id = options.id === undefined ? `chui_qrcode_${QRCode.#counter}` : options.id;
|
|
@@ -87,7 +98,7 @@ class QRCode {
|
|
|
87
98
|
this.#hint.setAttribute("role", "status");
|
|
88
99
|
this.#hint.setAttribute("aria-live", "polite");
|
|
89
100
|
this.#label = options.label;
|
|
90
|
-
this.#
|
|
101
|
+
this.#emptyText = options.emptyText;
|
|
91
102
|
this.#root.appendChild(this.#canvas);
|
|
92
103
|
this.#root.appendChild(this.#hint);
|
|
93
104
|
// Пустая заготовка опции равносильна отсутствующей: `String()` в описании опций
|
|
@@ -97,45 +108,74 @@ class QRCode {
|
|
|
97
108
|
if (optionOr(options.level, undefined) !== undefined) this.#level = QRCode.#toLevel(options.level);
|
|
98
109
|
if (optionOr(options.mode, undefined) !== undefined) this.#mode = QRCode.#toMode(options.mode);
|
|
99
110
|
if (Number.isInteger(Number(options.minVersion)) && Number(options.minVersion) > 0) {
|
|
100
|
-
this.#
|
|
111
|
+
this.#minVersion = QRCode.#toVersion(options.minVersion);
|
|
101
112
|
}
|
|
102
|
-
if (Number.isInteger(Number(options.mask)) && Number(options.mask) >= 0)
|
|
113
|
+
if (Number.isInteger(Number(options.mask)) && Number(options.mask) >= 0)
|
|
114
|
+
this.#mask = QRCode.#toMask(options.mask);
|
|
103
115
|
if (optionOr(options.dark, undefined) !== undefined) this.#dark = String(options.dark);
|
|
104
116
|
if (optionOr(options.light, undefined) !== undefined) this.#light = String(options.light);
|
|
105
117
|
this.setValue(options.value);
|
|
106
118
|
}
|
|
107
119
|
|
|
108
120
|
// GET
|
|
109
|
-
getId() {
|
|
110
|
-
|
|
121
|
+
getId() {
|
|
122
|
+
return this.#id;
|
|
123
|
+
}
|
|
124
|
+
getValue() {
|
|
125
|
+
return this.#value;
|
|
126
|
+
}
|
|
111
127
|
/** Заданная сторона канвы в CSS-пикселях (итоговая может быть меньше на доли модуля) */
|
|
112
|
-
getSize() {
|
|
128
|
+
getSize() {
|
|
129
|
+
return this.#size;
|
|
130
|
+
}
|
|
113
131
|
/** Тихая зона вокруг кода в модулях */
|
|
114
|
-
getMargin() {
|
|
115
|
-
|
|
132
|
+
getMargin() {
|
|
133
|
+
return this.#margin;
|
|
134
|
+
}
|
|
135
|
+
getLevel() {
|
|
136
|
+
return this.#level;
|
|
137
|
+
}
|
|
116
138
|
/** Режим готового кода: при `AUTO` — тот, что подобрался под строку */
|
|
117
|
-
getMode() {
|
|
118
|
-
|
|
139
|
+
getMode() {
|
|
140
|
+
return this.#code === undefined ? this.#mode : this.#code.mode;
|
|
141
|
+
}
|
|
142
|
+
getMinVersion() {
|
|
143
|
+
return this.#minVersion;
|
|
144
|
+
}
|
|
119
145
|
/** Маска готового кода (0…7); без кода — заданная опция или `undefined` при автоподборе */
|
|
120
|
-
getMask() {
|
|
146
|
+
getMask() {
|
|
147
|
+
return this.#code === undefined ? this.#mask : this.#code.mask;
|
|
148
|
+
}
|
|
121
149
|
/** Цвета кода: тёмные модули и поле */
|
|
122
|
-
getColors() {
|
|
123
|
-
|
|
150
|
+
getColors() {
|
|
151
|
+
return { dark: this.#dark, light: this.#light };
|
|
152
|
+
}
|
|
153
|
+
getCanvas() {
|
|
154
|
+
return this.#canvas;
|
|
155
|
+
}
|
|
124
156
|
/** Описание готового кода: `{version, size, mask, level, mode, length}` или `undefined` */
|
|
125
157
|
getCode() {
|
|
126
158
|
if (this.#code === undefined) return undefined;
|
|
127
159
|
return {
|
|
128
|
-
version: this.#code.version,
|
|
129
|
-
|
|
160
|
+
version: this.#code.version,
|
|
161
|
+
size: this.#code.size,
|
|
162
|
+
mask: this.#code.mask,
|
|
163
|
+
level: this.#code.level,
|
|
164
|
+
mode: this.#code.mode,
|
|
165
|
+
length: this.#code.length,
|
|
130
166
|
};
|
|
131
167
|
}
|
|
132
|
-
getVersion() {
|
|
168
|
+
getVersion() {
|
|
169
|
+
return this.#code === undefined ? undefined : this.#code.version;
|
|
170
|
+
}
|
|
133
171
|
/** Модули готового кода: `matrix[y][x] === true` — тёмный модуль */
|
|
134
172
|
getMatrix() {
|
|
135
173
|
return this.#code === undefined ? undefined : this.#code.matrix.map((row) => row.slice());
|
|
136
174
|
}
|
|
137
175
|
/** Текст незаданного состояния или ошибки; `undefined`, если код построен */
|
|
138
|
-
getError() {
|
|
176
|
+
getError() {
|
|
177
|
+
return this.#errorMessage;
|
|
178
|
+
}
|
|
139
179
|
|
|
140
180
|
// SET
|
|
141
181
|
setId(id = String()) {
|
|
@@ -175,7 +215,7 @@ class QRCode {
|
|
|
175
215
|
}
|
|
176
216
|
/** Наименьшая версия кода; `undefined` — подбирать самому */
|
|
177
217
|
setMinVersion(version = undefined) {
|
|
178
|
-
this.#
|
|
218
|
+
this.#minVersion = version === undefined || version === "" ? undefined : QRCode.#toVersion(version);
|
|
179
219
|
this.#render();
|
|
180
220
|
return this;
|
|
181
221
|
}
|
|
@@ -200,7 +240,7 @@ class QRCode {
|
|
|
200
240
|
}
|
|
201
241
|
/** Текст подсказки при пустом значении */
|
|
202
242
|
setEmptyText(text = String()) {
|
|
203
|
-
this.#
|
|
243
|
+
this.#emptyText = text;
|
|
204
244
|
this.#render();
|
|
205
245
|
return this;
|
|
206
246
|
}
|
|
@@ -213,7 +253,9 @@ class QRCode {
|
|
|
213
253
|
toDataURL(type = "image/png", quality = undefined) {
|
|
214
254
|
return this.#canvas.toDataURL(type, quality);
|
|
215
255
|
}
|
|
216
|
-
set() {
|
|
256
|
+
set() {
|
|
257
|
+
return this.#root;
|
|
258
|
+
}
|
|
217
259
|
|
|
218
260
|
// === ОТРИСОВКА ===
|
|
219
261
|
#render() {
|
|
@@ -221,12 +263,12 @@ class QRCode {
|
|
|
221
263
|
if (String(value).trim() === "") {
|
|
222
264
|
this.#code = undefined;
|
|
223
265
|
this.#clear();
|
|
224
|
-
this.#setHint(this.#
|
|
266
|
+
this.#setHint(this.#emptyText === undefined ? I18n.t("graphics.qrEmpty") : this.#emptyText);
|
|
225
267
|
this.#setLabel(I18n.t("graphics.qrLabel"));
|
|
226
268
|
return this;
|
|
227
269
|
}
|
|
228
|
-
const options = {level: this.#level, mode: this.#mode};
|
|
229
|
-
if (this.#
|
|
270
|
+
const options = { level: this.#level, mode: this.#mode };
|
|
271
|
+
if (this.#minVersion !== undefined) options.minVersion = this.#minVersion;
|
|
230
272
|
if (this.#mask !== undefined) options.mask = this.#mask;
|
|
231
273
|
const result = QR.encode(value, options);
|
|
232
274
|
if (result.ok !== true) {
|
|
@@ -292,7 +334,7 @@ class QRCode {
|
|
|
292
334
|
}
|
|
293
335
|
|
|
294
336
|
#setHint(text) {
|
|
295
|
-
this.#
|
|
337
|
+
this.#errorMessage = text === "" ? undefined : text;
|
|
296
338
|
this.#hint.innerText = text;
|
|
297
339
|
return this;
|
|
298
340
|
}
|
|
@@ -306,8 +348,8 @@ class QRCode {
|
|
|
306
348
|
/** Имя кода: короткое значение перечисляется, длинное — только по длине */
|
|
307
349
|
static #valueLabel(value = String()) {
|
|
308
350
|
return value.length <= LONG_VALUE
|
|
309
|
-
? I18n.t("graphics.qrValue", {value: value})
|
|
310
|
-
: I18n.t("graphics.qrLongValue", {length: value.length});
|
|
351
|
+
? I18n.t("graphics.qrValue", { value: value })
|
|
352
|
+
: I18n.t("graphics.qrLongValue", { length: value.length });
|
|
311
353
|
}
|
|
312
354
|
|
|
313
355
|
/** Ошибка генератора словами словаря: пустое значение сюда не доходит */
|
|
@@ -315,11 +357,12 @@ class QRCode {
|
|
|
315
357
|
if (error.code === "tooLong") {
|
|
316
358
|
const bytes = error.mode === QR.MODE.BYTE;
|
|
317
359
|
return I18n.t(bytes ? "graphics.qrTooLongBytes" : "graphics.qrTooLongChars", {
|
|
318
|
-
needed: error.needed,
|
|
360
|
+
needed: error.needed,
|
|
361
|
+
capacity: error.capacity,
|
|
319
362
|
});
|
|
320
363
|
}
|
|
321
364
|
if (error.code === "mode") {
|
|
322
|
-
return I18n.t("graphics.qrModeMismatch", {mode: I18n.t(`graphics.qrMode.${error.mode}`)});
|
|
365
|
+
return I18n.t("graphics.qrModeMismatch", { mode: I18n.t(`graphics.qrMode.${error.mode}`) });
|
|
323
366
|
}
|
|
324
367
|
return I18n.t("graphics.qrEmpty");
|
|
325
368
|
}
|
|
@@ -357,9 +400,10 @@ class QRCode {
|
|
|
357
400
|
|
|
358
401
|
static #toVersion(version = Number()) {
|
|
359
402
|
const value = Number(version);
|
|
360
|
-
if (!Number.isInteger(value) || value < 1 || value > 40)
|
|
403
|
+
if (!Number.isInteger(value) || value < 1 || value > 40)
|
|
404
|
+
throw new RangeError("QRCode: версия вне диапазона 1…40");
|
|
361
405
|
return value;
|
|
362
406
|
}
|
|
363
407
|
}
|
|
364
408
|
|
|
365
|
-
exports.QRCode = QRCode
|
|
409
|
+
exports.QRCode = QRCode;
|